Merge "Make APIs to get global search provider public" into jb-dev
diff --git a/api/16.txt b/api/16.txt
index a04faf0..1fc3b54 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -24979,7 +24979,7 @@
     method public void setMimeType(java.lang.String);
   }
 
-  public class WebSettings {
+  public abstract class WebSettings {
     method public boolean enableSmoothTransition();
     method public boolean getAllowContentAccess();
     method public boolean getAllowFileAccess();
diff --git a/api/current.txt b/api/current.txt
index 2633a0b..921ff0b 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2601,6 +2601,7 @@
     method public void finish();
     method public void finishActivity(int);
     method public void finishActivityFromChild(android.app.Activity, int);
+    method public void finishAffinity();
     method public void finishFromChild(android.app.Activity);
     method public android.app.ActionBar getActionBar();
     method public final android.app.Application getApplication();
@@ -5715,7 +5716,7 @@
     field public static final java.lang.String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
     field public static final java.lang.String ACTION_VIEW = "android.intent.action.VIEW";
     field public static final java.lang.String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
-    field public static final java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
+    field public static final deprecated java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
     field public static final java.lang.String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
     field public static final java.lang.String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
     field public static final java.lang.String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER";
@@ -11078,15 +11079,20 @@
     method public boolean hasCacheReachedEndOfStream();
     method public int readSampleData(java.nio.ByteBuffer, int);
     method public final void release();
-    method public void seekTo(long);
+    method public void seekTo(long, int);
     method public void selectTrack(int);
     method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
     method public final void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
     method public final void setDataSource(java.lang.String);
     method public final void setDataSource(java.io.FileDescriptor);
     method public final void setDataSource(java.io.FileDescriptor, long, long);
+    method public void unselectTrack(int);
     field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
     field public static final int SAMPLE_FLAG_SYNC = 1; // 0x1
+    field public static final int SEEK_TO_CLOSEST = 3; // 0x3
+    field public static final int SEEK_TO_CLOSEST_SYNC = 2; // 0x2
+    field public static final int SEEK_TO_NEXT_SYNC = 1; // 0x1
+    field public static final int SEEK_TO_PREVIOUS_SYNC = 0; // 0x0
   }
 
   public class MediaMetadataRetriever {
@@ -11253,6 +11259,7 @@
 
   public final class MediaRecorder.AudioEncoder {
     field public static final int AAC = 3; // 0x3
+    field public static final int AAC_ELD = 6; // 0x6
     field public static final int AMR_NB = 1; // 0x1
     field public static final int AMR_WB = 2; // 0x2
     field public static final int DEFAULT = 0; // 0x0
@@ -27838,6 +27845,7 @@
 
   public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
     ctor public RemoteViews(java.lang.String, int);
+    ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
     ctor public RemoteViews(android.os.Parcel);
     method public void addView(int, android.widget.RemoteViews);
     method public android.view.View apply(android.content.Context, android.view.ViewGroup);
@@ -27979,7 +27987,11 @@
   public class SearchView extends android.widget.LinearLayout implements android.view.CollapsibleActionView {
     ctor public SearchView(android.content.Context);
     ctor public SearchView(android.content.Context, android.util.AttributeSet);
+    method public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
     method public java.lang.CharSequence getQuery();
+    method public java.lang.CharSequence getQueryHint();
     method public android.widget.CursorAdapter getSuggestionsAdapter();
     method public boolean isIconfiedByDefault();
     method public boolean isIconified();
diff --git a/cmds/svc/src/com/android/commands/svc/Svc.java b/cmds/svc/src/com/android/commands/svc/Svc.java
index 1cd4c0d..0fbba11 100644
--- a/cmds/svc/src/com/android/commands/svc/Svc.java
+++ b/cmds/svc/src/com/android/commands/svc/Svc.java
@@ -94,6 +94,7 @@
             COMMAND_HELP,
             new PowerCommand(),
             new DataCommand(),
-            new WifiCommand()
+            new WifiCommand(),
+            new UsbCommand()
     };
 }
diff --git a/cmds/svc/src/com/android/commands/svc/UsbCommand.java b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
new file mode 100644
index 0000000..b8d8d95
--- /dev/null
+++ b/cmds/svc/src/com/android/commands/svc/UsbCommand.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.commands.svc;
+
+import android.content.Context;;
+import android.hardware.usb.IUsbManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+
+public class UsbCommand extends Svc.Command {
+    public UsbCommand() {
+        super("usb");
+    }
+
+    public String shortHelp() {
+        return "Control Usb state";
+    }
+
+    public String longHelp() {
+        return shortHelp() + "\n"
+                + "\n"
+                + "usage: svc usb setFunction [function]\n"
+                + "         Set the current usb function.\n\n"
+                + "       svc usb getFunction\n"
+                + "          Gets the list of currently enabled functions\n";
+    }
+
+    public void run(String[] args) {
+        boolean validCommand = false;
+        if (args.length >= 2) {
+            if ("setFunction".equals(args[1])) {
+                IUsbManager usbMgr = IUsbManager.Stub.asInterface(ServiceManager.getService(
+                        Context.USB_SERVICE));
+                try {
+                    usbMgr.setCurrentFunction((args.length >=3 ? args[2] : null), false);
+                } catch (RemoteException e) {
+                    System.err.println("Error communicating with UsbManager: " + e);
+                }
+                return;
+            } else if ("getFunction".equals(args[1])) {
+                System.err.println(SystemProperties.get("sys.usb.config"));
+                return;
+            }
+        }
+        System.err.println(longHelp());
+    }
+}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 35bc7ff..ab245f5 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2714,7 +2714,7 @@
                 onCreateNavigateUpTaskStack(b);
                 onPrepareNavigateUpTaskStack(b);
                 b.startActivities();
-                finish();
+                finishAffinity();
             } else {
                 navigateUpTo(upIntent);
             }
@@ -4093,6 +4093,36 @@
     }
 
     /**
+     * Finish this activity as well as all activities immediately below it
+     * in the current task that have the same affinity.  This is typically
+     * used when an application can be launched on to another task (such as
+     * from an ACTION_VIEW of a content type it understands) and the user
+     * has used the up navigation to switch out of the current task and in
+     * to its own task.  In this case, if the user has navigated down into
+     * any other activities of the second application, all of those should
+     * be removed from the original task as part of the task switch.
+     *
+     * <p>Note that this finish does <em>not</em> allow you to deliver results
+     * to the previous activity, and an exception will be thrown if you are trying
+     * to do so.</p>
+     */
+    public void finishAffinity() {
+        if (mParent != null) {
+            throw new IllegalStateException("Can not be called from an embedded activity");
+        }
+        if (mResultCode != RESULT_CANCELED || mResultData != null) {
+            throw new IllegalStateException("Can not be called to deliver a result");
+        }
+        try {
+            if (ActivityManagerNative.getDefault().finishActivityAffinity(mToken)) {
+                mFinished = true;
+            }
+        } catch (RemoteException e) {
+            // Empty
+        }
+    }
+
+    /**
      * This is called when a child activity of this one calls its 
      * {@link #finish} method.  The default implementation simply calls
      * finish() on this activity (the parent), finishing the entire group.
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 11b4c3a..7746ca9 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -502,7 +502,16 @@
     /**
      * Return a list of the tasks that the user has recently launched, with
      * the most recent being first and older ones after in order.
-     * 
+     *
+     * <p><b>Note: this method is only intended for debugging and presenting
+     * task management user interfaces</b>.  This should never be used for
+     * core logic in an application, such as deciding between different
+     * behaviors based on the information found here.  Such uses are
+     * <em>not</em> supported, and will likely break in the future.  For
+     * example, if multiple applications can be actively running at the
+     * same time, assumptions made about the meaning of the data here for
+     * purposes of control flow will be incorrect.</p>
+     *
      * @param maxNum The maximum number of entries to return in the list.  The
      * actual number returned may be smaller, depending on how many tasks the
      * user has started and the maximum number the system can remember.
@@ -669,6 +678,15 @@
      * can be restarted in its previous state when next brought to the
      * foreground.
      *
+     * <p><b>Note: this method is only intended for debugging and presenting
+     * task management user interfaces</b>.  This should never be used for
+     * core logic in an application, such as deciding between different
+     * behaviors based on the information found here.  Such uses are
+     * <em>not</em> supported, and will likely break in the future.  For
+     * example, if multiple applications can be actively running at the
+     * same time, assumptions made about the meaning of the data here for
+     * purposes of control flow will be incorrect.</p>
+     *
      * @param maxNum The maximum number of entries to return in the list.  The
      * actual number returned may be smaller, depending on how many tasks the
      * user has started.
@@ -1016,7 +1034,10 @@
 
     /**
      * Return a list of the services that are currently running.
-     * 
+     *
+     * <p><b>Note: this method is only intended for debugging or implementing
+     * service management type user interfaces.</b></p>
+     *
      * @param maxNum The maximum number of entries to return in the list.  The
      * actual number returned may be smaller, depending on how many services
      * are running.
@@ -1128,6 +1149,16 @@
         }
     }
 
+    /**
+     * Return general information about the memory state of the system.  This
+     * can be used to help decide how to manage your own memory, though note
+     * that polling is not recommended and
+     * {@link android.content.ComponentCallbacks2#onTrimMemory(int)
+     * ComponentCallbacks2.onTrimMemory(int)} is the preferred way to do this.
+     * Also see {@link #getMyMemoryState} for how to retrieve the current trim
+     * level of your process as needed, which gives a better hint for how to
+     * manage its memory.
+     */
     public void getMemoryInfo(MemoryInfo outInfo) {
         try {
             ActivityManagerNative.getDefault().getMemoryInfo(outInfo);
@@ -1497,6 +1528,9 @@
      * Returns a list of application processes installed on external media
      * that are running on the device.
      *
+     * <p><b>Note: this method is only intended for debugging or building
+     * a user-facing process management UI.</b></p>
+     *
      * @return Returns a list of ApplicationInfo records, or null if none
      * This list ordering is not specified.
      * @hide
@@ -1511,7 +1545,10 @@
 
     /**
      * Returns a list of application processes that are running on the device.
-     * 
+     *
+     * <p><b>Note: this method is only intended for debugging or building
+     * a user-facing process management UI.</b></p>
+     *
      * @return Returns a list of RunningAppProcessInfo records, or null if there are no
      * running processes (it will not return an empty list).  This list ordering is not
      * specified.
@@ -1544,7 +1581,10 @@
 
     /**
      * Return information about the memory usage of one or more processes.
-     * 
+     *
+     * <p><b>Note: this method is only intended for debugging or building
+     * a user-facing process management UI.</b></p>
+     *
      * @param pids The pids of the processes whose memory usage is to be
      * retrieved.
      * @return Returns an array of memory information, one for each
@@ -1647,6 +1687,8 @@
                 return DisplayMetrics.DENSITY_MEDIUM;
             case DisplayMetrics.DENSITY_MEDIUM:
                 return DisplayMetrics.DENSITY_HIGH;
+            case DisplayMetrics.DENSITY_TV:
+                return DisplayMetrics.DENSITY_XHIGH;
             case DisplayMetrics.DENSITY_HIGH:
                 return DisplayMetrics.DENSITY_XHIGH;
             case DisplayMetrics.DENSITY_XHIGH:
@@ -1656,7 +1698,7 @@
             default:
                 // The density is some abnormal value.  Return some other
                 // abnormal value that is a reasonable scaling of it.
-                return (int)(density*1.5f);
+                return (int)((density*1.5f)+.5f);
         }
     }
 
@@ -1683,6 +1725,8 @@
                 return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW;
             case DisplayMetrics.DENSITY_MEDIUM:
                 return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM;
+            case DisplayMetrics.DENSITY_TV:
+                return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
             case DisplayMetrics.DENSITY_HIGH:
                 return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH;
             case DisplayMetrics.DENSITY_XHIGH:
@@ -1692,7 +1736,7 @@
             default:
                 // The density is some abnormal value.  Return some other
                 // abnormal value that is a reasonable scaling of it.
-                return (int)(size*1.5f);
+                return (int)((size*1.5f) + .5f);
         }
     }
 
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 7e1589f..2f2918d 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -218,7 +218,7 @@
             reply.writeInt(result ? 1 : 0);
             return true;
         }
-        
+
         case FINISH_ACTIVITY_TRANSACTION: {
             data.enforceInterface(IActivityManager.descriptor);
             IBinder token = data.readStrongBinder();
@@ -243,6 +243,15 @@
             return true;
         }
 
+        case FINISH_ACTIVITY_AFFINITY_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IBinder token = data.readStrongBinder();
+            boolean res = finishActivityAffinity(token);
+            reply.writeNoException();
+            reply.writeInt(res ? 1 : 0);
+            return true;
+        }
+
         case WILL_ACTIVITY_BE_VISIBLE_TRANSACTION: {
             data.enforceInterface(IActivityManager.descriptor);
             IBinder token = data.readStrongBinder();
@@ -1866,6 +1875,18 @@
         data.recycle();
         reply.recycle();
     }
+    public boolean finishActivityAffinity(IBinder token) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(token);
+        mRemote.transact(FINISH_ACTIVITY_AFFINITY_TRANSACTION, data, reply, 0);
+        reply.readException();
+        boolean res = reply.readInt() != 0;
+        data.recycle();
+        reply.recycle();
+        return res;
+    }
     public boolean willActivityBeVisible(IBinder token) throws RemoteException {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index e2e791b..1a46430b 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -61,6 +61,7 @@
 import android.os.ServiceManager;
 import android.os.StrictMode;
 import android.os.SystemClock;
+import android.os.Trace;
 import android.os.UserId;
 import android.util.AndroidRuntimeException;
 import android.util.DisplayMetrics;
@@ -1177,49 +1178,73 @@
             if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);
             switch (msg.what) {
                 case LAUNCH_ACTIVITY: {
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                     ActivityClientRecord r = (ActivityClientRecord)msg.obj;
 
                     r.packageInfo = getPackageInfoNoCheck(
                             r.activityInfo.applicationInfo, r.compatInfo);
                     handleLaunchActivity(r, null);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                 } break;
                 case RELAUNCH_ACTIVITY: {
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
                     ActivityClientRecord r = (ActivityClientRecord)msg.obj;
                     handleRelaunchActivity(r);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                 } break;
                 case PAUSE_ACTIVITY:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                     handlePauseActivity((IBinder)msg.obj, false, msg.arg1 != 0, msg.arg2);
                     maybeSnapshot();
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case PAUSE_ACTIVITY_FINISHING:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
                     handlePauseActivity((IBinder)msg.obj, true, msg.arg1 != 0, msg.arg2);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case STOP_ACTIVITY_SHOW:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                     handleStopActivity((IBinder)msg.obj, true, msg.arg2);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case STOP_ACTIVITY_HIDE:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
                     handleStopActivity((IBinder)msg.obj, false, msg.arg2);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SHOW_WINDOW:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow");
                     handleWindowVisibility((IBinder)msg.obj, true);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case HIDE_WINDOW:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityHideWindow");
                     handleWindowVisibility((IBinder)msg.obj, false);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case RESUME_ACTIVITY:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
                     handleResumeActivity((IBinder)msg.obj, true,
                             msg.arg1 != 0);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SEND_RESULT:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");
                     handleSendResult((ResultData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case DESTROY_ACTIVITY:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
                     handleDestroyActivity((IBinder)msg.obj, msg.arg1 != 0,
                             msg.arg2, false);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case BIND_APPLICATION:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
                     AppBindData data = (AppBindData)msg.obj;
                     handleBindApplication(data);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case EXIT_APPLICATION:
                     if (mInitialApplication != null) {
@@ -1228,33 +1253,51 @@
                     Looper.myLooper().quit();
                     break;
                 case NEW_INTENT:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityNewIntent");
                     handleNewIntent((NewIntentData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case RECEIVER:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
                     handleReceiver((ReceiverData)msg.obj);
                     maybeSnapshot();
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case CREATE_SERVICE:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceCreate");
                     handleCreateService((CreateServiceData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case BIND_SERVICE:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
                     handleBindService((BindServiceData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case UNBIND_SERVICE:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");
                     handleUnbindService((BindServiceData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SERVICE_ARGS:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStart");
                     handleServiceArgs((ServiceArgsData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case STOP_SERVICE:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
                     handleStopService((IBinder)msg.obj);
                     maybeSnapshot();
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case REQUEST_THUMBNAIL:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "requestThumbnail");
                     handleRequestThumbnail((IBinder)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case CONFIGURATION_CHANGED:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");
                     handleConfigurationChanged((Configuration)msg.obj, null);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case CLEAN_UP_CONTEXT:
                     ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;
@@ -1267,31 +1310,43 @@
                     handleDumpService((DumpComponentInfo)msg.obj);
                     break;
                 case LOW_MEMORY:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");
                     handleLowMemory();
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case ACTIVITY_CONFIGURATION_CHANGED:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");
                     handleActivityConfigurationChanged((IBinder)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case PROFILER_CONTROL:
                     handleProfilerControl(msg.arg1 != 0, (ProfilerControlData)msg.obj, msg.arg2);
                     break;
                 case CREATE_BACKUP_AGENT:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");
                     handleCreateBackupAgent((CreateBackupAgentData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case DESTROY_BACKUP_AGENT:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupDestroyAgent");
                     handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SUICIDE:
                     Process.killProcess(Process.myPid());
                     break;
                 case REMOVE_PROVIDER:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "providerRemove");
                     completeRemoveProvider((IContentProvider)msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case ENABLE_JIT:
                     ensureJitEnabled();
                     break;
                 case DISPATCH_PACKAGE_BROADCAST:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage");
                     handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SCHEDULE_CRASH:
                     throw new RemoteServiceException((String)msg.obj);
@@ -1305,16 +1360,22 @@
                     handleDumpProvider((DumpComponentInfo)msg.obj);
                     break;
                 case SLEEPING:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "sleeping");
                     handleSleeping((IBinder)msg.obj, msg.arg1 != 0);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case SET_CORE_SETTINGS:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setCoreSettings");
                     handleSetCoreSettings((Bundle) msg.obj);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
                 case UPDATE_PACKAGE_COMPATIBILITY_INFO:
                     handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);
                     break;
                 case TRIM_MEMORY:
+                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "trimMemory");
                     handleTrimMemory(msg.arg1);
+                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                     break;
             }
             if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + msg.what);
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 0519d3e..7e1daa4 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -1890,7 +1890,7 @@
         if (mActive != null) {
             for (int i=0; i<mAdded.size(); i++) {
                 Fragment f = mAdded.get(i);
-                if (f != null && !f.mHidden) {
+                if (f != null && !f.mHidden && f.mUserVisibleHint) {
                     if (f.onContextItemSelected(item)) {
                         return true;
                     }
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 3fc2280..a2c7fa4 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -72,6 +72,7 @@
     public boolean finishActivity(IBinder token, int code, Intent data)
             throws RemoteException;
     public void finishSubActivity(IBinder token, String resultWho, int requestCode) throws RemoteException;
+    public boolean finishActivityAffinity(IBinder token) throws RemoteException;
     public boolean willActivityBeVisible(IBinder token) throws RemoteException;
     public Intent registerReceiver(IApplicationThread caller, String callerPackage,
             IIntentReceiver receiver, IntentFilter filter,
@@ -590,4 +591,5 @@
     int TARGET_TASK_AFFINITY_MATCHES_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+145;
     int NAVIGATE_UP_TO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+146;
     int SET_LOCK_SCREEN_SHOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+147;
+    int FINISH_ACTIVITY_AFFINITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+148;
 }
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 8ab1ed6..be4b284 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -36,6 +36,7 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.StrictMode;
+import android.os.Trace;
 import android.os.UserId;
 import android.util.AndroidRuntimeException;
 import android.util.Slog;
@@ -745,6 +746,7 @@
                     return;
                 }
 
+                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveReg");
                 try {
                     ClassLoader cl =  mReceiver.getClass().getClassLoader();
                     intent.setExtrasClassLoader(cl);
@@ -759,6 +761,7 @@
                     }
                     if (mInstrumentation == null ||
                             !mInstrumentation.onException(mReceiver, e)) {
+                        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                         throw new RuntimeException(
                             "Error receiving broadcast " + intent
                             + " in " + mReceiver, e);
@@ -768,6 +771,7 @@
                 if (receiver.getPendingResult() != null) {
                     finish();
                 }
+                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
             }
         }
 
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 6f19934..3824f44 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -637,6 +637,14 @@
      * wallpaper it would like to use.  This allows such applications to have
      * a virtual wallpaper that is larger than the physical screen, matching
      * the size of their workspace.
+     *
+     * <p>Note developers, who don't seem to be reading this.  This is
+     * for <em>home screens</em> to tell what size wallpaper they would like.
+     * Nobody else should be calling this!  Certainly not other non-home-screen
+     * apps that change the wallpaper.  Those apps are supposed to
+     * <b>retrieve</b> the suggested size so they can construct a wallpaper
+     * that matches it.
+     *
      * @param minimumWidth Desired minimum width
      * @param minimumHeight Desired minimum height
      */
diff --git a/core/java/android/content/ComponentCallbacks2.java b/core/java/android/content/ComponentCallbacks2.java
index 85294dd..a3b4e5e 100644
--- a/core/java/android/content/ComponentCallbacks2.java
+++ b/core/java/android/content/ComponentCallbacks2.java
@@ -88,7 +88,11 @@
      * should never compare to exact values of the level, since new intermediate
      * values may be added -- you will typically want to compare if the value
      * is greater or equal to a level you are interested in.
-     * 
+     *
+     * <p>To retrieve the processes current trim level at any point, you can
+     * use {@link android.app.ActivityManager#getMyMemoryState
+     * ActivityManager.getMyMemoryState(RunningAppProcessInfo)}.
+     *
      * @param level The context of the trim, giving a hint of the amount of
      * trimming the application may like to perform.  May be
      * {@link #TRIM_MEMORY_COMPLETE}, {@link #TRIM_MEMORY_MODERATE},
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 6653336..d0d9bd6 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1624,8 +1624,20 @@
     /**
      * Broadcast Action:  The current system wallpaper has changed.  See
      * {@link android.app.WallpaperManager} for retrieving the new wallpaper.
+     * This should <em>only</em> be used to determine when the wallpaper
+     * has changed to show the new wallpaper to the user.  You should certainly
+     * never, in response to this, change the wallpaper or other attributes of
+     * it such as the suggested size.  That would be crazy, right?  You'd cause
+     * all kinds of loops, especially if other apps are doing similar things,
+     * right?  Of course.  So please don't do this.
+     *
+     * @deprecated Modern applications should use
+     * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WALLPAPER
+     * WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER} to have the wallpaper
+     * shown behind their UI, rather than watching for this broadcast and
+     * rendering the wallpaper on their own.
      */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    @Deprecated @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
     /**
      * Broadcast Action: The current device {@link android.content.res.Configuration}
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 4645fab..2a45506 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -34,6 +34,8 @@
     public static final long TRACE_TAG_INPUT = 1L << 2;
     public static final long TRACE_TAG_VIEW = 1L << 3;
     public static final long TRACE_TAG_WEBVIEW = 1L << 4;
+    public static final long TRACE_TAG_WINDOW_MANAGER = 1L << 5;
+    public static final long TRACE_TAG_ACTIVITY_MANAGER = 1L << 6;
 
     private static final long sEnabledTags = nativeGetEnabledTags();
 
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 7d41e64..2782dca 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -3049,6 +3049,13 @@
      * requires android.permission.READ_SOCIAL_STREAM permission, and inserting or updating social
      * stream items requires android.permission.WRITE_SOCIAL_STREAM permission.
      * </p>
+     * <h3>Account check</h3>
+     * <p>
+     * The content URIs to the insert, update and delete operations are required to have the account
+     * information matching that of the owning raw contact as query parameters, namely
+     * {@link RawContacts#ACCOUNT_TYPE} and {@link RawContacts#ACCOUNT_NAME}.
+     * {@link RawContacts#DATA_SET} isn't required.
+     * </p>
      * <h3>Operations</h3>
      * <dl>
      * <dt><b>Insert</b></dt>
@@ -3063,9 +3070,12 @@
      * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
      * values.put(StreamItems.TIMESTAMP, timestamp);
      * values.put(StreamItems.COMMENTS, "3 people reshared this");
-     * Uri streamItemUri = getContentResolver().insert(
-     *     Uri.withAppendedPath(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId),
-     *         RawContacts.StreamItems.CONTENT_DIRECTORY), values);
+     * Uri.Builder builder = RawContacts.CONTENT_URI.buildUpon();
+     * ContentUris.appendId(builder, rawContactId);
+     * builder.appendEncodedPath(RawContacts.StreamItems.CONTENT_DIRECTORY);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * Uri streamItemUri = getContentResolver().insert(builder.build(), values);
      * long streamItemId = ContentUris.parseId(streamItemUri);
      * </pre>
      * </dd>
@@ -3077,7 +3087,10 @@
      * values.put(StreamItems.TEXT, "Breakfasted at Tiffanys");
      * values.put(StreamItems.TIMESTAMP, timestamp);
      * values.put(StreamItems.COMMENTS, "3 people reshared this");
-     * Uri streamItemUri = getContentResolver().insert(StreamItems.CONTENT_URI, values);
+     * Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * Uri streamItemUri = getContentResolver().insert(builder.build(), values);
      * long streamItemId = ContentUris.parseId(streamItemUri);
      *</pre>
      * </dd>
@@ -3410,6 +3423,13 @@
      * requires android.permission.READ_SOCIAL_STREAM permission, and inserting or updating
      * social stream photos requires android.permission.WRITE_SOCIAL_STREAM permission.
      * </p>
+     * <h3>Account check</h3>
+     * <p>
+     * The content URIs to the insert, update and delete operations are required to have the account
+     * information matching that of the owning raw contact as query parameters, namely
+     * {@link RawContacts#ACCOUNT_TYPE} and {@link RawContacts#ACCOUNT_NAME}.
+     * {@link RawContacts#DATA_SET} isn't required.
+     * </p>
      * <h3>Operations</h3>
      * <dl>
      * <dt><b>Insert</b></dt>
@@ -3426,9 +3446,12 @@
      * ContentValues values = new ContentValues();
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * Uri photoUri = getContentResolver().insert(Uri.withAppendedPath(
-     *     ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId)
-     *     StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), values);
+     * Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+     * ContentUris.appendId(builder, streamItemId);
+     * builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * Uri photoUri = getContentResolver().insert(builder.build(), values);
      * long photoId = ContentUris.parseId(photoUri);
      * </pre>
      * </dd>
@@ -3439,7 +3462,10 @@
      * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId);
      * values.put(StreamItemPhotos.SORT_INDEX, 1);
      * values.put(StreamItemPhotos.PHOTO, photoData);
-     * Uri photoUri = getContentResolver().insert(StreamItems.CONTENT_PHOTO_URI, values);
+     * Uri.Builder builder = StreamItems.CONTENT_PHOTO_URI.buildUpon();
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * Uri photoUri = getContentResolver().insert(builder.build(), values);
      * long photoId = ContentUris.parseId(photoUri);
      * </pre>
      * </dd>
@@ -3459,12 +3485,13 @@
      * <pre>
      * ContentValues values = new ContentValues();
      * values.put(StreamItemPhotos.PHOTO, newPhotoData);
-     * getContentResolver().update(
-     *     ContentUris.withAppendedId(
-     *         Uri.withAppendedPath(
-     *             ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId)
-     *             StreamItems.StreamItemPhotos#CONTENT_DIRECTORY),
-     *         streamItemPhotoId), values, null, null);
+     * Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+     * ContentUris.appendId(builder, streamItemId);
+     * builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+     * ContentUris.appendId(builder, streamItemPhotoId);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * getContentResolver().update(builder.build(), values, null, null);
      * </pre>
      * </dd>
      * <dt>Via the {@link ContactsContract.StreamItems#CONTENT_PHOTO_URI} URI:</dt>
@@ -3473,7 +3500,10 @@
      * ContentValues values = new ContentValues();
      * values.put(StreamItemPhotos.STREAM_ITEM_ID, streamItemId);
      * values.put(StreamItemPhotos.PHOTO, newPhotoData);
-     * getContentResolver().update(StreamItems.CONTENT_PHOTO_URI, values);
+     * Uri.Builder builder = StreamItems.CONTENT_PHOTO_URI.buildUpon();
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * getContentResolver().update(builder.build(), values);
      * </pre>
      * </dd>
      * </dl>
@@ -3489,21 +3519,24 @@
      * </dt>
      * <dd>
      * <pre>
-     * getContentResolver().delete(
-     *     ContentUris.withAppendedId(
-     *         Uri.withAppendedPath(
-     *             ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId)
-     *             StreamItems.StreamItemPhotos#CONTENT_DIRECTORY),
-     *         streamItemPhotoId), null, null);
+     * Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+     * ContentUris.appendId(builder, streamItemId);
+     * builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+     * ContentUris.appendId(builder, streamItemPhotoId);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * getContentResolver().delete(builder.build(), null, null);
      * </pre>
      * </dd>
      * <dt>Deleting all photos under a stream item</dt>
      * <dd>
      * <pre>
-     * getContentResolver().delete(
-     *     Uri.withAppendedPath(
-     *         ContentUris.withAppendedId(StreamItems.CONTENT_URI, streamItemId)
-     *         StreamItems.StreamItemPhotos#CONTENT_DIRECTORY), null, null);
+     * Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+     * ContentUris.appendId(builder, streamItemId);
+     * builder.appendEncodedPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName);
+     * builder.appendQueryParameter(RawContacts.ACCOUNT_TYPE, accountType);
+     * getContentResolver().delete(builder.build(), null, null);
      * </pre>
      * </dd>
      * </dl>
@@ -5411,8 +5444,9 @@
 
             /**
              * The phone number's E164 representation. This value can be omitted in which
-             * case the provider will try to automatically infer it. If present, {@link #NUMBER}
-             * has to be set as well (it will be ignored otherwise).
+             * case the provider will try to automatically infer it.  (It'll be left null if the
+             * provider fails to infer.)
+             * If present, {@link #NUMBER} has to be set as well (it will be ignored otherwise).
              * <P>Type: TEXT</P>
              */
             public static final String NORMALIZED_NUMBER = DATA4;
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3a5fdd1..2c49bd2 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3270,6 +3270,12 @@
         public static final String WIFI_FREQUENCY_BAND = "wifi_frequency_band";
 
         /**
+         * The Wi-Fi peer-to-peer device name
+         * @hide
+         */
+        public static final String WIFI_P2P_DEVICE_NAME = "wifi_p2p_device_name";
+
+        /**
          * Maximum amount of time in milliseconds to hold a wakelock while waiting for mobile
          * data connectivity to be established after a disconnect from Wi-Fi.
          */
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java
index c4cb3a5..300bc68 100644
--- a/core/java/android/server/BluetoothA2dpService.java
+++ b/core/java/android/server/BluetoothA2dpService.java
@@ -588,6 +588,8 @@
 
     @Override
     protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         if (mAudioDevices.isEmpty()) return;
         pw.println("Cached audio devices:");
         for (BluetoothDevice device : mAudioDevices.keySet()) {
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index 7a97455..a420734 100755
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -1775,6 +1775,8 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         if (getBluetoothStateInternal() != BluetoothAdapter.STATE_ON) {
             return;
         }
diff --git a/core/java/android/service/dreams/DreamManagerService.java b/core/java/android/service/dreams/DreamManagerService.java
index 8712fa2..4a14ced 100644
--- a/core/java/android/service/dreams/DreamManagerService.java
+++ b/core/java/android/service/dreams/DreamManagerService.java
@@ -169,6 +169,8 @@
     
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         pw.println("Dreamland:");
         pw.print("  component="); pw.println(mCurrentDreamComponent);
         pw.print("  token="); pw.println(mCurrentDreamToken);
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 2dcea80..c453a5d 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -45,8 +45,7 @@
     private static final ParagraphStyle[] NO_PARA_SPANS =
         ArrayUtils.emptyArray(ParagraphStyle.class);
 
-    /* package */ static final EmojiFactory EMOJI_FACTORY =
-        EmojiFactory.newAvailableInstance();
+    /* package */ static final EmojiFactory EMOJI_FACTORY = EmojiFactory.newAvailableInstance();
     /* package */ static final int MIN_EMOJI, MAX_EMOJI;
 
     static {
@@ -363,15 +362,15 @@
         // direction of the layout or line.  XXX: Should they?
         // They are evaluated at each line.
         if (mSpannedText) {
-            if (lineBackgroundSpans == null) {
-                lineBackgroundSpans = new SpanSet<LineBackgroundSpan>(LineBackgroundSpan.class);
+            if (mLineBackgroundSpans == null) {
+                mLineBackgroundSpans = new SpanSet<LineBackgroundSpan>(LineBackgroundSpan.class);
             }
 
             Spanned buffer = (Spanned) mText;
             int textLength = buffer.length();
-            lineBackgroundSpans.init(buffer, 0, textLength);
+            mLineBackgroundSpans.init(buffer, 0, textLength);
 
-            if (lineBackgroundSpans.numberOfSpans > 0) {
+            if (mLineBackgroundSpans.numberOfSpans > 0) {
                 int previousLineBottom = getLineTop(firstLine);
                 int previousLineEnd = getLineStart(firstLine);
                 ParagraphStyle[] spans = NO_PARA_SPANS;
@@ -392,17 +391,18 @@
                     if (start >= spanEnd) {
                         // These should be infrequent, so we'll use this so that
                         // we don't have to check as often.
-                        spanEnd = lineBackgroundSpans.getNextTransition(start, textLength);
+                        spanEnd = mLineBackgroundSpans.getNextTransition(start, textLength);
                         // All LineBackgroundSpans on a line contribute to its background.
                         spansLength = 0;
                         // Duplication of the logic of getParagraphSpans
                         if (start != end || start == 0) {
                             // Equivalent to a getSpans(start, end), but filling the 'spans' local
                             // array instead to reduce memory allocation
-                            for (int j = 0; j < lineBackgroundSpans.numberOfSpans; j++) {
-                                // equal test is valid since both intervals are not empty by construction
-                                if (lineBackgroundSpans.spanStarts[j] >= end ||
-                                        lineBackgroundSpans.spanEnds[j] <= start) continue;
+                            for (int j = 0; j < mLineBackgroundSpans.numberOfSpans; j++) {
+                                // equal test is valid since both intervals are not empty by
+                                // construction
+                                if (mLineBackgroundSpans.spanStarts[j] >= end ||
+                                        mLineBackgroundSpans.spanEnds[j] <= start) continue;
                                 if (spansLength == spans.length) {
                                     // The spans array needs to be expanded
                                     int newSize = ArrayUtils.idealObjectArraySize(2 * spansLength);
@@ -410,7 +410,7 @@
                                     System.arraycopy(spans, 0, newSpans, 0, spansLength);
                                     spans = newSpans;
                                 }
-                                spans[spansLength++] = lineBackgroundSpans.spans[j];
+                                spans[spansLength++] = mLineBackgroundSpans.spans[j];
                             }
                         }
                     }
@@ -423,7 +423,7 @@
                     }
                 }
             }
-            lineBackgroundSpans.recycle();
+            mLineBackgroundSpans.recycle();
         }
 
         // There can be a highlight even without spans if we are drawing
@@ -1687,7 +1687,7 @@
      * styles that are already applied to the buffer will apply to text that
      * is inserted into it.
      */
-    /* package */ static <T> T[] getParagraphSpans(Spanned text, int start, int end, Class<T> type) {
+    /* package */static <T> T[] getParagraphSpans(Spanned text, int start, int end, Class<T> type) {
         if (start == end && start > 0) {
             return ArrayUtils.emptyArray(type);
         }
@@ -1857,7 +1857,7 @@
     private static final Rect sTempRect = new Rect();
     private boolean mSpannedText;
     private TextDirectionHeuristic mTextDir;
-    private SpanSet<LineBackgroundSpan> lineBackgroundSpans;
+    private SpanSet<LineBackgroundSpan> mLineBackgroundSpans;
 
     public static final int DIR_LEFT_TO_RIGHT = 1;
     public static final int DIR_RIGHT_TO_LEFT = -1;
diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java
index 1c61c6c..5b371eb 100644
--- a/core/java/android/view/KeyCharacterMap.java
+++ b/core/java/android/view/KeyCharacterMap.java
@@ -153,20 +153,26 @@
     private static final int ACCENT_BREVE = '\u02D8';
     private static final int ACCENT_CARON = '\u02C7';
     private static final int ACCENT_CEDILLA = '\u00B8';
+    private static final int ACCENT_CIRCUMFLEX = '\u02C6';
     private static final int ACCENT_COMMA_ABOVE = '\u1FBD';
     private static final int ACCENT_COMMA_ABOVE_RIGHT = '\u02BC';
     private static final int ACCENT_DOT_ABOVE = '\u02D9';
+    private static final int ACCENT_DOT_BELOW = '.'; // approximate
     private static final int ACCENT_DOUBLE_ACUTE = '\u02DD';
     private static final int ACCENT_GRAVE = '\u02CB';
-    private static final int ACCENT_CIRCUMFLEX = '\u02C6';
+    private static final int ACCENT_HOOK_ABOVE = '\u02C0';
+    private static final int ACCENT_HORN = '\''; // approximate
     private static final int ACCENT_MACRON = '\u00AF';
     private static final int ACCENT_MACRON_BELOW = '\u02CD';
     private static final int ACCENT_OGONEK = '\u02DB';
     private static final int ACCENT_REVERSED_COMMA_ABOVE = '\u02BD';
     private static final int ACCENT_RING_ABOVE = '\u02DA';
+    private static final int ACCENT_STROKE = '-'; // approximate
     private static final int ACCENT_TILDE = '\u02DC';
     private static final int ACCENT_TURNED_COMMA_ABOVE = '\u02BB';
     private static final int ACCENT_UMLAUT = '\u00A8';
+    private static final int ACCENT_VERTICAL_LINE_ABOVE = '\u02C8';
+    private static final int ACCENT_VERTICAL_LINE_BELOW = '\u02CC';
 
     /* Legacy dead key display characters used in previous versions of the API.
      * We still support these characters by mapping them to their non-legacy version. */
@@ -188,11 +194,11 @@
         addCombining('\u0306', ACCENT_BREVE);
         addCombining('\u0307', ACCENT_DOT_ABOVE);
         addCombining('\u0308', ACCENT_UMLAUT);
-        //addCombining('\u0309', ACCENT_HOOK_ABOVE);
+        addCombining('\u0309', ACCENT_HOOK_ABOVE);
         addCombining('\u030A', ACCENT_RING_ABOVE);
         addCombining('\u030B', ACCENT_DOUBLE_ACUTE);
         addCombining('\u030C', ACCENT_CARON);
-        //addCombining('\u030D', ACCENT_VERTICAL_LINE_ABOVE);
+        addCombining('\u030D', ACCENT_VERTICAL_LINE_ABOVE);
         //addCombining('\u030E', ACCENT_DOUBLE_VERTICAL_LINE_ABOVE);
         //addCombining('\u030F', ACCENT_DOUBLE_GRAVE);
         //addCombining('\u0310', ACCENT_CANDRABINDU);
@@ -201,13 +207,14 @@
         addCombining('\u0313', ACCENT_COMMA_ABOVE);
         addCombining('\u0314', ACCENT_REVERSED_COMMA_ABOVE);
         addCombining('\u0315', ACCENT_COMMA_ABOVE_RIGHT);
-        //addCombining('\u031B', ACCENT_HORN);
-        //addCombining('\u0323', ACCENT_DOT_BELOW);
+        addCombining('\u031B', ACCENT_HORN);
+        addCombining('\u0323', ACCENT_DOT_BELOW);
         //addCombining('\u0326', ACCENT_COMMA_BELOW);
         addCombining('\u0327', ACCENT_CEDILLA);
         addCombining('\u0328', ACCENT_OGONEK);
-        //addCombining('\u0329', ACCENT_VERTICAL_LINE_BELOW);
+        addCombining('\u0329', ACCENT_VERTICAL_LINE_BELOW);
         addCombining('\u0331', ACCENT_MACRON_BELOW);
+        addCombining('\u0335', ACCENT_STROKE);
         //addCombining('\u0342', ACCENT_PERISPOMENI);
         //addCombining('\u0344', ACCENT_DIALYTIKA_TONOS);
         //addCombining('\u0345', ACCENT_YPOGEGRAMMENI);
@@ -235,6 +242,33 @@
      */
     private static final SparseIntArray sDeadKeyCache = new SparseIntArray();
     private static final StringBuilder sDeadKeyBuilder = new StringBuilder();
+    static {
+        // Non-standard decompositions.
+        // Stroke modifier for Finnish multilingual keyboard and others.
+        addDeadKey(ACCENT_STROKE, 'D', '\u0110');
+        addDeadKey(ACCENT_STROKE, 'G', '\u01e4');
+        addDeadKey(ACCENT_STROKE, 'H', '\u0126');
+        addDeadKey(ACCENT_STROKE, 'I', '\u0197');
+        addDeadKey(ACCENT_STROKE, 'L', '\u0141');
+        addDeadKey(ACCENT_STROKE, 'O', '\u00d8');
+        addDeadKey(ACCENT_STROKE, 'T', '\u0166');
+        addDeadKey(ACCENT_STROKE, 'd', '\u0111');
+        addDeadKey(ACCENT_STROKE, 'g', '\u01e5');
+        addDeadKey(ACCENT_STROKE, 'h', '\u0127');
+        addDeadKey(ACCENT_STROKE, 'i', '\u0268');
+        addDeadKey(ACCENT_STROKE, 'l', '\u0142');
+        addDeadKey(ACCENT_STROKE, 'o', '\u00f8');
+        addDeadKey(ACCENT_STROKE, 't', '\u0167');
+    }
+
+    private static void addDeadKey(int accent, int c, int result) {
+        final int combining = sAccentToCombining.get(accent);
+        if (combining == 0) {
+            throw new IllegalStateException("Invalid dead key declaration.");
+        }
+        final int combination = (combining << 16) | c;
+        sDeadKeyCache.put(combination, result);
+    }
 
     public static final Parcelable.Creator<KeyCharacterMap> CREATOR =
             new Parcelable.Creator<KeyCharacterMap>() {
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 7b6b54c..c169de4 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -72,7 +72,7 @@
     private final CallbackProxy mCallbackProxy;
     private final WebSettingsClassic mSettings;
     private final Context mContext;
-    private final WebViewDatabase mDatabase;
+    private final WebViewDatabaseClassic mDatabase;
     private final WebViewCore mWebViewCore;
     /* package */ boolean mLoadInitFromJava;
     private int mLoadType;
@@ -241,7 +241,7 @@
         mSettings = settings;
         mContext = context;
         mCallbackProxy = proxy;
-        mDatabase = WebViewDatabase.getInstance(appContext);
+        mDatabase = WebViewDatabaseClassic.getInstance(appContext);
         mWebViewCore = w;
 
         mSearchBox = new SearchBoxImpl(mWebViewCore, mCallbackProxy);
@@ -496,8 +496,8 @@
                     if (item != null) {
                         WebAddress uri = new WebAddress(item.getUrl());
                         String schemePlusHost = uri.getScheme() + uri.getHost();
-                        String[] up =
-                                mDatabase.getUsernamePassword(schemePlusHost);
+                        String[] up = mDatabase.getUsernamePassword(
+                                schemePlusHost);
                         if (up != null && up[0] != null) {
                             setUsernamePassword(up[0], up[1]);
                         }
@@ -809,8 +809,7 @@
                         // non-null username implies that user has
                         // chosen to save password, so update the
                         // recorded password
-                        mDatabase.setUsernamePassword(
-                                schemePlusHost, username, password);
+                        mDatabase.setUsernamePassword(schemePlusHost, username, password);
                     }
                 } else {
                     // CallbackProxy will handle creating the resume
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index 671c064..f0e6ff0 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -56,6 +56,7 @@
      * Represents a resource stored in the HTTP cache. Instances of this class
      * can be obtained by calling
      * {@link CacheManager#getCacheFile CacheManager.getCacheFile(String, Map<String, String>))}.
+     *
      * @deprecated Access to the HTTP cache will be removed in a future release.
      */
     @Deprecated
@@ -81,7 +82,8 @@
 
         /**
          * Gets the status code of this cache entry.
-         * @return The status code of this cache entry
+         *
+         * @return the status code of this cache entry
          */
         public int getHttpStatusCode() {
             return httpStatusCode;
@@ -89,7 +91,8 @@
 
         /**
          * Gets the content length of this cache entry.
-         * @return The content length of this cache entry
+         *
+         * @return the content length of this cache entry
          */
         public long getContentLength() {
             return contentLength;
@@ -99,7 +102,8 @@
          * Gets the path of the file used to store the content of this cache
          * entry, relative to the base directory of the cache. See
          * {@link CacheManager#getCacheFileBaseDir CacheManager.getCacheFileBaseDir()}.
-         * @return The path of the file used to store this cache entry
+         *
+         * @return the path of the file used to store this cache entry
          */
         public String getLocalPath() {
             return localPath;
@@ -108,7 +112,8 @@
         /**
          * Gets the expiry date of this cache entry, expressed in milliseconds
          * since midnight, January 1, 1970 UTC.
-         * @return The expiry date of this cache entry
+         *
+         * @return the expiry date of this cache entry
          */
         public long getExpires() {
             return expires;
@@ -116,7 +121,8 @@
 
         /**
          * Gets the expiry date of this cache entry, expressed as a string.
-         * @return The expiry date of this cache entry
+         *
+         * @return the expiry date of this cache entry
          *
          */
         public String getExpiresString() {
@@ -126,7 +132,8 @@
         /**
          * Gets the date at which this cache entry was last modified, expressed
          * as a string.
-         * @return The date at which this cache entry was last modified
+         *
+         * @return the date at which this cache entry was last modified
          */
         public String getLastModified() {
             return lastModified;
@@ -134,7 +141,8 @@
 
         /**
          * Gets the entity tag of this cache entry.
-         * @return The entity tag of this cache entry
+         *
+         * @return the entity tag of this cache entry
          */
         public String getETag() {
             return etag;
@@ -142,7 +150,8 @@
 
         /**
          * Gets the MIME type of this cache entry.
-         * @return The MIME type of this cache entry
+         *
+         * @return the MIME type of this cache entry
          */
         public String getMimeType() {
             return mimeType;
@@ -151,7 +160,8 @@
         /**
          * Gets the value of the HTTP 'Location' header with which this cache
          * entry was received.
-         * @return The HTTP 'Location' header for this cache entry
+         *
+         * @return the HTTP 'Location' header for this cache entry
          */
         public String getLocation() {
             return location;
@@ -159,7 +169,8 @@
 
         /**
          * Gets the encoding of this cache entry.
-         * @return The encoding of this cache entry
+         *
+         * @return the encoding of this cache entry
          */
         public String getEncoding() {
             return encoding;
@@ -168,7 +179,8 @@
         /**
          * Gets the value of the HTTP 'Content-Disposition' header with which
          * this cache entry was received.
-         * @return The HTTP 'Content-Disposition' header for this cache entry
+         *
+         * @return the HTTP 'Content-Disposition' header for this cache entry
          *
          */
         public String getContentDisposition() {
@@ -179,7 +191,8 @@
          * Gets the input stream to the content of this cache entry, to allow
          * content to be read. See
          * {@link CacheManager#getCacheFile CacheManager.getCacheFile(String, Map<String, String>)}.
-         * @return An input stream to the content of this cache entry
+         *
+         * @return an input stream to the content of this cache entry
          */
         public InputStream getInputStream() {
             return inStream;
@@ -189,7 +202,8 @@
          * Gets an output stream to the content of this cache entry, to allow
          * content to be written. See
          * {@link CacheManager#saveCacheFile CacheManager.saveCacheFile(String, CacheResult)}.
-         * @return An output stream to the content of this cache entry
+         *
+         * @return an output stream to the content of this cache entry
          */
         // Note that this is always null for objects returned by getCacheFile()!
         public OutputStream getOutputStream() {
@@ -199,7 +213,8 @@
 
         /**
          * Sets an input stream to the content of this cache entry.
-         * @param stream An input stream to the content of this cache entry
+         *
+         * @param stream an input stream to the content of this cache entry
          */
         public void setInputStream(InputStream stream) {
             this.inStream = stream;
@@ -207,7 +222,8 @@
 
         /**
          * Sets the encoding of this cache entry.
-         * @param encoding The encoding of this cache entry
+         *
+         * @param encoding the encoding of this cache entry
          */
         public void setEncoding(String encoding) {
             this.encoding = encoding;
@@ -225,7 +241,8 @@
      * Initializes the HTTP cache. This method must be called before any
      * CacheManager methods are used. Note that this is called automatically
      * when a {@link WebView} is created.
-     * @param context The application context
+     *
+     * @param context the application context
      */
     static void init(Context context) {
         // This isn't actually where the real cache lives, but where we put files for the
@@ -240,7 +257,8 @@
      * Gets the base directory in which the files used to store the contents of
      * cache entries are placed. See
      * {@link CacheManager.CacheResult#getLocalPath CacheManager.CacheResult.getLocalPath()}.
-     * @return The base directory of the cache
+     *
+     * @return the base directory of the cache
      * @deprecated Access to the HTTP cache will be removed in a future release.
      */
     @Deprecated
@@ -250,7 +268,8 @@
 
     /**
      * Gets whether the HTTP cache is disabled.
-     * @return True if the HTTP cache is disabled
+     *
+     * @return true if the HTTP cache is disabled
      * @deprecated Access to the HTTP cache will be removed in a future release.
      */
     @Deprecated
@@ -262,8 +281,9 @@
      * Starts a cache transaction. Returns true if this is the only running
      * transaction. Otherwise, this transaction is nested inside currently
      * running transactions and false is returned.
-     * @return True if this is the only running transaction
-     * @deprecated This method no longer has any effect and always returns false
+     *
+     * @return true if this is the only running transaction
+     * @deprecated This method no longer has any effect and always returns false.
      */
     @Deprecated
     public static boolean startCacheTransaction() {
@@ -273,8 +293,9 @@
     /**
      * Ends the innermost cache transaction and returns whether this was the
      * only running transaction.
-     * @return True if this was the only running transaction
-     * @deprecated This method no longer has any effect and always returns false
+     *
+     * @return true if this was the only running transaction
+     * @deprecated This method no longer has any effect and always returns false.
      */
     @Deprecated
     public static boolean endCacheTransaction() {
@@ -287,10 +308,11 @@
      * entry needs validation, appropriate headers will be added to the map.
      * The input stream of the CacheEntry object should be closed by the caller
      * when access to the underlying file is no longer required.
-     * @param url The URL for which a cache entry is requested
-     * @param headers A map from HTTP header name to value, to be populated
+     *
+     * @param url the URL for which a cache entry is requested
+     * @param headers a map from HTTP header name to value, to be populated
      *                for the returned cache entry
-     * @return The cache entry for the specified URL
+     * @return the cache entry for the specified URL
      * @deprecated Access to the HTTP cache will be removed in a future release.
      */
     @Deprecated
@@ -345,14 +367,15 @@
     }
 
     /**
-     * Given a url and its full headers, returns CacheResult if a local cache
+     * Given a URL and its full headers, gets a CacheResult if a local cache
      * can be stored. Otherwise returns null. The mimetype is passed in so that
      * the function can use the mimetype that will be passed to WebCore which
      * could be different from the mimetype defined in the headers.
      * forceCache is for out-of-package callers to force creation of a
      * CacheResult, and is used to supply surrogate responses for URL
      * interception.
-     * @return CacheResult for a given url
+     *
+     * @return a CacheResult for a given URL
      */
     static CacheResult createCacheFile(String url, int statusCode,
             Headers headers, String mimeType, boolean forceCache) {
@@ -363,8 +386,9 @@
     /**
      * Adds a cache entry to the HTTP cache for the specicifed URL. Also closes
      * the cache entry's output stream.
-     * @param url The URL for which the cache entry should be added
-     * @param cacheResult The cache entry to add
+     *
+     * @param url the URL for which the cache entry should be added
+     * @param cacheResult the cache entry to add
      * @deprecated Access to the HTTP cache will be removed in a future release.
      */
     @Deprecated
@@ -401,9 +425,9 @@
     }
 
     /**
-     * Remove all cache files.
+     * Removes all cache files.
      *
-     * @return Whether the removal succeeded.
+     * @return whether the removal succeeded
      */
     static boolean removeAllCacheFiles() {
         // delete cache files in a separate thread to not block UI.
diff --git a/core/java/android/webkit/CookieManager.java b/core/java/android/webkit/CookieManager.java
index 1e7f38c..30c713e 100644
--- a/core/java/android/webkit/CookieManager.java
+++ b/core/java/android/webkit/CookieManager.java
@@ -40,7 +40,7 @@
      * {@link CookieSyncManager#createInstance(Context)} must be called
      * first.
      *
-     * @return The singleton CookieManager instance
+     * @return the singleton CookieManager instance
      */
     public static synchronized CookieManager getInstance() {
         return WebViewFactory.getProvider().getCookieManager();
@@ -49,7 +49,8 @@
     /**
      * Sets whether the application's {@link WebView} instances should send and
      * accept cookies.
-     * @param accept Whether {@link WebView} instances should send and accept
+     *
+     * @param accept whether {@link WebView} instances should send and accept
      *               cookies
      */
     public synchronized void setAcceptCookie(boolean accept) {
@@ -59,7 +60,8 @@
     /**
      * Gets whether the application's {@link WebView} instances send and accept
      * cookies.
-     * @return True if {@link WebView} instances send and accept cookies
+     *
+     * @return true if {@link WebView} instances send and accept cookies
      */
     public synchronized boolean acceptCookie() {
         throw new MustOverrideException();
@@ -70,8 +72,9 @@
      * path and name will be replaced with the new cookie. The cookie being set
      * must not have expired and must not be a session cookie, otherwise it
      * will be ignored.
-     * @param url The URL for which the cookie is set
-     * @param value The cookie as a string, using the format of the 'Set-Cookie'
+     *
+     * @param url the URL for which the cookie is set
+     * @param value the cookie as a string, using the format of the 'Set-Cookie'
      *              HTTP response header
      */
     public void setCookie(String url, String value) {
@@ -80,8 +83,9 @@
 
     /**
      * Gets the cookies for the given URL.
-     * @param url The URL for which the cookies are requested
-     * @return value The cookies as a string, using the format of the 'Cookie'
+     *
+     * @param url the URL for which the cookies are requested
+     * @return value the cookies as a string, using the format of the 'Cookie'
      *               HTTP request header
      */
     public String getCookie(String url) {
@@ -89,10 +93,11 @@
     }
 
     /**
-     * See {@link #getCookie(String)}
-     * @param url The URL for which the cookies are requested
-     * @param privateBrowsing Whether to use the private browsing cookie jar
-     * @return value The cookies as a string, using the format of the 'Cookie'
+     * See {@link #getCookie(String)}.
+     *
+     * @param url the URL for which the cookies are requested
+     * @param privateBrowsing whether to use the private browsing cookie jar
+     * @return value the cookies as a string, using the format of the 'Cookie'
      *               HTTP request header
      * @hide Used by Browser, no intention to publish.
      */
@@ -101,10 +106,11 @@
     }
 
     /**
-     * Get cookie(s) for a given uri so that it can be set to "cookie:" in http
+     * Gets cookie(s) for a given uri so that it can be set to "cookie:" in http
      * request header.
-     * @param uri The WebAddress for which the cookies are requested
-     * @return value The cookies as a string, using the format of the 'Cookie'
+     *
+     * @param uri the WebAddress for which the cookies are requested
+     * @return value the cookies as a string, using the format of the 'Cookie'
      *               HTTP request header
      * @hide Used by RequestHandle, no intention to publish.
      */
@@ -129,7 +135,8 @@
 
     /**
      * Gets whether there are stored cookies.
-     * @return True if there are stored cookies.
+     *
+     * @return true if there are stored cookies
      */
     public synchronized boolean hasCookies() {
         throw new MustOverrideException();
@@ -137,7 +144,8 @@
 
     /**
      * See {@link #hasCookies()}.
-     * @param privateBrowsing Whether to use the private browsing cookie jar
+     *
+     * @param privateBrowsing whether to use the private browsing cookie jar
      * @hide Used by Browser, no intention to publish.
      */
     public synchronized boolean hasCookies(boolean privateBrowsing) {
@@ -152,7 +160,7 @@
     }
 
     /**
-     * Flush all cookies managed by the Chrome HTTP stack to flash.
+     * Flushes all cookies managed by the Chrome HTTP stack to flash.
      *
      * @hide Package level api, called from CookieSyncManager
      */
@@ -163,7 +171,8 @@
     /**
      * Gets whether the application's {@link WebView} instances send and accept
      * cookies for file scheme URLs.
-     * @return True if {@link WebView} instances send and accept cookies for
+     *
+     * @return true if {@link WebView} instances send and accept cookies for
      *         file scheme URLs
      */
     // Static for backward compatibility.
@@ -172,7 +181,8 @@
     }
 
     /**
-     * Implements {@link #allowFileSchemeCookies()}
+     * Implements {@link #allowFileSchemeCookies()}.
+     *
      * @hide Only for use by WebViewProvider implementations
      */
     protected boolean allowFileSchemeCookiesImpl() {
@@ -195,7 +205,8 @@
     }
 
     /**
-     * Implements {@link #setAcceptFileSchemeCookies(boolean)}
+     * Implements {@link #setAcceptFileSchemeCookies(boolean)}.
+     *
      * @hide Only for use by WebViewProvider implementations
      */
     protected void setAcceptFileSchemeCookiesImpl(boolean accept) {
diff --git a/core/java/android/webkit/GeolocationPermissions.java b/core/java/android/webkit/GeolocationPermissions.java
index cd5c9d1..9c0f754 100755
--- a/core/java/android/webkit/GeolocationPermissions.java
+++ b/core/java/android/webkit/GeolocationPermissions.java
@@ -48,28 +48,31 @@
      */
     public interface Callback {
         /**
-         * Set the Geolocation permission state for the supplied origin.
-         * @param origin The origin for which permissions are set.
-         * @param allow Whether or not the origin should be allowed to use the
-         *              Geolocation API.
-         * @param retain Whether the permission should be retained beyond the
+         * Sets the Geolocation permission state for the supplied origin.
+         *
+         * @param origin the origin for which permissions are set
+         * @param allow whether or not the origin should be allowed to use the
+         *              Geolocation API
+         * @param retain whether the permission should be retained beyond the
          *               lifetime of a page currently being displayed by a
-         *               WebView.
+         *               WebView
          */
         public void invoke(String origin, boolean allow, boolean retain);
     };
 
     /**
-     * Get the singleton instance of this class.
-     * @return The singleton {@link GeolocationPermissions} instance.
+     * Gets the singleton instance of this class.
+     *
+     * @return the singleton {@link GeolocationPermissions} instance
      */
     public static GeolocationPermissions getInstance() {
       return WebViewFactory.getProvider().getGeolocationPermissions();
     }
 
     /**
-     * Get the set of origins for which Geolocation permissions are stored.
-     * @param callback A {@link ValueCallback} to receive the result of this
+     * Gets the set of origins for which Geolocation permissions are stored.
+     *
+     * @param callback a {@link ValueCallback} to receive the result of this
      *                 request. This object's
      *                 {@link ValueCallback#onReceiveValue(T) onReceiveValue()}
      *                 method will be invoked asynchronously with a set of
@@ -85,9 +88,10 @@
     }
 
     /**
-     * Get the Geolocation permission state for the specified origin.
-     * @param origin The origin for which Geolocation permission is requested.
-     * @param callback A {@link ValueCallback} to receive the result of this
+     * Gets the Geolocation permission state for the specified origin.
+     *
+     * @param origin the origin for which Geolocation permission is requested
+     * @param callback a {@link ValueCallback} to receive the result of this
      *                 request. This object's
      *                 {@link ValueCallback#onReceiveValue(T) onReceiveValue()}
      *                 method will be invoked asynchronously with a boolean
@@ -99,23 +103,25 @@
     }
 
     /**
-     * Clear the Geolocation permission state for the specified origin.
-     * @param origin The origin for which Geolocation permissions are cleared.
+     * Clears the Geolocation permission state for the specified origin.
+     *
+     * @param origin the origin for which Geolocation permissions are cleared
      */
     public void clear(String origin) {
         // Must be a no-op for backward compatibility: see the hidden constructor for reason.
     }
 
     /**
-     * Allow the specified origin to use the Geolocation API.
-     * @param origin The origin for which Geolocation API use is allowed.
+     * Allows the specified origin to use the Geolocation API.
+     *
+     * @param origin the origin for which Geolocation API use is allowed
      */
     public void allow(String origin) {
         // Must be a no-op for backward compatibility: see the hidden constructor for reason.
     }
 
     /**
-     * Clear the Geolocation permission state for all origins.
+     * Clears the Geolocation permission state for all origins.
      */
     public void clearAll() {
         // Must be a no-op for backward compatibility: see the hidden constructor for reason.
diff --git a/core/java/android/webkit/ViewStateSerializer.java b/core/java/android/webkit/ViewStateSerializer.java
index 35168cf..c161085 100644
--- a/core/java/android/webkit/ViewStateSerializer.java
+++ b/core/java/android/webkit/ViewStateSerializer.java
@@ -64,7 +64,6 @@
         draw.mViewState = new WebViewCore.ViewState();
         draw.mContentSize = new Point(contentWidth, contentHeight);
         draw.mBaseLayer = baseLayer;
-        draw.mInvalRegion = new Region(0, 0, contentWidth, contentHeight);
         stream.close();
         return draw;
     }
diff --git a/core/java/android/webkit/WebResourceResponse.java b/core/java/android/webkit/WebResourceResponse.java
index 650310e..b7171ee 100644
--- a/core/java/android/webkit/WebResourceResponse.java
+++ b/core/java/android/webkit/WebResourceResponse.java
@@ -36,9 +36,10 @@
      * input stream. Callers must implement
      * {@link InputStream#read(byte[]) InputStream.read(byte[])} for the input
      * stream.
-     * @param mimeType The resource response's MIME type, for example text/html
-     * @param encoding The resource response's encoding
-     * @param data The input stream that provides the resource response's data
+     *
+     * @param mimeType the resource response's MIME type, for example text/html
+     * @param encoding the resource response's encoding
+     * @param data the input stream that provides the resource response's data
      */
     public WebResourceResponse(String mimeType, String encoding,
             InputStream data) {
@@ -49,7 +50,8 @@
 
     /**
      * Sets the resource response's MIME type, for example text/html.
-     * @param mimeType The resource response's MIME type
+     *
+     * @param mimeType the resource response's MIME type
      */
     public void setMimeType(String mimeType) {
         mMimeType = mimeType;
@@ -57,7 +59,8 @@
 
     /**
      * Gets the resource response's MIME type.
-     * @return The resource response's MIME type
+     *
+     * @return the resource response's MIME type
      */
     public String getMimeType() {
         return mMimeType;
@@ -66,7 +69,8 @@
     /**
      * Sets the resource response's encoding, for example UTF-8. This is used
      * to decode the data from the input stream.
-     * @param encoding The resource response's encoding
+     *
+     * @param encoding the resource response's encoding
      */
     public void setEncoding(String encoding) {
         mEncoding = encoding;
@@ -74,7 +78,8 @@
 
     /**
      * Gets the resource response's encoding.
-     * @return The resource response's encoding
+     *
+     * @return the resource response's encoding
      */
     public String getEncoding() {
         return mEncoding;
@@ -83,7 +88,8 @@
     /**
      * Sets the input stream that provides the resource respone's data. Callers
      * must implement {@link InputStream#read(byte[]) InputStream.read(byte[])}.
-     * @param data The input stream that provides the resource response's data
+     *
+     * @param data the input stream that provides the resource response's data
      */
     public void setData(InputStream data) {
         mInputStream = data;
@@ -91,7 +97,8 @@
 
     /**
      * Gets the input stream that provides the resource respone's data.
-     * @return The input stream that provides the resource response's data
+     *
+     * @return the input stream that provides the resource response's data
      */
     public InputStream getData() {
         return mInputStream;
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index 1bbf00f..fa3cb20 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -33,10 +33,12 @@
 public abstract class WebSettings {
     /**
      * Enum for controlling the layout of html.
-     * NORMAL means no rendering changes.
-     * SINGLE_COLUMN moves all content into one column that is the width of the
-     * view.
-     * NARROW_COLUMNS makes all columns no wider than the screen if possible.
+     * <ul>
+     *   <li>NORMAL means no rendering changes.</li>
+     *   <li>SINGLE_COLUMN moves all content into one column that is the width of the
+     *       view.</li>
+     *   <li>NARROW_COLUMNS makes all columns no wider than the screen if possible.</li>
+     * </ul>
      */
     // XXX: These must match LayoutAlgorithm in Settings.h in WebCore.
     public enum LayoutAlgorithm {
@@ -51,11 +53,14 @@
 
     /**
      * Enum for specifying the text size.
-     * SMALLEST is 50%
-     * SMALLER is 75%
-     * NORMAL is 100%
-     * LARGER is 150%
-     * LARGEST is 200%
+     * <ul>
+     *   <li>SMALLEST is 50%</li>
+     *   <li>SMALLER is 75%</li>
+     *   <li>NORMAL is 100%</li>
+     *   <li>LARGER is 150%</li>
+     *   <li>LARGEST is 200%</li>
+     * </ul>
+     *
      * @deprecated Use {@link WebSettings#setTextZoom(int)} and {@link WebSettings#getTextZoom()} instead.
      */
     public enum TextSize {
@@ -72,9 +77,11 @@
 
     /**
      * Enum for specifying the WebView's desired density.
-     * FAR makes 100% looking like in 240dpi
-     * MEDIUM makes 100% looking like in 160dpi
-     * CLOSE makes 100% looking like in 120dpi
+     * <ul>
+     *   <li>FAR makes 100% looking like in 240dpi</li>
+     *   <li>MEDIUM makes 100% looking like in 160dpi</li>
+     *   <li>CLOSE makes 100% looking like in 120dpi</li>
+     * </ul>
      */
     public enum ZoomDensity {
         FAR(150),      // 240dpi
@@ -87,24 +94,24 @@
     }
 
     /**
-     * Default cache usage pattern  Use with {@link #setCacheMode}.
+     * Default cache usage pattern. Use with {@link #setCacheMode}.
      */
     public static final int LOAD_DEFAULT = -1;
 
     /**
-     * Normal cache usage pattern  Use with {@link #setCacheMode}.
+     * Normal cache usage pattern. Use with {@link #setCacheMode}.
      */
     public static final int LOAD_NORMAL = 0;
 
     /**
-     * Use cache if content is there, even if expired (eg, history nav)
+     * Use cache if content is there, even if expired (eg, history nav).
      * If it is not in the cache, load from network.
      * Use with {@link #setCacheMode}.
      */
     public static final int LOAD_CACHE_ELSE_NETWORK = 1;
 
     /**
-     * Don't use the cache, load from network
+     * Don't use the cache, load from network.
      * Use with {@link #setCacheMode}.
      */
     public static final int LOAD_NO_CACHE = 2;
@@ -139,6 +146,7 @@
     /**
      * Hidden constructor to prevent clients from creating a new settings
      * instance or deriving the class.
+     *
      * @hide
      */
     protected WebSettings() {
@@ -146,6 +154,7 @@
 
     /**
      * Enables dumping the pages navigation cache to a text file.
+     *
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -154,7 +163,8 @@
     }
 
     /**
-     * Returns true if dumping the navigation cache is enabled.
+     * Gets whether dumping the navigation cache is enabled.
+     *
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -167,16 +177,19 @@
      * controls and gestures. The particular zoom mechanisms that should be used
      * can be set with {@link #setBuiltInZoomControls}. This setting does not
      * affect zooming performed using the {@link WebView#zoomIn()} and
-     * {@link WebView#zoomOut()} methods.
-     * @param support Whether the WebView should support zoom.
+     * {@link WebView#zoomOut()} methods. The default is true.
+     *
+     * @param support whether the WebView should support zoom
      */
     public void setSupportZoom(boolean support) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if the WebView supports zoom. The default is true.
-     * @return True if the WebView supports zoom.
+     * Gets whether the WebView supports zoom.
+     *
+     * @return true if the WebView supports zoom
+     * @see #setSupportZoom
      */
     public boolean supportZoom() {
         throw new MustOverrideException();
@@ -187,11 +200,12 @@
      * built-in zoom mechanisms comprise on-screen zoom controls, which are
      * displayed over the WebView's content, and the use of a pinch gesture to
      * control zooming. Whether or not these on-screen controls are displayed
-     * can be set with {@link #setDisplayZoomControls}.
+     * can be set with {@link #setDisplayZoomControls}. The default is false.
      * <p>
      * The built-in mechanisms are the only currently supported zoom
      * mechanisms, so it is recommended that this setting is always enabled.
-     * @param enabled Whether the WebView should use its built-in zoom mechanisms.
+     *
+     * @param enabled whether the WebView should use its built-in zoom mechanisms
      */
     // This method was intended to select between the built-in zoom mechanisms
     // and the separate zoom controls. The latter were obtained using
@@ -201,9 +215,10 @@
     }
 
     /**
-     * Returns true if the zoom mechanisms built into WebView are being used.
-     * The default is false.
-     * @return True if the zoom mechanisms built into WebView are being used.
+     * Gets whether the zoom mechanisms built into WebView are being used.
+     *
+     * @return true if the zoom mechanisms built into WebView are being used
+     * @see #setBuiltInZoomControls
      */
     public boolean getBuiltInZoomControls() {
         throw new MustOverrideException();
@@ -212,24 +227,28 @@
     /**
      * Sets whether the WebView should display on-screen zoom controls when
      * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
-     * @param enabled Whether the WebView should display on-screen zoom controls.
+     * The default is true.
+     *
+     * @param enabled whether the WebView should display on-screen zoom controls
      */
     public void setDisplayZoomControls(boolean enabled) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if the WebView displays on-screen zoom controls when using
-     * the built-in zoom mechanisms. The default is true.
-     * @return True if the WebView displays on-screen zoom controls when using
+     * Gets whether the WebView displays on-screen zoom controls when using
      * the built-in zoom mechanisms.
+     *
+     * @return true if the WebView displays on-screen zoom controls when using
+     *         the built-in zoom mechanisms
+     * @see #setDisplayZoomControls
      */
     public boolean getDisplayZoomControls() {
         throw new MustOverrideException();
     }
 
     /**
-     * Enable or disable file access within WebView. File access is enabled by
+     * Enables or disables file access within WebView. File access is enabled by
      * default.  Note that this enables or disables file system access only.
      * Assets and resources are still accessible using file:///android_asset and
      * file:///android_res.
@@ -239,44 +258,48 @@
     }
 
     /**
-     * Returns true if this WebView supports file access.
+     * Gets whether this WebView supports file access.
+     *
+     * @see #setAllowFileAccess
      */
     public boolean getAllowFileAccess() {
         throw new MustOverrideException();
     }
 
     /**
-     * Enable or disable content url access within WebView.  Content url access
-     * allows WebView to load content from a content provider installed in the
-     * system.  The default is enabled.
+     * Enables or disables content URL access within WebView.  Content URL
+     * access allows WebView to load content from a content provider installed
+     * in the system. The default is enabled.
      */
     public void setAllowContentAccess(boolean allow) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if this WebView supports content url access.
+     * Gets whether this WebView supports content URL access.
+     *
+     * @see #setAllowContentAccess
      */
     public boolean getAllowContentAccess() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set whether the WebView loads a page with overview mode.
+     * Sets whether the WebView loads a page with overview mode.
      */
     public void setLoadWithOverviewMode(boolean overview) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if this WebView loads page with overview mode
+     * Gets whether this WebView loads pages with overview mode.
      */
     public boolean getLoadWithOverviewMode() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set whether the WebView will enable smooth transition while panning or
+     * Sets whether the WebView will enable smooth transition while panning or
      * zooming or while the window hosting the WebView does not have focus.
      * If it is true, WebView will choose a solution to maximize the performance.
      * e.g. the WebView's content may not be updated during the transition.
@@ -285,18 +308,22 @@
     public void setEnableSmoothTransition(boolean enable) {
         throw new MustOverrideException();
     }
+
     /**
-     * Returns true if the WebView enables smooth transition while panning or
+     * Gets whether the WebView enables smooth transition while panning or
      * zooming.
+     *
+     * @see #setEnableSmoothTransition
      */
     public boolean enableSmoothTransition() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set whether the WebView uses its background for over scroll background.
+     * Sets whether the WebView uses its background for over scroll background.
      * If true, it will use the WebView's background. If false, it will use an
      * internal pattern. Default is true.
+     *
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -305,8 +332,10 @@
     }
 
     /**
-     * Returns true if this WebView uses WebView's background instead of
+     * Gets whether this WebView uses WebView's background instead of
      * internal pattern for over scroll background.
+     *
+     * @see #setUseWebViewBackgroundForOverscrollBackground
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -315,77 +344,82 @@
     }
 
     /**
-     * Store whether the WebView is saving form data.
+     * Sets whether the WebView is saving form data.
      */
     public void setSaveFormData(boolean save) {
         throw new MustOverrideException();
     }
 
     /**
-     *  Return whether the WebView is saving form data and displaying prior
-     *  entries/autofill++.  Always false in private browsing mode.
+     * Gets whether the WebView is saving form data and displaying prior
+     * entries/autofill++.  Always false in private browsing mode.
      */
     public boolean getSaveFormData() {
         throw new MustOverrideException();
     }
 
     /**
-     *  Store whether the WebView is saving password.
+     * Stores whether the WebView is saving password.
      */
     public void setSavePassword(boolean save) {
         throw new MustOverrideException();
     }
 
     /**
-     *  Return whether the WebView is saving password.
+     * Gets whether the WebView is saving password.
      */
     public boolean getSavePassword() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the text zoom of the page in percent. Default is 100.
-     * @param textZoom A percent value for increasing or decreasing the text.
+     * Sets the text zoom of the page in percent. Default is 100.
+     *
+     * @param textZoom the percent value for increasing or decreasing the text
      */
     public synchronized void setTextZoom(int textZoom) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the text zoom of the page in percent.
-     * @return A percent value describing the text zoom.
-     * @see setTextSizeZoom
+     * Gets the text zoom of the page in percent.
+     *
+     * @return a percent value describing the text zoom
+     * @see #setTextSizeZoom
      */
     public synchronized int getTextZoom() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the text size of the page.
-     * @param t A TextSize value for increasing or decreasing the text.
+     * Sets the text size of the page.
+     *
+     * @param t the TextSize value for increasing or decreasing the text
      * @see WebSettings.TextSize
-     * @deprecated Use {@link #setTextZoom(int)} instead
+     * @deprecated Use {@link #setTextZoom(int)} instead.
      */
     public synchronized void setTextSize(TextSize t) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the text size of the page. If the text size was previously specified
+     * Gets the text size of the page. If the text size was previously specified
      * in percent using {@link #setTextZoom(int)}, this will return
      * the closest matching {@link TextSize}.
-     * @return A TextSize enum value describing the text size.
+     *
+     * @return a TextSize enum value describing the text size
      * @see WebSettings.TextSize
-     * @deprecated Use {@link #getTextZoom()} instead
+     * @deprecated Use {@link #getTextZoom()} instead.
      */
     public synchronized TextSize getTextSize() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the default zoom density of the page. This should be called from UI
+     * Sets the default zoom density of the page. This should be called from UI
      * thread.
-     * @param zoom A ZoomDensity value
+     *
+     * @param zoom a ZoomDensity value
      * @see WebSettings.ZoomDensity
      */
     public void setDefaultZoom(ZoomDensity zoom) {
@@ -393,9 +427,9 @@
     }
 
     /**
-     * Get the default zoom density of the page. This should be called from UI
+     * Gets the default zoom density of the page. This should be called from UI
      * thread.
-     * @return A ZoomDensity value
+     * @return a ZoomDensity value
      * @see WebSettings.ZoomDensity
      */
     public ZoomDensity getDefaultZoom() {
@@ -410,15 +444,17 @@
     }
 
     /**
-     * Returns true if light touches are enabled.
+     * Gets whether light touches are enabled.
      */
     public boolean getLightTouchEnabled() {
         throw new MustOverrideException();
     }
 
     /**
-     * @deprecated This setting controlled a rendering optimization
-     * that is no longer present. Setting it now has no effect.
+     * Controlled a rendering optimization that is no longer present. Setting
+     * it now has no effect.
+     *
+     * @deprecated This setting now has no effect.
      */
     @Deprecated
     public synchronized void setUseDoubleTree(boolean use) {
@@ -426,8 +462,10 @@
     }
 
     /**
-     * @deprecated This setting controlled a rendering optimization
-     * that is no longer present. Setting it now has no effect.
+     * Controlled a rendering optimization that is no longer present. Setting
+     * it now has no effect.
+     *
+     * @deprecated This setting now has no effect.
      */
     @Deprecated
     public synchronized boolean getUseDoubleTree() {
@@ -436,10 +474,10 @@
     }
 
     /**
-     * Tell the WebView about user-agent string.
-     * @param ua 0 if the WebView should use an Android user-agent string,
-     *           1 if the WebView should use a desktop user-agent string.
+     * Tells the WebView about user-agent string.
      *
+     * @param ua 0 if the WebView should use an Android user-agent string,
+     *           1 if the WebView should use a desktop user-agent string
      * @deprecated Please use setUserAgentString instead.
      */
     @Deprecated
@@ -448,11 +486,11 @@
     }
 
     /**
-     * Return user-agent as int
-     * @return int  0 if the WebView is using an Android user-agent string.
-     *              1 if the WebView is using a desktop user-agent string.
-     *             -1 if the WebView is using user defined user-agent string.
+     * Gets the user-agent as an int.
      *
+     * @return 0 if the WebView is using an Android user-agent string,
+     *         1 if the WebView is using a desktop user-agent string,
+     *         -1 if the WebView is using user defined user-agent string
      * @deprecated Please use getUserAgentString instead.
      */
     @Deprecated
@@ -461,30 +499,34 @@
     }
 
     /**
-     * Tell the WebView to use the wide viewport
+     * Tells the WebView to use the wide viewport.
      */
     public synchronized void setUseWideViewPort(boolean use) {
         throw new MustOverrideException();
     }
 
     /**
-     * @return True if the WebView is using a wide viewport
+     * Gets whether the WebView is using a wide viewport.
+     *
+     * @return true if the WebView is using a wide viewport
      */
     public synchronized boolean getUseWideViewPort() {
         throw new MustOverrideException();
     }
 
     /**
-     * Tell the WebView whether it supports multiple windows. TRUE means
-     *         that {@link WebChromeClient#onCreateWindow(WebView, boolean,
-     *         boolean, Message)} is implemented by the host application.
+     * Tells the WebView whether it supports multiple windows. TRUE means
+     * that {@link WebChromeClient#onCreateWindow(WebView, boolean,
+     * boolean, Message)} is implemented by the host application.
      */
     public synchronized void setSupportMultipleWindows(boolean support) {
         throw new MustOverrideException();
     }
 
     /**
-     * @return True if the WebView is supporting multiple windows. This means
+     * Gets whether the WebView is supporting multiple windows.
+     *
+     * @return true if the WebView is supporting multiple windows. This means
      *         that {@link WebChromeClient#onCreateWindow(WebView, boolean,
      *         boolean, Message)} is implemented by the host application.
      */
@@ -493,9 +535,10 @@
     }
 
     /**
-     * Set the underlying layout algorithm. This will cause a relayout of the
-     * WebView.
-     * @param l A LayoutAlgorithm enum specifying the algorithm to use.
+     * Sets the underlying layout algorithm. This will cause a relayout of the
+     * WebView. The default is NARROW_COLUMNS.
+     *
+     * @param l a LayoutAlgorithm enum specifying the algorithm to use
      * @see WebSettings.LayoutAlgorithm
      */
     public synchronized void setLayoutAlgorithm(LayoutAlgorithm l) {
@@ -503,9 +546,11 @@
     }
 
     /**
-     * Return the current layout algorithm. The default is NARROW_COLUMNS.
-     * @return LayoutAlgorithm enum value describing the layout algorithm
-     *         being used.
+     * Gets the current layout algorithm.
+     *
+     * @return a LayoutAlgorithm enum value describing the layout algorithm
+     *         being used
+     * @see #setLayoutAlgorithm
      * @see WebSettings.LayoutAlgorithm
      */
     public synchronized LayoutAlgorithm getLayoutAlgorithm() {
@@ -513,164 +558,193 @@
     }
 
     /**
-     * Set the standard font family name.
-     * @param font A font family name.
+     * Sets the standard font family name. The default is "sans-serif".
+     *
+     * @param font a font family name
      */
     public synchronized void setStandardFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the standard font family name. The default is "sans-serif".
-     * @return The standard font family name as a string.
+     * Gets the standard font family name.
+     *
+     * @return the standard font family name as a string
+     * @see #setStandardFontFamily
      */
     public synchronized String getStandardFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the fixed font family name.
-     * @param font A font family name.
+     * Sets the fixed font family name. The default is "monospace".
+     *
+     * @param font a font family name
      */
     public synchronized void setFixedFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the fixed font family name. The default is "monospace".
-     * @return The fixed font family name as a string.
+     * Gets the fixed font family name.
+     *
+     * @return the fixed font family name as a string
+     * @see #setFixedFontFamily
      */
     public synchronized String getFixedFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the sans-serif font family name.
-     * @param font A font family name.
+     * Sets the sans-serif font family name.
+     *
+     * @param font a font family name
      */
     public synchronized void setSansSerifFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the sans-serif font family name.
-     * @return The sans-serif font family name as a string.
+     * Gets the sans-serif font family name.
+     *
+     * @return the sans-serif font family name as a string
      */
     public synchronized String getSansSerifFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the serif font family name. The default is "sans-serif".
-     * @param font A font family name.
+     * Sets the serif font family name. The default is "sans-serif".
+     *
+     * @param font a font family name
      */
     public synchronized void setSerifFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the serif font family name. The default is "serif".
-     * @return The serif font family name as a string.
+     * Gets the serif font family name. The default is "serif".
+     *
+     * @return the serif font family name as a string
+     * @see #setSerifFontFamily
      */
     public synchronized String getSerifFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the cursive font family name.
-     * @param font A font family name.
+     * Sets the cursive font family name. The default is "cursive".
+     *
+     * @param font a font family name
      */
     public synchronized void setCursiveFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the cursive font family name. The default is "cursive".
-     * @return The cursive font family name as a string.
+     * Gets the cursive font family name.
+     *
+     * @return the cursive font family name as a string
+     * @see #setCursiveFontFamily
      */
     public synchronized String getCursiveFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the fantasy font family name.
-     * @param font A font family name.
+     * Sets the fantasy font family name. The default is "fantasy".
+     *
+     * @param font a font family name
      */
     public synchronized void setFantasyFontFamily(String font) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the fantasy font family name. The default is "fantasy".
-     * @return The fantasy font family name as a string.
+     * Gets the fantasy font family name.
+     *
+     * @return the fantasy font family name as a string
+     * @see #setFantasyFontFamily
      */
     public synchronized String getFantasyFontFamily() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the minimum font size.
-     * @param size A non-negative integer between 1 and 72.
-     * Any number outside the specified range will be pinned.
+     * Sets the minimum font size. The default is 8.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
      */
     public synchronized void setMinimumFontSize(int size) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the minimum font size. The default is 8.
-     * @return A non-negative integer between 1 and 72.
+     * Gets the minimum font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setMinimumFontSize
      */
     public synchronized int getMinimumFontSize() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the minimum logical font size.
-     * @param size A non-negative integer between 1 and 72.
-     * Any number outside the specified range will be pinned.
+     * Sets the minimum logical font size. The default is 8.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
      */
     public synchronized void setMinimumLogicalFontSize(int size) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the minimum logical font size. The default is 8.
-     * @return A non-negative integer between 1 and 72.
+     * Gets the minimum logical font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setMinimumLogicalFontSize
      */
     public synchronized int getMinimumLogicalFontSize() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the default font size.
-     * @param size A non-negative integer between 1 and 72.
-     * Any number outside the specified range will be pinned.
+     * Sets the default font size. The default is 16.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
      */
     public synchronized void setDefaultFontSize(int size) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the default font size. The default is 16.
-     * @return A non-negative integer between 1 and 72.
+     * Gets the default font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setDefaultFontSize
      */
     public synchronized int getDefaultFontSize() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the default fixed font size.
-     * @param size A non-negative integer between 1 and 72.
-     * Any number outside the specified range will be pinned.
+     * Sets the default fixed font size. The default is 16.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
      */
     public synchronized void setDefaultFixedFontSize(int size) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the default fixed font size. The default is 16.
-     * @return A non-negative integer between 1 and 72.
+     * Gets the default fixed font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setDefaultFixedFontSize
      */
     public synchronized int getDefaultFixedFontSize() {
         throw new MustOverrideException();
@@ -683,16 +757,20 @@
      * of images specified using network URI schemes. Note that if the value of this
      * setting is changed from false to true, all images resources referenced
      * by content currently displayed by the WebView are loaded automatically.
-     * @param flag Whether the WebView should load image resources.
+     * The default is true.
+     *
+     * @param flag whether the WebView should load image resources
      */
     public synchronized void setLoadsImagesAutomatically(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if the WebView loads image resources. This includes
-     * images embedded using the data URI scheme. The default is true.
-     * @return True if the WebView loads image resources.
+     * Gets whether the WebView loads image resources. This includes
+     * images embedded using the data URI scheme.
+     *
+     * @return true if the WebView loads image resources
+     * @see #setLoadsImagesAutomatically
      */
     public synchronized boolean getLoadsImagesAutomatically() {
         throw new MustOverrideException();
@@ -707,9 +785,10 @@
      * will also prevent network images from loading, even if this flag is set
      * to false. When the value of this setting is changed from true to false,
      * network images resources referenced by content currently displayed by
-     * the WebView are fetched automatically.
-     * @param flag Whether the WebView should not load image resources from
-     * the network.
+     * the WebView are fetched automatically. The default is false.
+     *
+     * @param flag whether the WebView should not load image resources from the
+     *             network
      * @see #setBlockNetworkLoads
      */
     public synchronized void setBlockNetworkImage(boolean flag) {
@@ -717,9 +796,10 @@
     }
 
     /**
-     * Returns true if the WebView does not load image resources from the network.
-     * The default is false.
-     * @return True if the WebView does not load image resources from the network.
+     * Gets whether the WebView does not load image resources from the network.
+     *
+     * @return true if the WebView does not load image resources from the network
+     * @see #setBlockNetworkImage
      */
     public synchronized boolean getBlockNetworkImage() {
         throw new MustOverrideException();
@@ -735,9 +815,12 @@
      * If the application does not have the
      * {@link android.Manifest.permission#INTERNET} permission, attempts to set
      * a value of false will cause a {@link java.lang.SecurityException}
-     * to be thrown.
-     * @param flag Whether the WebView should not load any resources
-     * from the network.
+     * to be thrown. The default value is false if the application has the
+     * {@link android.Manifest.permission#INTERNET} permission, otherwise it is
+     * true.
+     *
+     * @param flag whether the WebView should not load any resources from the
+     *             network
      * @see android.webkit.WebView#reload
      */
     public synchronized void setBlockNetworkLoads(boolean flag) {
@@ -745,50 +828,64 @@
     }
 
     /**
-     * Returns true if the WebView does not load any resources from the network.
-     * The default value is false if the application has the
-     * {@link android.Manifest.permission#INTERNET} permission, otherwise it is
-     * true.
-     * @return True if the WebView does not load any resources from the network.
+     * Gets whether the WebView does not load any resources from the network.
+     *
+     * @return true if the WebView does not load any resources from the network
+     * @see #setBlockNetworkLoads
      */
     public synchronized boolean getBlockNetworkLoads() {
         throw new MustOverrideException();
     }
 
     /**
-     * Tell the WebView to enable javascript execution.
-     * @param flag True if the WebView should execute javascript.
+     * Tells the WebView to enable JavaScript execution.
+     * <b>The default is false.</b>
+     *
+     * @param flag true if the WebView should execute JavaScript
      */
     public synchronized void setJavaScriptEnabled(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Configure scripting (such as XmlHttpRequest) access from file scheme URLs
-     * to any origin. Note, calling this method with a true argument value also
-     * implies calling setAllowFileAccessFromFileURLs with a true. The default
-     * value is false for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
-     * and higher and true otherwise.
+     * Sets whether JavaScript running in the context of a file scheme URL
+     * should be allowed to access content from any origin. This includes
+     * access to content from other file scheme URLs. See
+     * {@link #setAllowFileAccessFromFileURLs}. To enable the most restrictive,
+     * and therefore secure policy, this setting should be disabled.
+     * <p>
+     * The default value is true for API level
+     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
+     * and false for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+     * and above.
      *
-   . * @param flag True if the WebView should allow scripting access from file
-     *                  scheme URLs to any origin
+     * @param flag whether JavaScript running in the context of a file scheme
+     *             URL should be allowed to access content from any origin
      */
     public abstract void setAllowUniversalAccessFromFileURLs(boolean flag);
 
     /**
-     * Configure scripting (such as XmlHttpRequest) access from file scheme URLs
-     * to file origin. The default value is false for API level
-     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN} and higher and true
-     * otherwise.
+     * Sets whether JavaScript running in the context of a file scheme URL
+     * should be allowed to access content from other file scheme URLs. To
+     * enable the most restrictive, and therefore secure policy, this setting
+     * should be disabled. Note that the value of this setting is ignored if
+     * the value of {@link #getAllowUniversalAccessFromFileURLs} is true.
+     * <p>
+     * The default value is true for API level
+     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
+     * and false for API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+     * and above.
      *
-     * @param flag True if the WebView should allow scripting access from file
-     *                  scheme URLs to file origin
+     * @param flag whether JavaScript running in the context of a file scheme
+     *             URL should be allowed to access content from other file
+     *             scheme URLs
      */
     public abstract void setAllowFileAccessFromFileURLs(boolean flag);
 
     /**
-     * Tell the WebView to enable plugins.
-     * @param flag True if the WebView should load plugins.
+     * Tells the WebView to enable plugins.
+     *
+     * @param flag true if the WebView should load plugins
      * @deprecated This method has been deprecated in favor of
      *             {@link #setPluginState}
      */
@@ -798,22 +895,24 @@
     }
 
     /**
-     * Tell the WebView to enable, disable, or have plugins on demand. On
+     * Tells the WebView to enable, disable, or have plugins on demand. On
      * demand mode means that if a plugin exists that can handle the embedded
      * content, a placeholder icon will be shown instead of the plugin. When
      * the placeholder is clicked, the plugin will be enabled.
-     * @param state One of the PluginState values.
+     *
+     * @param state a PluginState value
      */
     public synchronized void setPluginState(PluginState state) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set a custom path to plugins used by the WebView. This method is
+     * Sets a custom path to plugins used by the WebView. This method is
      * obsolete since each plugin is now loaded from its own package.
-     * @param pluginsPath String path to the directory containing plugins.
+     *
+     * @param pluginsPath a String path to the directory containing plugins
      * @deprecated This method is no longer used as plugins are loaded from
-     * their own APK via the system's package manager.
+     *             their own APK via the system's package manager.
      */
     @Deprecated
     public synchronized void setPluginsPath(String pluginsPath) {
@@ -821,91 +920,101 @@
     }
 
     /**
-     * Set the path to where database storage API databases should be saved.
-     * Nota that the WebCore Database Tracker only allows the path to be set once.
-     * This will update WebCore when the Sync runs in the C++ side.
-     * @param databasePath String path to the directory where databases should
-     *     be saved. May be the empty string but should never be null.
+     * Sets the path to where database storage API databases should be saved.
+     * Note that the WebCore Database Tracker only allows the path to be set once.
+     *
+     * @param databasePath a String path to the directory where databases should
+     *                     be saved. May be the empty string but should never
+     *                     be null.
      */
+    // This will update WebCore when the Sync runs in the C++ side.
     public synchronized void setDatabasePath(String databasePath) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the path where the Geolocation permissions database should be saved.
-     * This will update WebCore when the Sync runs in the C++ side.
-     * @param databasePath String path to the directory where the Geolocation
-     *     permissions database should be saved. May be the empty string but
-     *     should never be null.
+     * Sets the path where the Geolocation permissions database should be saved.
+     *
+     * @param databasePath a String path to the directory where the Geolocation
+     *                     permissions database should be saved. May be the
+     *                     empty string but should never be null.
      */
+    // This will update WebCore when the Sync runs in the C++ side.
     public synchronized void setGeolocationDatabasePath(String databasePath) {
         throw new MustOverrideException();
     }
 
     /**
-     * Tell the WebView to enable Application Caches API.
-     * @param flag True if the WebView should enable Application Caches.
+     * Tells the WebView to enable Application Caches API.
+     *
+     * @param flag true if the WebView should enable Application Caches
      */
     public synchronized void setAppCacheEnabled(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set a custom path to the Application Caches files. The client
+     * Sets a custom path to the Application Caches files. The client
      * must ensure it exists before this call.
-     * @param appCachePath String path to the directory containing Application
-     * Caches files. The appCache path can be the empty string but should not
-     * be null. Passing null for this parameter will result in a no-op.
+     *
+     * @param appCachePath a String path to the directory containing
+     *                     Application Caches files. The appCache path can be
+     *                     the empty string but should not be null. Passing
+     *                     null for this parameter will result in a no-op.
      */
     public synchronized void setAppCachePath(String appCachePath) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the maximum size for the Application Caches content.
-     * @param appCacheMaxSize the maximum size in bytes.
+     * Sets the maximum size for the Application Caches content.
+     *
+     * @param appCacheMaxSize the maximum size in bytes
      */
     public synchronized void setAppCacheMaxSize(long appCacheMaxSize) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set whether the database storage API is enabled.
-     * @param flag boolean True if the WebView should use the database storage
-     *     API.
+     * Sets whether the database storage API is enabled.
+     *
+     * @param flag true if the WebView should use the database storage API
      */
     public synchronized void setDatabaseEnabled(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set whether the DOM storage API is enabled.
-     * @param flag boolean True if the WebView should use the DOM storage
-     *     API.
+     * Sets whether the DOM storage API is enabled.
+     *
+     * @param flag true if the WebView should use the DOM storage API
      */
     public synchronized void setDomStorageEnabled(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if the DOM Storage API's are enabled.
-     * @return True if the DOM Storage API's are enabled.
+     * Gets whether the DOM Storage APIs are enabled.
+     *
+     * @return true if the DOM Storage APIs are enabled
      */
     public synchronized boolean getDomStorageEnabled() {
         throw new MustOverrideException();
     }
     /**
-     * Return the path to where database storage API databases are saved for
+     * Gets the path to where database storage API databases are saved for
      * the current WebView.
-     * @return the String path to the database storage API databases.
+     *
+     * @return the String path to the database storage API databases
      */
     public synchronized String getDatabasePath() {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns true if database storage API is enabled.
-     * @return True if the database storage API is enabled.
+     * Gets whether the database storage API is enabled.
+     *
+     * @return true if the database storage API is enabled
      */
     public synchronized boolean getDatabaseEnabled() {
         throw new MustOverrideException();
@@ -913,43 +1022,48 @@
 
     /**
      * Sets whether Geolocation is enabled.
-     * @param flag Whether Geolocation should be enabled.
+     *
+     * @param flag whether Geolocation should be enabled
      */
     public synchronized void setGeolocationEnabled(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Return true if javascript is enabled. <b>Note: The default is false.</b>
-     * @return True if javascript is enabled.
+     * Gets whether JavaScript is enabled.
+     *
+     * @return true if JavaScript is enabled
+     * @see #setJavaScriptEnabled
      */
     public synchronized boolean getJavaScriptEnabled() {
         throw new MustOverrideException();
     }
 
     /**
-     * Return true if scripting access {see @setAllowUniversalAccessFromFileURLs} from
-     * file URLs to any origin is enabled. The default value is false for API level
-     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN} and higher and true otherwise.
+     * Gets whether JavaScript running in the context of a file scheme URL can
+     * access content from any origin. This includes access to content from
+     * other file scheme URLs.
      *
-     * @return True if the WebView allows scripting access from file scheme requests
-     *              to any origin
+     * @return whether JavaScript running in the context of a file scheme URL
+     *         can access content from any origin
+     * @see #setAllowUniversalAccessFromFileURLs
      */
     public abstract boolean getAllowUniversalAccessFromFileURLs();
 
     /**
-     * Return true if scripting access {see @setAllowFileAccessFromFileURLs} from file
-     * URLs to file origin is enabled. The default value is false for API level
-     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN} and higher, and true otherwise.
+     * Gets whether JavaScript running in the context of a file scheme URL can
+     * access content from other file scheme URLs.
      *
-     * @return True if the WebView allows scripting access from file scheme requests
-     *              to file origin
+     * @return whether JavaScript running in the context of a file scheme URL
+     *         can access content from other file scheme URLs
+     * @see #setAllowFileAccessFromFileURLs
      */
     public abstract boolean getAllowFileAccessFromFileURLs();
 
     /**
-     * Return true if plugins are enabled.
-     * @return True if plugins are enabled.
+     * Gets whether plugins are enabled.
+     *
+     * @return true if plugins are enabled
      * @deprecated This method has been replaced by {@link #getPluginState}
      */
     @Deprecated
@@ -958,17 +1072,19 @@
     }
 
     /**
-     * Return the current plugin state.
-     * @return A value corresponding to the enum PluginState.
+     * Gets the current plugin state.
+     *
+     * @return a value corresponding to the enum PluginState
      */
     public synchronized PluginState getPluginState() {
         throw new MustOverrideException();
     }
 
     /**
-     * Returns the directory that contains the plugin libraries. This method is
+     * Gets the directory that contains the plugin libraries. This method is
      * obsolete since each plugin is now loaded from its own package.
-     * @return An empty string.
+     *
+     * @return an empty string
      * @deprecated This method is no longer used as plugins are loaded from
      * their own APK via the system's package manager.
      */
@@ -979,41 +1095,47 @@
     }
 
     /**
-     * Tell javascript to open windows automatically. This applies to the
-     * javascript function window.open().
-     * @param flag True if javascript can open windows automatically.
+     * Tells JavaScript to open windows automatically. This applies to the
+     * JavaScript function window.open(). The default is false.
+     *
+     * @param flag true if JavaScript can open windows automatically
      */
     public synchronized void setJavaScriptCanOpenWindowsAutomatically(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Return true if javascript can open windows automatically. The default
-     * is false.
-     * @return True if javascript can open windows automatically during
-     *         window.open().
+     * Gets whether JavaScript can open windows automatically.
+     *
+     * @return true if JavaScript can open windows automatically during
+     *         window.open()
+     * @see #setJavaScriptCanOpenWindowsAutomatically
      */
     public synchronized boolean getJavaScriptCanOpenWindowsAutomatically() {
         throw new MustOverrideException();
     }
     /**
-     * Set the default text encoding name to use when decoding html pages.
-     * @param encoding The text encoding name.
+     * Sets the default text encoding name to use when decoding html pages.
+     * The default is "Latin-1".
+     *
+     * @param encoding the text encoding name
      */
     public synchronized void setDefaultTextEncodingName(String encoding) {
         throw new MustOverrideException();
     }
 
     /**
-     * Get the default text encoding name. The default is "Latin-1".
-     * @return The default text encoding name as a string.
+     * Gets the default text encoding name.
+     *
+     * @return the default text encoding name as a string
+     * @see #setDefaultTextEncodingName
      */
     public synchronized String getDefaultTextEncodingName() {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the WebView's user-agent string. If the string "ua" is null or empty,
+     * Sets the WebView's user-agent string. If the string "ua" is null or empty,
      * it will use the system default user-agent string.
      */
     public synchronized void setUserAgentString(String ua) {
@@ -1021,46 +1143,47 @@
     }
 
     /**
-     * Return the WebView's user-agent string.
+     * Gets the WebView's user-agent string.
      */
     public synchronized String getUserAgentString() {
         throw new MustOverrideException();
     }
 
     /**
-     * Tell the WebView whether it needs to set a node to have focus when
+     * Tells the WebView whether it needs to set a node to have focus when
      * {@link WebView#requestFocus(int, android.graphics.Rect)} is called.
      *
-     * @param flag
+     * @param flag whether the WebView needs to set a node
      */
     public void setNeedInitialFocus(boolean flag) {
         throw new MustOverrideException();
     }
 
     /**
-     * Set the priority of the Render thread. Unlike the other settings, this
+     * Sets the priority of the Render thread. Unlike the other settings, this
      * one only needs to be called once per process. The default is NORMAL.
      *
-     * @param priority RenderPriority, can be normal, high or low.
+     * @param priority a RenderPriority
      */
     public synchronized void setRenderPriority(RenderPriority priority) {
         throw new MustOverrideException();
     }
 
     /**
-     * Override the way the cache is used. The way the cache is used is based
+     * Overrides the way the cache is used. The way the cache is used is based
      * on the navigation option. For a normal page load, the cache is checked
      * and content is re-validated as needed. When navigating back, content is
      * not revalidated, instead the content is just pulled from the cache.
      * This function allows the client to override this behavior.
-     * @param mode One of the LOAD_ values.
+     *
+     * @param mode one of the LOAD_ values
      */
     public void setCacheMode(int mode) {
         throw new MustOverrideException();
     }
 
     /**
-     * Return the current setting for overriding the cache mode. For a full
+     * Gets the current setting for overriding the cache mode. For a full
      * description, see the {@link #setCacheMode(int)} function.
      */
     public int getCacheMode() {
diff --git a/core/java/android/webkit/WebStorage.java b/core/java/android/webkit/WebStorage.java
index c46d161..76674f4 100644
--- a/core/java/android/webkit/WebStorage.java
+++ b/core/java/android/webkit/WebStorage.java
@@ -44,8 +44,9 @@
     // otherwise the WebCore thread will remain asleep.
     public interface QuotaUpdater {
         /**
-         * Provide a new quota, specified in bytes.
-         * @param newQuota The new quota, in bytes
+         * Provides a new quota, specified in bytes.
+         *
+         * @param newQuota the new quota, in bytes
          */
         public void updateQuota(long newQuota);
     };
@@ -79,8 +80,9 @@
         }
 
         /**
-         * Get the string representation of this origin.
-         * @return The string representation of this origin
+         * Gets the string representation of this origin.
+         *
+         * @return the string representation of this origin
          */
         // An origin string is created using WebCore::SecurityOrigin::toString().
         // Note that WebCore::SecurityOrigin uses 0 (which is not printed) for
@@ -92,19 +94,21 @@
         }
 
         /**
-         * Get the quota for this origin, for the Web SQL Database API, in
+         * Gets the quota for this origin, for the Web SQL Database API, in
          * bytes. If this origin does not use the Web SQL Database API, this
          * quota will be set to zero.
-         * @return The quota, in bytes.
+         *
+         * @return the quota, in bytes
          */
         public long getQuota() {
             return mQuota;
         }
 
         /**
-         * Get the total amount of storage currently being used by this origin,
+         * Gets the total amount of storage currently being used by this origin,
          * for all JavaScript storage APIs, in bytes.
-         * @return The total amount of storage, in bytes.
+         *
+         * @return the total amount of storage, in bytes
          */
         public long getUsage() {
             return mUsage;
@@ -124,7 +128,7 @@
      */
 
     /**
-     * Get the origins currently using either the Application Cache or Web SQL
+     * Gets the origins currently using either the Application Cache or Web SQL
      * Database APIs. This method operates asynchronously, with the result
      * being provided via a {@link ValueCallback}. The origins are provided as
      * a map, of type {@code Map<String, WebStorage.Origin>}, from the string
@@ -135,7 +139,7 @@
     }
 
     /**
-     * Get the amount of storage currently being used by both the Application
+     * Gets the amount of storage currently being used by both the Application
      * Cache and Web SQL Database APIs by the given origin. The amount is given
      * in bytes and the origin is specified using its string representation.
      * This method operates asynchronously, with the result being provided via
@@ -146,7 +150,7 @@
     }
 
     /**
-     * Get the storage quota for the Web SQL Database API for the given origin.
+     * Gets the storage quota for the Web SQL Database API for the given origin.
      * The quota is given in bytes and the origin is specified using its string
      * representation. This method operates asynchronously, with the result
      * being provided via a {@link ValueCallback}. Note that a quota is not
@@ -157,7 +161,7 @@
     }
 
     /**
-     * Set the storage quota for the Web SQL Database API for the given origin.
+     * Sets the storage quota for the Web SQL Database API for the given origin.
      * The quota is specified in bytes and the origin is specified using its string
      * representation. Note that a quota is not enforced on a per-origin basis
      * for the Application Cache API.
@@ -167,7 +171,7 @@
     }
 
     /**
-     * Clear the storage currently being used by both the Application Cache and
+     * Clears the storage currently being used by both the Application Cache and
      * Web SQL Database APIs by the given origin. The origin is specified using
      * its string representation.
      */
@@ -176,7 +180,7 @@
     }
 
     /**
-     * Clear all storage currently being used by the JavaScript storage APIs.
+     * Clears all storage currently being used by the JavaScript storage APIs.
      * This includes the Application Cache, Web SQL Database and the HTML5 Web
      * Storage APIs.
      */
@@ -185,8 +189,9 @@
     }
 
     /**
-     * Get the singleton instance of this class.
-     * @return The singleton {@link WebStorage} instance.
+     * Gets the singleton instance of this class.
+     *
+     * @return the singleton {@link WebStorage} instance
      */
     public static WebStorage getInstance() {
       return WebViewFactory.getProvider().getWebStorage();
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 74605e2..ba5a417 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -274,16 +274,18 @@
         private WebView mWebview;
 
         /**
-         * Set the WebView to the transportation object.
-         * @param webview The WebView to transport.
+         * Sets the WebView to the transportation object.
+         *
+         * @param webview the WebView to transport
          */
         public synchronized void setWebView(WebView webview) {
             mWebview = webview;
         }
 
         /**
-         * Return the WebView object.
-         * @return WebView The transported WebView object.
+         * Gets the WebView object.
+         *
+         * @return the transported WebView object
          */
         public synchronized WebView getWebView() {
             return mWebview;
@@ -291,15 +293,15 @@
     }
 
     /**
-     * URI scheme for telephone number
+     * URI scheme for telephone number.
      */
     public static final String SCHEME_TEL = "tel:";
     /**
-     * URI scheme for email address
+     * URI scheme for email address.
      */
     public static final String SCHEME_MAILTO = "mailto:";
     /**
-     * URI scheme for map address
+     * URI scheme for map address.
      */
     public static final String SCHEME_GEO = "geo:0,0?q=";
 
@@ -308,13 +310,15 @@
      */
     public interface FindListener {
         /**
-         * Notify the listener about progress made by a find operation.
+         * Notifies the listener about progress made by a find operation.
          *
-         * @param numberOfMatches How many matches have been found.
-         * @param activeMatchOrdinal The zero-based ordinal of the currently selected match.
-         * @param isDoneCounting Whether the find operation has actually completed. The listener
-         * may be notified multiple times while the operation is underway, and the numberOfMatches
-         * value should not be considered final unless isDoneCounting is true.
+         * @param numberOfMatches how many matches have been found
+         * @param activeMatchOrdinal the zero-based ordinal of the currently selected match
+         * @param isDoneCounting whether the find operation has actually completed. The listener
+         *                       may be notified multiple times while the
+         *                       operation is underway, and the numberOfMatches
+         *                       value should not be considered final unless
+         *                       isDoneCounting is true.
          */
         public void onFindResultReceived(int numberOfMatches, int activeMatchOrdinal,
             boolean isDoneCounting);
@@ -322,19 +326,22 @@
 
     /**
      * Interface to listen for new pictures as they change.
+     *
      * @deprecated This interface is now obsolete.
      */
     @Deprecated
     public interface PictureListener {
         /**
-         * Notify the listener that the picture has changed.
-         * @param view The WebView that owns the picture.
-         * @param picture The new picture.
+         * Notifies the listener that the picture has changed.
+         *
+         * @param view the WebView that owns the picture
+         * @param picture the new picture
          * @deprecated Due to internal changes, the picture does not include
-         * composited layers such as fixed position elements or scrollable divs.
-         * While the PictureListener API can still be used to detect changes in
-         * the WebView content, you are advised against its usage until a replacement
-         * is provided in a future Android release
+         *             composited layers such as fixed position elements or
+         *             scrollable divs. While the PictureListener API can still
+         *             be used to detect changes in the WebView content, you
+         *             are advised against its usage until a replacement is
+         *             provided in a future Android release.
          */
         @Deprecated
         public void onNewPicture(WebView view, Picture picture);
@@ -342,7 +349,7 @@
 
     public static class HitTestResult {
         /**
-         * Default HitTestResult, where the target is unknown
+         * Default HitTestResult, where the target is unknown.
          */
         public static final int UNKNOWN_TYPE = 0;
         /**
@@ -351,19 +358,19 @@
         @Deprecated
         public static final int ANCHOR_TYPE = 1;
         /**
-         * HitTestResult for hitting a phone number
+         * HitTestResult for hitting a phone number.
          */
         public static final int PHONE_TYPE = 2;
         /**
-         * HitTestResult for hitting a map address
+         * HitTestResult for hitting a map address.
          */
         public static final int GEO_TYPE = 3;
         /**
-         * HitTestResult for hitting an email address
+         * HitTestResult for hitting an email address.
          */
         public static final int EMAIL_TYPE = 4;
         /**
-         * HitTestResult for hitting an HTML::img tag
+         * HitTestResult for hitting an HTML::img tag.
          */
         public static final int IMAGE_TYPE = 5;
         /**
@@ -372,15 +379,15 @@
         @Deprecated
         public static final int IMAGE_ANCHOR_TYPE = 6;
         /**
-         * HitTestResult for hitting a HTML::a tag with src=http
+         * HitTestResult for hitting a HTML::a tag with src=http.
          */
         public static final int SRC_ANCHOR_TYPE = 7;
         /**
-         * HitTestResult for hitting a HTML::a tag with src=http + HTML::img
+         * HitTestResult for hitting a HTML::a tag with src=http + HTML::img.
          */
         public static final int SRC_IMAGE_ANCHOR_TYPE = 8;
         /**
-         * HitTestResult for hitting an edit text area
+         * HitTestResult for hitting an edit text area.
          */
         public static final int EDIT_TEXT_TYPE = 9;
 
@@ -409,17 +416,21 @@
         }
 
         /**
-         * Gets the type of the hit test result.
-         * @return See the XXX_TYPE constants defined in this class.
+         * Gets the type of the hit test result. See the XXX_TYPE constants
+         * defined in this class.
+         *
+         * @return the type of the hit test result
          */
         public int getType() {
             return mType;
         }
 
         /**
-         * Gets additional type-dependant information about the result, see
-         * {@link WebView#getHitTestResult()} for details.
-         * @return may either be null or contain extra information about this result.
+         * Gets additional type-dependant information about the result. See
+         * {@link WebView#getHitTestResult()} for details. May either be null
+         * or contain extra information about this result.
+         *
+         * @return additional type-dependant information about the result
          */
         public String getExtra() {
             return mExtra;
@@ -427,38 +438,43 @@
     }
 
     /**
-     * Construct a new WebView with a Context object.
-     * @param context A Context object used to access application assets.
+     * Constructs a new WebView with a Context object.
+     *
+     * @param context a Context object used to access application assets
      */
     public WebView(Context context) {
         this(context, null);
     }
 
     /**
-     * Construct a new WebView with layout parameters.
-     * @param context A Context object used to access application assets.
-     * @param attrs An AttributeSet passed to our parent.
+     * Constructs a new WebView with layout parameters.
+     *
+     * @param context a Context object used to access application assets
+     * @param attrs an AttributeSet passed to our parent
      */
     public WebView(Context context, AttributeSet attrs) {
         this(context, attrs, com.android.internal.R.attr.webViewStyle);
     }
 
     /**
-     * Construct a new WebView with layout parameters and a default style.
-     * @param context A Context object used to access application assets.
-     * @param attrs An AttributeSet passed to our parent.
-     * @param defStyle The default style resource ID.
+     * Constructs a new WebView with layout parameters and a default style.
+     *
+     * @param context a Context object used to access application assets
+     * @param attrs an AttributeSet passed to our parent
+     * @param defStyle the default style resource ID
      */
     public WebView(Context context, AttributeSet attrs, int defStyle) {
         this(context, attrs, defStyle, false);
     }
 
     /**
-     * Construct a new WebView with layout parameters and a default style.
-     * @param context A Context object used to access application assets.
-     * @param attrs An AttributeSet passed to our parent.
-     * @param defStyle The default style resource ID.
-     * @param privateBrowsing If true the web view will be initialized in private mode.
+     * Constructs a new WebView with layout parameters and a default style.
+     *
+     * @param context a Context object used to access application assets
+     * @param attrs an AttributeSet passed to our parent
+     * @param defStyle the default style resource ID
+     * @param privateBrowsing whether this WebView will be initialized in
+     *                        private mode
      */
     public WebView(Context context, AttributeSet attrs, int defStyle,
             boolean privateBrowsing) {
@@ -466,18 +482,21 @@
     }
 
     /**
-     * Construct a new WebView with layout parameters, a default style and a set
-     * of custom Javscript interfaces to be added to the WebView at initialization
+     * Constructs a new WebView with layout parameters, a default style and a set
+     * of custom Javscript interfaces to be added to this WebView at initialization
      * time. This guarantees that these interfaces will be available when the JS
      * context is initialized.
-     * @param context A Context object used to access application assets.
-     * @param attrs An AttributeSet passed to our parent.
-     * @param defStyle The default style resource ID.
-     * @param javaScriptInterfaces is a Map of interface names, as keys, and
-     * object implementing those interfaces, as values.
-     * @param privateBrowsing If true the web view will be initialized in private mode.
+     *
+     * @param context a Context object used to access application assets
+     * @param attrs an AttributeSet passed to our parent
+     * @param defStyle the default style resource ID
+     * @param javaScriptInterfaces a Map of interface names, as keys, and
+     *                             object implementing those interfaces, as
+     *                             values
+     * @param privateBrowsing whether this WebView will be initialized in
+     *                        private mode
      * @hide This is used internally by dumprendertree, as it requires the javaScript interfaces to
-     * be added synchronously, before a subsequent loadUrl call takes effect.
+     *       be added synchronously, before a subsequent loadUrl call takes effect.
      */
     @SuppressWarnings("deprecation")  // for super() call into deprecated base class constructor.
     protected WebView(Context context, AttributeSet attrs, int defStyle,
@@ -493,8 +512,9 @@
     }
 
     /**
-     * Specify whether the horizontal scrollbar has overlay style.
-     * @param overlay TRUE if horizontal scrollbar should have overlay style.
+     * Specifies whether the horizontal scrollbar has overlay style.
+     *
+     * @param overlay true if horizontal scrollbar should have overlay style
      */
     public void setHorizontalScrollbarOverlay(boolean overlay) {
         checkThread();
@@ -502,8 +522,9 @@
     }
 
     /**
-     * Specify whether the vertical scrollbar has overlay style.
-     * @param overlay TRUE if vertical scrollbar should have overlay style.
+     * Specifies whether the vertical scrollbar has overlay style.
+     *
+     * @param overlay true if vertical scrollbar should have overlay style
      */
     public void setVerticalScrollbarOverlay(boolean overlay) {
         checkThread();
@@ -511,8 +532,9 @@
     }
 
     /**
-     * Return whether horizontal scrollbar has overlay style
-     * @return TRUE if horizontal scrollbar has overlay style.
+     * Gets whether horizontal scrollbar has overlay style.
+     *
+     * @return true if horizontal scrollbar has overlay style
      */
     public boolean overlayHorizontalScrollbar() {
         checkThread();
@@ -520,8 +542,9 @@
     }
 
     /**
-     * Return whether vertical scrollbar has overlay style
-     * @return TRUE if vertical scrollbar has overlay style.
+     * Gets whether vertical scrollbar has overlay style.
+     *
+     * @return true if vertical scrollbar has overlay style
      */
     public boolean overlayVerticalScrollbar() {
         checkThread();
@@ -529,7 +552,7 @@
     }
 
     /**
-     * Return the visible height (in pixels) of the embedded title bar (if any).
+     * Gets the visible height (in pixels) of the embedded title bar (if any).
      *
      * @deprecated This method is now obsolete.
      */
@@ -539,8 +562,10 @@
     }
 
     /**
-     * @return The SSL certificate for the main top-level page or null if
-     * there is no certificate (the site is not secure).
+     * Gets the SSL certificate for the main top-level page or null if there is
+     * no certificate (the site is not secure).
+     *
+     * @return the SSL certificate for the main top-level page
      */
     public SslCertificate getCertificate() {
         checkThread();
@@ -560,11 +585,12 @@
     //-------------------------------------------------------------------------
 
     /**
-     * Save the username and password for a particular host in the WebView's
+     * Saves the username and password for a particular host in this WebView's
      * internal database.
-     * @param host The host that required the credentials.
-     * @param username The username for the given host.
-     * @param password The password for the given host.
+     *
+     * @param host the host that required the credentials
+     * @param username the username for the given host
+     * @param password the password for the given host
      */
     public void savePassword(String host, String username, String password) {
         checkThread();
@@ -572,13 +598,13 @@
     }
 
     /**
-     * Set the HTTP authentication credentials for a given host and realm.
+     * Sets the HTTP authentication credentials for a given host and realm.
      *
-     * @param host The host for the credentials.
-     * @param realm The realm for the credentials.
-     * @param username The username for the password. If it is null, it means
+     * @param host the host for the credentials
+     * @param realm the realm for the credentials
+     * @param username the username for the password. If it is null, it means
      *                 password can't be saved.
-     * @param password The password
+     * @param password the password
      */
     public void setHttpAuthUsernamePassword(String host, String realm,
             String username, String password) {
@@ -587,12 +613,12 @@
     }
 
     /**
-     * Retrieve the HTTP authentication username and password for a given
-     * host & realm pair
+     * Retrieves the HTTP authentication username and password for a given
+     * host and realm pair
      *
-     * @param host The host for which the credentials apply.
-     * @param realm The realm for which the credentials apply.
-     * @return String[] if found, String[0] is username, which can be null and
+     * @param host the host for which the credentials apply
+     * @param realm the realm for which the credentials apply
+     * @return String[] if found. String[0] is username, which can be null and
      *         String[1] is password. Return null if it can't find anything.
      */
     public String[] getHttpAuthUsernamePassword(String host, String realm) {
@@ -601,9 +627,9 @@
     }
 
     /**
-     * Destroy the internal state of the WebView. This method should be called
-     * after the WebView has been removed from the view system. No other
-     * methods may be called on a WebView after destroy.
+     * Destroys the internal state of this WebView. This method should be called
+     * after this WebView has been removed from the view system. No other
+     * methods may be called on this WebView after destroy.
      */
     public void destroy() {
         checkThread();
@@ -635,10 +661,11 @@
     }
 
     /**
-     * Inform WebView of the network state. This is used to set
+     * Informs WebView of the network state. This is used to set
      * the JavaScript property window.navigator.isOnline and
      * generates the online/offline event as specified in HTML5, sec. 5.7.7
-     * @param networkUp boolean indicating if network is available
+     *
+     * @param networkUp a boolean indicating if network is available
      */
     public void setNetworkAvailable(boolean networkUp) {
         checkThread();
@@ -646,14 +673,15 @@
     }
 
     /**
-     * Save the state of this WebView used in
+     * Saves the state of this WebView used in
      * {@link android.app.Activity#onSaveInstanceState}. Please note that this
      * method no longer stores the display data for this WebView. The previous
      * behavior could potentially leak files if {@link #restoreState} was never
      * called. See {@link #savePicture} and {@link #restorePicture} for saving
      * and restoring the display data.
-     * @param outState The Bundle to store the WebView state.
-     * @return The same copy of the back/forward list used to save the state. If
+     *
+     * @param outState the Bundle to store this WebView's state
+     * @return the same copy of the back/forward list used to save the state. If
      *         saveState fails, the returned list will be null.
      * @see #savePicture
      * @see #restorePicture
@@ -664,12 +692,12 @@
     }
 
     /**
-     * Save the current display data to the Bundle given. Used in conjunction
+     * Saves the current display data to the Bundle given. Used in conjunction
      * with {@link #saveState}.
-     * @param b A Bundle to store the display data.
-     * @param dest The file to store the serialized picture data. Will be
+     * @param b a Bundle to store the display data
+     * @param dest the file to store the serialized picture data. Will be
      *             overwritten with this WebView's picture data.
-     * @return True if the picture was successfully saved.
+     * @return true if the picture was successfully saved
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -679,13 +707,13 @@
     }
 
     /**
-     * Restore the display data that was save in {@link #savePicture}. Used in
-     * conjunction with {@link #restoreState}.
+     * Restores the display data that was saved in {@link #savePicture}. Used in
+     * conjunction with {@link #restoreState}. Note that this will not work if
+     * this WebView is hardware accelerated.
      *
-     * Note that this will not work if the WebView is hardware accelerated.
-     * @param b A Bundle containing the saved display data.
-     * @param src The file where the picture data was stored.
-     * @return True if the picture was successfully restored.
+     * @param b a Bundle containing the saved display data
+     * @param src the file where the picture data was stored
+     * @return true if the picture was successfully restored
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -695,16 +723,17 @@
     }
 
     /**
-     * Restore the state of this WebView from the given map used in
+     * Restores the state of this WebView from the given map used in
      * {@link android.app.Activity#onRestoreInstanceState}. This method should
-     * be called to restore the state of the WebView before using the object. If
-     * it is called after the WebView has had a chance to build state (load
+     * be called to restore the state of this WebView before using the object. If
+     * it is called after this WebView has had a chance to build state (load
      * pages, create a back/forward list, etc.) there may be undesirable
      * side-effects. Please note that this method no longer restores the
      * display data for this WebView. See {@link #savePicture} and {@link
      * #restorePicture} for saving and restoring the display data.
-     * @param inState The incoming Bundle of state.
-     * @return The restored back/forward list or null if restoreState failed.
+     *
+     * @param inState the incoming Bundle of state
+     * @return the restored back/forward list or null if restoreState failed
      * @see #savePicture
      * @see #restorePicture
      */
@@ -714,14 +743,15 @@
     }
 
     /**
-     * Load the given URL with the specified additional HTTP headers.
-     * @param url The URL of the resource to load.
-     * @param additionalHttpHeaders The additional headers to be used in the
+     * Loads the given URL with the specified additional HTTP headers.
+     *
+     * @param url the URL of the resource to load
+     * @param additionalHttpHeaders the additional headers to be used in the
      *            HTTP request for this URL, specified as a map from name to
      *            value. Note that if this map contains any of the headers
-     *            that are set by default by the WebView, such as those
+     *            that are set by default by this WebView, such as those
      *            controlling caching, accept types or the User-Agent, their
-     *            values may be overriden by the WebView's defaults.
+     *            values may be overriden by this WebView's defaults.
      */
     public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
         checkThread();
@@ -729,8 +759,9 @@
     }
 
     /**
-     * Load the given URL.
-     * @param url The URL of the resource to load.
+     * Loads the given URL.
+     *
+     * @param url the URL of the resource to load
      */
     public void loadUrl(String url) {
         checkThread();
@@ -738,12 +769,12 @@
     }
 
     /**
-     * Load the url with postData using "POST" method into the WebView. If url
-     * is not a network url, it will be loaded with {link
+     * Loads the URL with postData using "POST" method into this WebView. If url
+     * is not a network URL, it will be loaded with {link
      * {@link #loadUrl(String)} instead.
      *
-     * @param url The url of the resource to load.
-     * @param postData The data will be passed to "POST" request.
+     * @param url the URL of the resource to load
+     * @param postData the data will be passed to "POST" request
      */
     public void postUrl(String url, byte[] postData) {
         checkThread();
@@ -751,7 +782,7 @@
     }
 
     /**
-     * Load the given data into the WebView using a 'data' scheme URL.
+     * Loads the given data into this WebView using a 'data' scheme URL.
      * <p>
      * Note that JavaScript's same origin policy means that script running in a
      * page loaded using this method will be unable to access content loaded
@@ -772,9 +803,10 @@
      * mediatype portion of the URL and call {@link #loadUrl(String)} instead.
      * Note that the charset obtained from the mediatype portion of a data URL
      * always overrides that specified in the HTML or XML document itself.
-     * @param data A String of data in the given encoding.
-     * @param mimeType The MIME type of the data, e.g. 'text/html'.
-     * @param encoding The encoding of the data.
+     *
+     * @param data a String of data in the given encoding
+     * @param mimeType the MIME type of the data, e.g. 'text/html'
+     * @param encoding the encoding of the data
      */
     public void loadData(String data, String mimeType, String encoding) {
         checkThread();
@@ -782,7 +814,7 @@
     }
 
     /**
-     * Load the given data into the WebView, using baseUrl as the base URL for
+     * Loads the given data into this WebView, using baseUrl as the base URL for
      * the content. The base URL is used both to resolve relative URLs and when
      * applying JavaScript's same origin policy. The historyUrl is used for the
      * history entry.
@@ -794,14 +826,15 @@
      * If the base URL uses the data scheme, this method is equivalent to
      * calling {@link #loadData(String,String,String) loadData()} and the
      * historyUrl is ignored.
-     * @param baseUrl URL to use as the page's base URL. If null defaults to
-     *            'about:blank'
-     * @param data A String of data in the given encoding.
-     * @param mimeType The MIMEType of the data, e.g. 'text/html'. If null,
-     *            defaults to 'text/html'.
-     * @param encoding The encoding of the data.
-     * @param historyUrl URL to use as the history entry, if null defaults to
-     *            'about:blank'.
+     *
+     * @param baseUrl the URL to use as the page's base URL. If null defaults to
+     *                'about:blank'.
+     * @param data a String of data in the given encoding
+     * @param mimeType the MIMEType of the data, e.g. 'text/html'. If null,
+     *                 defaults to 'text/html'.
+     * @param encoding the encoding of the data
+     * @param historyUrl the URL to use as the history entry. If null defaults
+     *                   to 'about:blank'.
      */
     public void loadDataWithBaseURL(String baseUrl, String data,
             String mimeType, String encoding, String historyUrl) {
@@ -812,7 +845,7 @@
     /**
      * Saves the current view as a web archive.
      *
-     * @param filename The filename where the archive should be placed.
+     * @param filename the filename where the archive should be placed
      */
     public void saveWebArchive(String filename) {
         checkThread();
@@ -822,11 +855,11 @@
     /**
      * Saves the current view as a web archive.
      *
-     * @param basename The filename where the archive should be placed.
-     * @param autoname If false, takes basename to be a file. If true, basename
+     * @param basename the filename where the archive should be placed
+     * @param autoname if false, takes basename to be a file. If true, basename
      *                 is assumed to be a directory in which a filename will be
-     *                 chosen according to the url of the current page.
-     * @param callback Called after the web archive has been saved. The
+     *                 chosen according to the URL of the current page.
+     * @param callback called after the web archive has been saved. The
      *                 parameter for onReceiveValue will either be the filename
      *                 under which the file was saved, or null if saving the
      *                 file failed.
@@ -837,7 +870,7 @@
     }
 
     /**
-     * Stop the current load.
+     * Stops the current load.
      */
     public void stopLoading() {
         checkThread();
@@ -845,7 +878,7 @@
     }
 
     /**
-     * Reload the current url.
+     * Reloads the current URL.
      */
     public void reload() {
         checkThread();
@@ -853,8 +886,9 @@
     }
 
     /**
-     * Return true if this WebView has a back history item.
-     * @return True iff this WebView has a back history item.
+     * Gets whether this WebView has a back history item.
+     *
+     * @return true iff this WebView has a back history item
      */
     public boolean canGoBack() {
         checkThread();
@@ -862,7 +896,7 @@
     }
 
     /**
-     * Go back in the history of this WebView.
+     * Goes back in the history of this WebView.
      */
     public void goBack() {
         checkThread();
@@ -870,8 +904,9 @@
     }
 
     /**
-     * Return true if this WebView has a forward history item.
-     * @return True iff this Webview has a forward history item.
+     * Gets whether this WebView has a forward history item.
+     *
+     * @return true iff this Webview has a forward history item
      */
     public boolean canGoForward() {
         checkThread();
@@ -879,7 +914,7 @@
     }
 
     /**
-     * Go forward in the history of this WebView.
+     * Goes forward in the history of this WebView.
      */
     public void goForward() {
         checkThread();
@@ -887,10 +922,11 @@
     }
 
     /**
-     * Return true if the page can go back or forward the given
+     * Gets whether the page can go back or forward the given
      * number of steps.
-     * @param steps The negative or positive number of steps to move the
-     *              history.
+     *
+     * @param steps the negative or positive number of steps to move the
+     *              history
      */
     public boolean canGoBackOrForward(int steps) {
         checkThread();
@@ -898,11 +934,12 @@
     }
 
     /**
-     * Go to the history item that is the number of steps away from
+     * Goes to the history item that is the number of steps away from
      * the current item. Steps is negative if backward and positive
      * if forward.
-     * @param steps The number of steps to take back or forward in the back
-     *              forward list.
+     *
+     * @param steps the number of steps to take back or forward in the back
+     *              forward list
      */
     public void goBackOrForward(int steps) {
         checkThread();
@@ -910,7 +947,7 @@
     }
 
     /**
-     * Returns true if private browsing is enabled in this WebView.
+     * Gets whether private browsing is enabled in this WebView.
      */
     public boolean isPrivateBrowsingEnabled() {
         checkThread();
@@ -918,7 +955,8 @@
     }
 
     /**
-     * Scroll the contents of the view up by half the view size
+     * Scrolls the contents of this WebView up by half the view size.
+     *
      * @param top true to jump to the top of the page
      * @return true if the page was scrolled
      */
@@ -928,7 +966,8 @@
     }
 
     /**
-     * Scroll the contents of the view down by half the page size
+     * Scrolls the contents of this WebView down by half the page size.
+     *
      * @param bottom true to jump to bottom of page
      * @return true if the page was scrolled
      */
@@ -938,8 +977,8 @@
     }
 
     /**
-     * Clear the view so that onDraw() will draw nothing but white background,
-     * and onMeasure() will return 0 if MeasureSpec is not MeasureSpec.EXACTLY
+     * Clears this WebView so that onDraw() will draw nothing but white background,
+     * and onMeasure() will return 0 if MeasureSpec is not MeasureSpec.EXACTLY.
      */
     public void clearView() {
         checkThread();
@@ -947,13 +986,13 @@
     }
 
     /**
-     * Return a new picture that captures the current display of the webview.
-     * This is a copy of the display, and will be unaffected if the webview
+     * Gets a new picture that captures the current display of this WebView.
+     * This is a copy of the display, and will be unaffected if this WebView
      * later loads a different URL.
      *
-     * @return a picture containing the current contents of the view. Note this
-     *         picture is of the entire document, and is not restricted to the
-     *         bounds of the view.
+     * @return a picture containing the current contents of this WebView. Note
+     *         this picture is of the entire document, and is not restricted to
+     *         the bounds of the view.
      */
     public Picture capturePicture() {
         checkThread();
@@ -961,8 +1000,9 @@
     }
 
     /**
-     * Return the current scale of the WebView
-     * @return The current scale.
+     * Gets the current scale of this WebView.
+     *
+     * @return the current scale
      */
     public float getScale() {
         checkThread();
@@ -970,14 +1010,14 @@
     }
 
     /**
-     * Set the initial scale for the WebView. 0 means default. If
+     * Sets the initial scale for this WebView. 0 means default. If
      * {@link WebSettings#getUseWideViewPort()} is true, it zooms out all the
      * way. Otherwise it starts with 100%. If initial scale is greater than 0,
      * WebView starts with this value as initial scale.
      * Please note that unlike the scale properties in the viewport meta tag,
      * this method doesn't take the screen density into account.
      *
-     * @param scaleInPercent The initial scale in percent.
+     * @param scaleInPercent the initial scale in percent
      */
     public void setInitialScale(int scaleInPercent) {
         checkThread();
@@ -985,7 +1025,7 @@
     }
 
     /**
-     * Invoke the graphical zoom picker widget for this WebView. This will
+     * Invokes the graphical zoom picker widget for this WebView. This will
      * result in the zoom widget appearing on the screen to control the zoom
      * level of this WebView.
      */
@@ -995,15 +1035,15 @@
     }
 
     /**
-     * Return a HitTestResult based on the current cursor node. If a HTML::a tag
-     * is found and the anchor has a non-JavaScript url, the HitTestResult type
-     * is set to SRC_ANCHOR_TYPE and the url is set in the "extra" field. If the
-     * anchor does not have a url or if it is a JavaScript url, the type will
-     * be UNKNOWN_TYPE and the url has to be retrieved through
+     * Gets a HitTestResult based on the current cursor node. If a HTML::a
+     * tag is found and the anchor has a non-JavaScript URL, the HitTestResult
+     * type is set to SRC_ANCHOR_TYPE and the URL is set in the "extra" field.
+     * If the anchor does not have a URL or if it is a JavaScript URL, the type
+     * will be UNKNOWN_TYPE and the URL has to be retrieved through
      * {@link #requestFocusNodeHref} asynchronously. If a HTML::img tag is
-     * found, the HitTestResult type is set to IMAGE_TYPE and the url is set in
+     * found, the HitTestResult type is set to IMAGE_TYPE and the URL is set in
      * the "extra" field. A type of
-     * SRC_IMAGE_ANCHOR_TYPE indicates an anchor with a url that has an image as
+     * SRC_IMAGE_ANCHOR_TYPE indicates an anchor with a URL that has an image as
      * a child node. If a phone number is found, the HitTestResult type is set
      * to PHONE_TYPE and the phone number is set in the "extra" field of
      * HitTestResult. If a map address is found, the HitTestResult type is set
@@ -1018,18 +1058,17 @@
     }
 
     /**
-     * Request the anchor or image element URL at the last tapped point.
+     * Requests the anchor or image element URL at the last tapped point.
      * If hrefMsg is null, this method returns immediately and does not
      * dispatch hrefMsg to its target. If the tapped point hits an image,
      * an anchor, or an image in an anchor, the message associates
      * strings in named keys in its data. The value paired with the key
      * may be an empty string.
      *
-     * @param hrefMsg This message will be dispatched with the result of the
-     *                request. The message data contains three keys:
-     *                - "url" returns the anchor's href attribute.
-     *                - "title" returns the anchor's text.
-     *                - "src" returns the image's src attribute.
+     * @param hrefMsg the message to be dispatched with the result of the
+     *                request. The message data contains three keys. "url"
+     *                returns the anchor's href attribute. "title" returns the
+     *                anchor's text. "src" returns the image's src attribute.
      */
     public void requestFocusNodeHref(Message hrefMsg) {
         checkThread();
@@ -1037,10 +1076,10 @@
     }
 
     /**
-     * Request the url of the image last touched by the user. msg will be sent
-     * to its target with a String representing the url as its object.
+     * Requests the URL of the image last touched by the user. msg will be sent
+     * to its target with a String representing the URL as its object.
      *
-     * @param msg This message will be dispatched with the result of the request
+     * @param msg the message to be dispatched with the result of the request
      *            as the data member with "url" as key. The result can be null.
      */
     public void requestImageRef(Message msg) {
@@ -1049,10 +1088,11 @@
     }
 
     /**
-     * Get the url for the current page. This is not always the same as the url
+     * Gets the URL for the current page. This is not always the same as the URL
      * passed to WebViewClient.onPageStarted because although the load for
-     * that url has begun, the current page may not have changed.
-     * @return The url for the current page.
+     * that URL has begun, the current page may not have changed.
+     *
+     * @return the URL for the current page
      */
     public String getUrl() {
         checkThread();
@@ -1060,12 +1100,13 @@
     }
 
     /**
-     * Get the original url for the current page. This is not always the same
-     * as the url passed to WebViewClient.onPageStarted because although the
-     * load for that url has begun, the current page may not have changed.
-     * Also, there may have been redirects resulting in a different url to that
+     * Gets the original URL for the current page. This is not always the same
+     * as the URL passed to WebViewClient.onPageStarted because although the
+     * load for that URL has begun, the current page may not have changed.
+     * Also, there may have been redirects resulting in a different URL to that
      * originally requested.
-     * @return The url that was originally requested for the current page.
+     *
+     * @return the URL that was originally requested for the current page
      */
     public String getOriginalUrl() {
         checkThread();
@@ -1073,9 +1114,10 @@
     }
 
     /**
-     * Get the title for the current page. This is the title of the current page
+     * Gets the title for the current page. This is the title of the current page
      * until WebViewClient.onReceivedTitle is called.
-     * @return The title for the current page.
+     *
+     * @return the title for the current page
      */
     public String getTitle() {
         checkThread();
@@ -1083,9 +1125,10 @@
     }
 
     /**
-     * Get the favicon for the current page. This is the favicon of the current
+     * Gets the favicon for the current page. This is the favicon of the current
      * page until WebViewClient.onReceivedIcon is called.
-     * @return The favicon for the current page.
+     *
+     * @return the favicon for the current page
      */
     public Bitmap getFavicon() {
         checkThread();
@@ -1093,9 +1136,10 @@
     }
 
     /**
-     * Get the touch icon url for the apple-touch-icon <link> element, or
+     * Gets the touch icon URL for the apple-touch-icon <link> element, or
      * a URL on this site's server pointing to the standard location of a
      * touch icon.
+     *
      * @hide
      */
     public String getTouchIconUrl() {
@@ -1103,8 +1147,9 @@
     }
 
     /**
-     * Get the progress for the current page.
-     * @return The progress for the current page between 0 and 100.
+     * Gets the progress for the current page.
+     *
+     * @return the progress for the current page between 0 and 100
      */
     public int getProgress() {
         checkThread();
@@ -1112,7 +1157,9 @@
     }
 
     /**
-     * @return the height of the HTML content.
+     * Gets the height of the HTML content.
+     *
+     * @return the height of the HTML content
      */
     public int getContentHeight() {
         checkThread();
@@ -1120,7 +1167,9 @@
     }
 
     /**
-     * @return the width of the HTML content.
+     * Gets the width of the HTML content.
+     *
+     * @return the width of the HTML content
      * @hide
      */
     public int getContentWidth() {
@@ -1128,8 +1177,8 @@
     }
 
     /**
-     * Pause all layout, parsing, and JavaScript timers for all webviews. This
-     * is a global requests, not restricted to just this webview. This can be
+     * Pauses all layout, parsing, and JavaScript timers for all WebViews. This
+     * is a global requests, not restricted to just this WebView. This can be
      * useful if the application has been paused.
      */
     public void pauseTimers() {
@@ -1138,7 +1187,7 @@
     }
 
     /**
-     * Resume all layout, parsing, and JavaScript timers for all webviews.
+     * Resumes all layout, parsing, and JavaScript timers for all WebViews.
      * This will resume dispatching all timers.
      */
     public void resumeTimers() {
@@ -1147,11 +1196,10 @@
     }
 
     /**
-     * Call this to pause any extra processing associated with this WebView and
-     * its associated DOM, plugins, JavaScript etc. For example, if the WebView
-     * is taken offscreen, this could be called to reduce unnecessary CPU or
-     * network traffic. When the WebView is again "active", call onResume().
-     *
+     * Pauses any extra processing associated with this WebView and its
+     * associated DOM, plugins, JavaScript etc. For example, if this WebView is
+     * taken offscreen, this could be called to reduce unnecessary CPU or
+     * network traffic. When this WebView is again "active", call onResume().
      * Note that this differs from pauseTimers(), which affects all WebViews.
      */
     public void onPause() {
@@ -1160,7 +1208,7 @@
     }
 
     /**
-     * Call this to resume a WebView after a previous call to onPause().
+     * Resumes a WebView after a previous call to onPause().
      */
     public void onResume() {
         checkThread();
@@ -1168,8 +1216,9 @@
     }
 
     /**
-     * Returns true if the view is paused, meaning onPause() was called. Calling
-     * onResume() sets the paused state back to false.
+     * Gets whether this WebView is paused, meaning onPause() was called.
+     * Calling onResume() sets the paused state back to false.
+     *
      * @hide
      */
     public boolean isPaused() {
@@ -1177,8 +1226,8 @@
     }
 
     /**
-     * Call this to inform the view that memory is low so that it can
-     * free any available memory.
+     * Informs this WebView that memory is low so that it can free any available
+     * memory.
      */
     public void freeMemory() {
         checkThread();
@@ -1186,10 +1235,10 @@
     }
 
     /**
-     * Clear the resource cache. Note that the cache is per-application, so
+     * Clears the resource cache. Note that the cache is per-application, so
      * this will clear the cache for all WebViews used.
      *
-     * @param includeDiskFiles If false, only the RAM cache is cleared.
+     * @param includeDiskFiles if false, only the RAM cache is cleared
      */
     public void clearCache(boolean includeDiskFiles) {
         checkThread();
@@ -1197,7 +1246,7 @@
     }
 
     /**
-     * Make sure that clearing the form data removes the adapter from the
+     * Makes sure that clearing the form data removes the adapter from the
      * currently focused textfield if there is one.
      */
     public void clearFormData() {
@@ -1206,7 +1255,7 @@
     }
 
     /**
-     * Tell the WebView to clear its internal back/forward list.
+     * Tells this WebView to clear its internal back/forward list.
      */
     public void clearHistory() {
         checkThread();
@@ -1214,8 +1263,8 @@
     }
 
     /**
-     * Clear the SSL preferences table stored in response to proceeding with SSL
-     * certificate errors.
+     * Clears the SSL preferences table stored in response to proceeding with
+     * SSL certificate errors.
      */
     public void clearSslPreferences() {
         checkThread();
@@ -1223,7 +1272,7 @@
     }
 
     /**
-     * Return the WebBackForwardList for this WebView. This contains the
+     * Gets the WebBackForwardList for this WebView. This contains the
      * back/forward list for use in querying each item in the history stack.
      * This is a copy of the private WebBackForwardList so it contains only a
      * snapshot of the current state. Multiple calls to this method may return
@@ -1237,10 +1286,10 @@
     }
 
     /**
-     * Register the listener to be notified as find-on-page operations progress.
-     * This will replace the current listener.
+     * Registers the listener to be notified as find-on-page operations
+     * progress. This will replace the current listener.
      *
-     * @param listener An implementation of {@link FindListener}.
+     * @param listener an implementation of {@link FindListener}
      */
     public void setFindListener(FindListener listener) {
         checkThread();
@@ -1248,14 +1297,14 @@
     }
 
     /**
-     * Highlight and scroll to the next match found by {@link #findAll} or
+     * Highlights and scrolls to the next match found by {@link #findAll} or
      * {@link #findAllAsync}, wrapping around page boundaries as necessary.
      * Notifies any registered {@link FindListener}. If neither
      * {@link #findAll} nor {@link #findAllAsync(String)} has been called yet,
      * or if {@link #clearMatches} has been called since the last find
      * operation, this function does nothing.
      *
-     * @param forward Direction to search.
+     * @param forward the direction to search
      * @see #setFindListener
      */
     public void findNext(boolean forward) {
@@ -1264,12 +1313,11 @@
     }
 
     /**
-     * Find all instances of find on the page and highlight them.
+     * Finds all instances of find on the page and highlights them.
      * Notifies any registered {@link FindListener}.
      *
-     * @param find  String to find.
-     * @return int  The number of occurances of the String "find"
-     *              that were found.
+     * @param find the string to find
+     * @return the number of occurances of the String "find" that were found
      * @deprecated {@link #findAllAsync} is preferred.
      * @see #setFindListener
      */
@@ -1281,12 +1329,12 @@
     }
 
     /**
-     * Find all instances of find on the page and highlight them,
+     * Finds all instances of find on the page and highlights them,
      * asynchronously. Notifies any registered {@link FindListener}.
      * Successive calls to this or {@link #findAll} will cancel any
      * pending searches.
      *
-     * @param find  String to find.
+     * @param find the string to find.
      * @see #setFindListener
      */
     public void findAllAsync(String find) {
@@ -1295,14 +1343,15 @@
     }
 
     /**
-     * Start an ActionMode for finding text in this WebView.  Only works if this
-     *              WebView is attached to the view system.
-     * @param text If non-null, will be the initial text to search for.
+     * Starts an ActionMode for finding text in this WebView.  Only works if this
+     * WebView is attached to the view system.
+     *
+     * @param text if non-null, will be the initial text to search for.
      *             Otherwise, the last String searched for in this WebView will
      *             be used to start.
-     * @param showIme If true, show the IME, assuming the user will begin typing.
-     *             If false and text is non-null, perform a find all.
-     * @return boolean True if the find dialog is shown, false otherwise.
+     * @param showIme if true, show the IME, assuming the user will begin typing.
+     *                If false and text is non-null, perform a find all.
+     * @return true if the find dialog is shown, false otherwise
      */
     public boolean showFindDialog(String text, boolean showIme) {
         checkThread();
@@ -1310,24 +1359,26 @@
     }
 
     /**
-     * Return the first substring consisting of the address of a physical
+     * Gets the first substring consisting of the address of a physical
      * location. Currently, only addresses in the United States are detected,
      * and consist of:
-     * - a house number
-     * - a street name
-     * - a street type (Road, Circle, etc), either spelled out or abbreviated
-     * - a city name
-     * - a state or territory, either spelled out or two-letter abbr.
-     * - an optional 5 digit or 9 digit zip code.
-     *
+     * <ul>
+     *   <li>a house number</li>
+     *   <li>a street name</li>
+     *   <li>a street type (Road, Circle, etc), either spelled out or
+     *       abbreviated</li>
+     *   <li>a city name</li>
+     *   <li>a state or territory, either spelled out or two-letter abbr</li>
+     *   <li>an optional 5 digit or 9 digit zip code</li>
+     * </ul>
      * All names must be correctly capitalized, and the zip code, if present,
      * must be valid for the state. The street type must be a standard USPS
      * spelling or abbreviation. The state or territory must also be spelled
      * or abbreviated using USPS standards. The house number may not exceed
      * five digits.
-     * @param addr The string to search for addresses.
      *
-     * @return the address, or if no address is found, return null.
+     * @param addr the string to search for addresses
+     * @return the address, or if no address is found, null
      */
     public static String findAddress(String addr) {
         checkThread();
@@ -1335,7 +1386,7 @@
     }
 
     /**
-     * Clear the highlighting surrounding text matches created by
+     * Clears the highlighting surrounding text matches created by
      * {@link #findAll} or {@link #findAllAsync}.
      */
     public void clearMatches() {
@@ -1344,10 +1395,11 @@
     }
 
     /**
-     * Query the document to see if it contains any image references. The
+     * Queries the document to see if it contains any image references. The
      * message object will be dispatched with arg1 being set to 1 if images
      * were found and 0 if the document does not reference any images.
-     * @param response The message that will be dispatched with the result.
+     *
+     * @param response the message that will be dispatched with the result
      */
     public void documentHasImages(Message response) {
         checkThread();
@@ -1355,9 +1407,10 @@
     }
 
     /**
-     * Set the WebViewClient that will receive various notifications and
+     * Sets the WebViewClient that will receive various notifications and
      * requests. This will replace the current handler.
-     * @param client An implementation of WebViewClient.
+     *
+     * @param client an implementation of WebViewClient
      */
     public void setWebViewClient(WebViewClient client) {
         checkThread();
@@ -1365,10 +1418,11 @@
     }
 
     /**
-     * Register the interface to be used when content can not be handled by
+     * Registers the interface to be used when content can not be handled by
      * the rendering engine, and should be downloaded instead. This will replace
      * the current handler.
-     * @param listener An implementation of DownloadListener.
+     *
+     * @param listener an implementation of DownloadListener
      */
     public void setDownloadListener(DownloadListener listener) {
         checkThread();
@@ -1376,10 +1430,11 @@
     }
 
     /**
-     * Set the chrome handler. This is an implementation of WebChromeClient for
+     * Sets the chrome handler. This is an implementation of WebChromeClient for
      * use in handling JavaScript dialogs, favicons, titles, and the progress.
      * This will replace the current handler.
-     * @param client An implementation of WebChromeClient.
+     *
+     * @param client an implementation of WebChromeClient
      */
     public void setWebChromeClient(WebChromeClient client) {
         checkThread();
@@ -1387,9 +1442,10 @@
     }
 
     /**
-     * Set the Picture listener. This is an interface used to receive
+     * Sets the Picture listener. This is an interface used to receive
      * notifications of a new Picture.
-     * @param listener An implementation of WebView.PictureListener.
+     *
+     * @param listener an implementation of WebView.PictureListener
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -1419,7 +1475,7 @@
      * permissions of the host application. Use extreme care when using this
      * method in a WebView which could contain untrusted content.</li>
      * <li> JavaScript interacts with Java object on a private, background
-     * thread of the WebView. Care is therefore required to maintain thread
+     * thread of this WebView. Care is therefore required to maintain thread
      * safety.</li>
      * </ul>
      *
@@ -1445,10 +1501,11 @@
     }
 
     /**
-     * Return the WebSettings object used to control the settings for this
+     * Gets the WebSettings object used to control the settings for this
      * WebView.
-     * @return A WebSettings object that can be used to control this WebView's
-     *         settings.
+     *
+     * @return a WebSettings object that can be used to control this WebView's
+     *         settings
      */
     public WebSettings getSettings() {
         checkThread();
@@ -1456,11 +1513,11 @@
     }
 
     /**
-     * Return the list of currently loaded plugins.
-     * @return The list of currently loaded plugins.
+     * Gets the list of currently loaded plugins.
      *
-     * @hide
+     * @return the list of currently loaded plugins
      * @deprecated This was used for Gears, which has been deprecated.
+     * @hide
      */
     @Deprecated
     public static synchronized PluginList getPluginList() {
@@ -1469,8 +1526,8 @@
     }
 
     /**
-     * @hide
      * @deprecated This was used for Gears, which has been deprecated.
+     * @hide
      */
     @Deprecated
     public void refreshPlugins(boolean reloadOpenPages) {
@@ -1478,8 +1535,9 @@
     }
 
     /**
-     * Use this method to put the WebView into text selection mode.
-     * Do not rely on this functionality; it will be deprecated in the future.
+     * Puts this WebView into text selection mode. Do not rely on this
+     * functionality; it will be deprecated in the future.
+     *
      * @deprecated This method is now obsolete.
      */
     @Deprecated
@@ -1528,15 +1586,15 @@
     }
 
     /**
-     * Gets the zoom controls for the WebView, as a separate View. The caller is
-     * responsible for inserting this View into the layout hierarchy.
+     * Gets the zoom controls for this WebView, as a separate View. The caller
+     * is responsible for inserting this View into the layout hierarchy.
      * <p/>
      * API level {@link android.os.Build.VERSION_CODES#CUPCAKE} introduced
      * built-in zoom mechanisms for the WebView, as opposed to these separate
      * zoom controls. The built-in mechanisms are preferred and can be enabled
      * using {@link WebSettings#setBuiltInZoomControls}.
      *
-     * @deprecated The built-in zoom mechanisms are preferred.
+     * @deprecated the built-in zoom mechanisms are preferred
      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
      */
     @Deprecated
@@ -1546,7 +1604,9 @@
     }
 
     /**
-     * @return TRUE if the WebView can be zoomed in.
+     * Gets whether this WebView can be zoomed in.
+     *
+     * @return true if this WebView can be zoomed in
      */
     public boolean canZoomIn() {
         checkThread();
@@ -1554,7 +1614,9 @@
     }
 
     /**
-     * @return TRUE if the WebView can be zoomed out.
+     * Gets whether this WebView can be zoomed out.
+     *
+     * @return true if this WebView can be zoomed out
      */
     public boolean canZoomOut() {
         checkThread();
@@ -1562,8 +1624,9 @@
     }
 
     /**
-     * Perform zoom in in the webview
-     * @return TRUE if zoom in succeeds. FALSE if no zoom changes.
+     * Performs zoom in in this WebView.
+     *
+     * @return true if zoom in succeeds, false if no zoom changes
      */
     public boolean zoomIn() {
         checkThread();
@@ -1571,8 +1634,9 @@
     }
 
     /**
-     * Perform zoom out in the webview
-     * @return TRUE if zoom out succeeds. FALSE if no zoom changes.
+     * Performs zoom out in this WebView.
+     *
+     * @return true if zoom out succeeds, false if no zoom changes
      */
     public boolean zoomOut() {
         checkThread();
@@ -1593,8 +1657,9 @@
     //-------------------------------------------------------------------------
 
     /**
-     * Used by providers to obtain the underlying implementation, e.g. when the appliction
-     * responds to WebViewClient.onCreateWindow() request.
+     * Gets the WebViewProvider. Used by providers to obtain the underlying
+     * implementation, e.g. when the appliction responds to
+     * WebViewClient.onCreateWindow() request.
      *
      * @hide WebViewProvider is not public API.
      */
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 05b3e64..ca17d31 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -701,7 +701,7 @@
     // A final CallbackProxy shared by WebViewCore and BrowserFrame.
     private CallbackProxy mCallbackProxy;
 
-    private WebViewDatabase mDatabase;
+    private WebViewDatabaseClassic mDatabase;
 
     // SSL certificate for the main top-level page (if secure)
     private SslCertificate mCertificate;
@@ -1230,7 +1230,7 @@
         mViewManager = new ViewManager(this);
         L10nUtils.setApplicationContext(context.getApplicationContext());
         mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javaScriptInterfaces);
-        mDatabase = WebViewDatabase.getInstance(context);
+        mDatabase = WebViewDatabaseClassic.getInstance(context);
         mScroller = new OverScroller(context, null, 0, 0, false); //TODO Use OverScroller's flywheel
         mZoomManager = new ZoomManager(this, mCallbackProxy);
 
@@ -1294,6 +1294,11 @@
         public WebStorage getWebStorage() {
             return WebStorageClassic.getInstance();
         }
+
+        @Override
+        public WebViewDatabase getWebViewDatabase(Context context) {
+            return WebViewDatabaseClassic.getInstance(context);
+        }
     }
 
     private void onHandleUiEvent(MotionEvent event, int eventType, int flags) {
@@ -2598,7 +2603,8 @@
      */
     @Override
     public boolean isPrivateBrowsingEnabled() {
-        return getSettings().isPrivateBrowsingEnabled();
+        WebSettingsClassic settings = getSettings();
+        return (settings != null) ? settings.isPrivateBrowsingEnabled() : false;
     }
 
     private void startPrivateBrowsing() {
@@ -2668,7 +2674,7 @@
     public void clearView() {
         mContentWidth = 0;
         mContentHeight = 0;
-        setBaseLayer(0, null, false, false);
+        setBaseLayer(0, false, false);
         mWebViewCore.sendMessage(EventHub.CLEAR_CONTENT);
     }
 
@@ -3039,14 +3045,14 @@
     // the scale factor is not 1)
     private void calcOurContentVisibleRectF(RectF r) {
         calcOurVisibleRect(mContentVisibleRect);
-        r.left = viewToContentXf(mContentVisibleRect.left);
+        r.left = viewToContentXf(mContentVisibleRect.left) / mWebView.getScaleX();
         // viewToContentY will remove the total height of the title bar.  Add
         // the visible height back in to account for the fact that if the title
         // bar is partially visible, the part of the visible rect which is
         // displaying our content is displaced by that amount.
-        r.top = viewToContentYf(mContentVisibleRect.top + getVisibleTitleHeightImpl());
-        r.right = viewToContentXf(mContentVisibleRect.right);
-        r.bottom = viewToContentYf(mContentVisibleRect.bottom);
+        r.top = viewToContentYf(mContentVisibleRect.top + getVisibleTitleHeightImpl()) / mWebView.getScaleY();
+        r.right = viewToContentXf(mContentVisibleRect.right) / mWebView.getScaleX();
+        r.bottom = viewToContentYf(mContentVisibleRect.bottom) / mWebView.getScaleY();
     }
 
     static class ViewSizeData {
@@ -4447,12 +4453,12 @@
      */
     private SelectActionModeCallback mSelectCallback;
 
-    void setBaseLayer(int layer, Region invalRegion, boolean showVisualIndicator,
+    void setBaseLayer(int layer, boolean showVisualIndicator,
             boolean isPictureAfterFirstLayout) {
         if (mNativeClass == 0)
             return;
         boolean queueFull;
-        queueFull = nativeSetBaseLayer(mNativeClass, layer, invalRegion,
+        queueFull = nativeSetBaseLayer(mNativeClass, layer,
                                        showVisualIndicator, isPictureAfterFirstLayout);
 
         if (queueFull) {
@@ -7191,8 +7197,7 @@
                     break;
                 }
                 case NEVER_REMEMBER_PASSWORD: {
-                    mDatabase.setUsernamePassword(
-                            msg.getData().getString("host"), null, null);
+                    mDatabase.setUsernamePassword(msg.getData().getString("host"), null, null);
                     ((Message) msg.obj).sendToTarget();
                     break;
                 }
@@ -7847,7 +7852,7 @@
         boolean isPictureAfterFirstLayout = viewState != null;
 
         if (updateBaseLayer) {
-            setBaseLayer(draw.mBaseLayer, draw.mInvalRegion,
+            setBaseLayer(draw.mBaseLayer,
                     getSettings().getShowVisualIndicator(),
                     isPictureAfterFirstLayout);
         }
@@ -7879,15 +7884,17 @@
         }
         mSendScrollEvent = true;
 
-        if (DebugFlags.WEB_VIEW) {
-            Rect b = draw.mInvalRegion.getBounds();
-            Log.v(LOGTAG, "NEW_PICTURE_MSG_ID {" +
-                    b.left+","+b.top+","+b.right+","+b.bottom+"}");
+        int functor = 0;
+        if (mWebView.isHardwareAccelerated()
+                || mWebView.getLayerType() != View.LAYER_TYPE_HARDWARE) {
+            functor = nativeGetDrawGLFunction(mNativeClass);
         }
-        Rect invalBounds = draw.mInvalRegion.getBounds();
-        if (!invalBounds.isEmpty()) {
-            invalidateContentRect(invalBounds);
+
+        if (functor != 0) {
+            mWebView.getViewRootImpl().attachFunctor(functor);
         } else {
+            // invalidate the screen so that the next repaint will show new content
+            // TODO: partial invalidate
             mWebView.invalidate();
         }
 
@@ -8575,8 +8582,7 @@
     private native Rect     nativeLayerBounds(int layer);
     private native void     nativeSetHeightCanMeasure(boolean measure);
     private native boolean  nativeSetBaseLayer(int nativeInstance,
-            int layer, Region invalRegion,
-            boolean showVisualIndicator, boolean isPictureAfterFirstLayout);
+            int layer, boolean showVisualIndicator, boolean isPictureAfterFirstLayout);
     private native int      nativeGetBaseLayer();
     private native void     nativeReplaceBaseContent(int content);
     private native void     nativeCopyBaseContentToPicture(Picture pict);
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 75141fd..12c9d69 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -601,8 +601,7 @@
      * Redraw a portion of the picture set. The Point wh returns the
      * width and height of the overall picture.
      */
-    private native int nativeRecordContent(int nativeClass, Region invalRegion,
-            Point wh);
+    private native int nativeRecordContent(int nativeClass, Point wh);
 
     /**
      * Notify webkit that animations have begun (on the hardware accelerated content)
@@ -2180,11 +2179,9 @@
     static class DrawData {
         DrawData() {
             mBaseLayer = 0;
-            mInvalRegion = new Region();
             mContentSize = new Point();
         }
         int mBaseLayer;
-        Region mInvalRegion;
         // view size that was used by webkit during the most recent layout
         Point mViewSize;
         Point mContentSize;
@@ -2230,8 +2227,7 @@
         mDrawIsScheduled = false;
         DrawData draw = new DrawData();
         if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw start");
-        draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mInvalRegion,
-                draw.mContentSize);
+        draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mContentSize);
         if (draw.mBaseLayer == 0) {
             if (mWebViewClassic != null && !mWebViewClassic.isPaused()) {
                 if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort, resending draw message");
@@ -2277,8 +2273,7 @@
         // the draw path (and fix saving <canvas>)
         DrawData draw = new DrawData();
         if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "saveViewState start");
-        draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mInvalRegion,
-                draw.mContentSize);
+        draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mContentSize);
         boolean result = false;
         try {
             result = ViewStateSerializer.serializeViewState(stream, draw);
diff --git a/core/java/android/webkit/WebViewDatabase.java b/core/java/android/webkit/WebViewDatabase.java
index 6c35f19..9d10d67 100644
--- a/core/java/android/webkit/WebViewDatabase.java
+++ b/core/java/android/webkit/WebViewDatabase.java
@@ -16,611 +16,79 @@
 
 package android.webkit;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import android.content.ContentValues;
 import android.content.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteException;
-import android.database.sqlite.SQLiteStatement;
-import android.util.Log;
 
+/**
+ * This class allows developers to determine whether any WebView used in the
+ * application has stored any of the following types of browsing data and
+ * to clear any such stored data for all WebViews in the application.
+ * <ul>
+ *  <li>Username/password pairs entered into web forms</li>
+ *  <li>HTTP authentication username/password pairs</li>
+ *  <li>Data entered into text fields (e.g. for autocomplete suggestions)</li>
+ * </ul>
+ */
 public class WebViewDatabase {
-    private static final String DATABASE_FILE = "webview.db";
-    private static final String CACHE_DATABASE_FILE = "webviewCache.db";
-
-    // log tag
+    // TODO: deprecate/hide this.
     protected static final String LOGTAG = "webviewdatabase";
 
-    private static final int DATABASE_VERSION = 11;
-    // 2 -> 3 Modified Cache table to allow cache of redirects
-    // 3 -> 4 Added Oma-Downloads table
-    // 4 -> 5 Modified Cache table to support persistent contentLength
-    // 5 -> 4 Removed Oma-Downoads table
-    // 5 -> 6 Add INDEX for cache table
-    // 6 -> 7 Change cache localPath from int to String
-    // 7 -> 8 Move cache to its own db
-    // 8 -> 9 Store both scheme and host when storing passwords
-    // 9 -> 10 Update httpauth table UNIQUE
-    // 10 -> 11 Drop cookies and cache now managed by the chromium stack,
-    //          and update the form data table to use the new format
-    //          implemented for b/5265606.
-
-    private static WebViewDatabase mInstance = null;
-
-    private static SQLiteDatabase mDatabase = null;
-
-    // synchronize locks
-    private final Object mPasswordLock = new Object();
-    private final Object mFormLock = new Object();
-    private final Object mHttpAuthLock = new Object();
-
-    private static final String mTableNames[] = {
-        "password", "formurl", "formdata", "httpauth"
-    };
-
-    // Table ids (they are index to mTableNames)
-    private static final int TABLE_PASSWORD_ID = 0;
-    private static final int TABLE_FORMURL_ID = 1;
-    private static final int TABLE_FORMDATA_ID = 2;
-    private static final int TABLE_HTTPAUTH_ID = 3;
-
-    // column id strings for "_id" which can be used by any table
-    private static final String ID_COL = "_id";
-
-    private static final String[] ID_PROJECTION = new String[] {
-        "_id"
-    };
-
-    // column id strings for "password" table
-    private static final String PASSWORD_HOST_COL = "host";
-    private static final String PASSWORD_USERNAME_COL = "username";
-    private static final String PASSWORD_PASSWORD_COL = "password";
-
-    // column id strings for "formurl" table
-    private static final String FORMURL_URL_COL = "url";
-
-    // column id strings for "formdata" table
-    private static final String FORMDATA_URLID_COL = "urlid";
-    private static final String FORMDATA_NAME_COL = "name";
-    private static final String FORMDATA_VALUE_COL = "value";
-
-    // column id strings for "httpauth" table
-    private static final String HTTPAUTH_HOST_COL = "host";
-    private static final String HTTPAUTH_REALM_COL = "realm";
-    private static final String HTTPAUTH_USERNAME_COL = "username";
-    private static final String HTTPAUTH_PASSWORD_COL = "password";
-
-    // Initially true until the background thread completes.
-    private boolean mInitialized = false;
-
-    private WebViewDatabase(final Context context) {
-        new Thread() {
-            @Override
-            public void run() {
-                init(context);
-            }
-        }.start();
-
-        // Singleton only, use getInstance()
+    /**
+     * @hide Only for use by WebViewProvider implementations.
+     */
+    protected WebViewDatabase() {
     }
 
     public static synchronized WebViewDatabase getInstance(Context context) {
-        if (mInstance == null) {
-            mInstance = new WebViewDatabase(context);
-        }
-        return mInstance;
-    }
-
-    private synchronized void init(Context context) {
-        if (mInitialized) {
-            return;
-        }
-
-        initDatabase(context);
-	// Before using the Chromium HTTP stack, we stored the WebKit cache in
-	// our own DB. Clean up the DB file if it's still around.
-        context.deleteDatabase(CACHE_DATABASE_FILE);
-
-        // Thread done, notify.
-        mInitialized = true;
-        notify();
-    }
-
-    private void initDatabase(Context context) {
-        try {
-            mDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0, null);
-        } catch (SQLiteException e) {
-            // try again by deleting the old db and create a new one
-            if (context.deleteDatabase(DATABASE_FILE)) {
-                mDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0,
-                        null);
-            }
-        }
-
-        // mDatabase should not be null,
-        // the only case is RequestAPI test has problem to create db
-        if (mDatabase == null) {
-            mInitialized = true;
-            notify();
-            return;
-        }
-
-        if (mDatabase.getVersion() != DATABASE_VERSION) {
-            mDatabase.beginTransactionNonExclusive();
-            try {
-                upgradeDatabase();
-                mDatabase.setTransactionSuccessful();
-            } finally {
-                mDatabase.endTransaction();
-            }
-        }
-    }
-
-    private static void upgradeDatabase() {
-        upgradeDatabaseToV10();
-        upgradeDatabaseFromV10ToV11();
-        // Add future database upgrade functions here, one version at a
-        // time.
-        mDatabase.setVersion(DATABASE_VERSION);
-    }
-
-    private static void upgradeDatabaseFromV10ToV11() {
-        int oldVersion = mDatabase.getVersion();
-
-        if (oldVersion >= 11) {
-            // Nothing to do.
-            return;
-        }
-
-        // Clear out old java stack cookies - this data is now stored in
-        // a separate database managed by the Chrome stack.
-        mDatabase.execSQL("DROP TABLE IF EXISTS cookies");
-
-        // Likewise for the old cache table.
-        mDatabase.execSQL("DROP TABLE IF EXISTS cache");
-
-        // Update form autocomplete  URLs to match new ICS formatting.
-        Cursor c = mDatabase.query(mTableNames[TABLE_FORMURL_ID], null, null,
-                null, null, null, null);
-        while (c.moveToNext()) {
-            String urlId = Long.toString(c.getLong(c.getColumnIndex(ID_COL)));
-            String url = c.getString(c.getColumnIndex(FORMURL_URL_COL));
-            ContentValues cv = new ContentValues(1);
-            cv.put(FORMURL_URL_COL, WebTextView.urlForAutoCompleteData(url));
-            mDatabase.update(mTableNames[TABLE_FORMURL_ID], cv, ID_COL + "=?",
-                    new String[] { urlId });
-        }
-        c.close();
-    }
-
-    private static void upgradeDatabaseToV10() {
-        int oldVersion = mDatabase.getVersion();
-
-        if (oldVersion >= 10) {
-            // Nothing to do.
-            return;
-        }
-
-        if (oldVersion != 0) {
-            Log.i(LOGTAG, "Upgrading database from version "
-                    + oldVersion + " to "
-                    + DATABASE_VERSION + ", which will destroy old data");
-        }
-
-        if (9 == oldVersion) {
-            mDatabase.execSQL("DROP TABLE IF EXISTS "
-                    + mTableNames[TABLE_HTTPAUTH_ID]);
-            mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
-                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
-                    + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
-                    + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
-                    + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
-                    + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
-                    + ") ON CONFLICT REPLACE);");
-            return;
-        }
-
-        mDatabase.execSQL("DROP TABLE IF EXISTS cookies");
-        mDatabase.execSQL("DROP TABLE IF EXISTS cache");
-        mDatabase.execSQL("DROP TABLE IF EXISTS "
-                + mTableNames[TABLE_FORMURL_ID]);
-        mDatabase.execSQL("DROP TABLE IF EXISTS "
-                + mTableNames[TABLE_FORMDATA_ID]);
-        mDatabase.execSQL("DROP TABLE IF EXISTS "
-                + mTableNames[TABLE_HTTPAUTH_ID]);
-        mDatabase.execSQL("DROP TABLE IF EXISTS "
-                + mTableNames[TABLE_PASSWORD_ID]);
-
-        // formurl
-        mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMURL_ID]
-                + " (" + ID_COL + " INTEGER PRIMARY KEY, " + FORMURL_URL_COL
-                + " TEXT" + ");");
-
-        // formdata
-        mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMDATA_ID]
-                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
-                + FORMDATA_URLID_COL + " INTEGER, " + FORMDATA_NAME_COL
-                + " TEXT, " + FORMDATA_VALUE_COL + " TEXT," + " UNIQUE ("
-                + FORMDATA_URLID_COL + ", " + FORMDATA_NAME_COL + ", "
-                + FORMDATA_VALUE_COL + ") ON CONFLICT IGNORE);");
-
-        // httpauth
-        mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
-                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
-                + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
-                + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
-                + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
-                + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
-                + ") ON CONFLICT REPLACE);");
-        // passwords
-        mDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_PASSWORD_ID]
-                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
-                + PASSWORD_HOST_COL + " TEXT, " + PASSWORD_USERNAME_COL
-                + " TEXT, " + PASSWORD_PASSWORD_COL + " TEXT," + " UNIQUE ("
-                + PASSWORD_HOST_COL + ", " + PASSWORD_USERNAME_COL
-                + ") ON CONFLICT REPLACE);");
-    }
-
-    // Wait for the background initialization thread to complete and check the
-    // database creation status.
-    private boolean checkInitialized() {
-        synchronized (this) {
-            while (!mInitialized) {
-                try {
-                    wait();
-                } catch (InterruptedException e) {
-                    Log.e(LOGTAG, "Caught exception while checking " +
-                                  "initialization");
-                    Log.e(LOGTAG, Log.getStackTraceString(e));
-                }
-            }
-        }
-        return mDatabase != null;
-    }
-
-    private boolean hasEntries(int tableId) {
-        if (!checkInitialized()) {
-            return false;
-        }
-
-        Cursor cursor = null;
-        boolean ret = false;
-        try {
-            cursor = mDatabase.query(mTableNames[tableId], ID_PROJECTION,
-                    null, null, null, null, null);
-            ret = cursor.moveToFirst() == true;
-        } catch (IllegalStateException e) {
-            Log.e(LOGTAG, "hasEntries", e);
-        } finally {
-            if (cursor != null) cursor.close();
-        }
-        return ret;
-    }
-
-    //
-    // password functions
-    //
-
-    /**
-     * Set password. Tuple (PASSWORD_HOST_COL, PASSWORD_USERNAME_COL) is unique.
-     *
-     * @param schemePlusHost The scheme and host for the password
-     * @param username The username for the password. If it is null, it means
-     *            password can't be saved.
-     * @param password The password
-     */
-    void setUsernamePassword(String schemePlusHost, String username,
-                String password) {
-        if (schemePlusHost == null || !checkInitialized()) {
-            return;
-        }
-
-        synchronized (mPasswordLock) {
-            final ContentValues c = new ContentValues();
-            c.put(PASSWORD_HOST_COL, schemePlusHost);
-            c.put(PASSWORD_USERNAME_COL, username);
-            c.put(PASSWORD_PASSWORD_COL, password);
-            mDatabase.insert(mTableNames[TABLE_PASSWORD_ID], PASSWORD_HOST_COL,
-                    c);
-        }
+        return WebViewFactory.getProvider().getWebViewDatabase(context);
     }
 
     /**
-     * Retrieve the username and password for a given host
+     * Gets whether there are any username/password combinations
+     * from web pages saved.
      *
-     * @param schemePlusHost The scheme and host which passwords applies to
-     * @return String[] if found, String[0] is username, which can be null and
-     *         String[1] is password. Return null if it can't find anything.
-     */
-    String[] getUsernamePassword(String schemePlusHost) {
-        if (schemePlusHost == null || !checkInitialized()) {
-            return null;
-        }
-
-        final String[] columns = new String[] {
-                PASSWORD_USERNAME_COL, PASSWORD_PASSWORD_COL
-        };
-        final String selection = "(" + PASSWORD_HOST_COL + " == ?)";
-        synchronized (mPasswordLock) {
-            String[] ret = null;
-            Cursor cursor = null;
-            try {
-                cursor = mDatabase.query(mTableNames[TABLE_PASSWORD_ID],
-                        columns, selection, new String[] { schemePlusHost }, null,
-                        null, null);
-                if (cursor.moveToFirst()) {
-                    ret = new String[2];
-                    ret[0] = cursor.getString(
-                            cursor.getColumnIndex(PASSWORD_USERNAME_COL));
-                    ret[1] = cursor.getString(
-                            cursor.getColumnIndex(PASSWORD_PASSWORD_COL));
-                }
-            } catch (IllegalStateException e) {
-                Log.e(LOGTAG, "getUsernamePassword", e);
-            } finally {
-                if (cursor != null) cursor.close();
-            }
-            return ret;
-        }
-    }
-
-    /**
-     * Find out if there are any passwords saved. 
-     *
-     * @return TRUE if there is passwords saved
+     * @return true if there are any username/passwords used in web
+     *         forms saved
      */
     public boolean hasUsernamePassword() {
-        synchronized (mPasswordLock) {
-            return hasEntries(TABLE_PASSWORD_ID);
-        }
+        throw new MustOverrideException();
     }
 
     /**
-     * Clear password database
+     * Clears any username/password combinations saved from web forms.
      */
     public void clearUsernamePassword() {
-        if (!checkInitialized()) {
-            return;
-        }
-
-        synchronized (mPasswordLock) {
-            mDatabase.delete(mTableNames[TABLE_PASSWORD_ID], null, null);
-        }
-    }
-
-    //
-    // http authentication password functions
-    //
-
-    /**
-     * Set HTTP authentication password. Tuple (HTTPAUTH_HOST_COL,
-     * HTTPAUTH_REALM_COL, HTTPAUTH_USERNAME_COL) is unique.
-     *
-     * @param host The host for the password
-     * @param realm The realm for the password
-     * @param username The username for the password. If it is null, it means
-     *            password can't be saved.
-     * @param password The password
-     */
-    void setHttpAuthUsernamePassword(String host, String realm, String username,
-            String password) {
-        if (host == null || realm == null || !checkInitialized()) {
-            return;
-        }
-
-        synchronized (mHttpAuthLock) {
-            final ContentValues c = new ContentValues();
-            c.put(HTTPAUTH_HOST_COL, host);
-            c.put(HTTPAUTH_REALM_COL, realm);
-            c.put(HTTPAUTH_USERNAME_COL, username);
-            c.put(HTTPAUTH_PASSWORD_COL, password);
-            mDatabase.insert(mTableNames[TABLE_HTTPAUTH_ID], HTTPAUTH_HOST_COL,
-                    c);
-        }
+        throw new MustOverrideException();
     }
 
     /**
-     * Retrieve the HTTP authentication username and password for a given
-     * host+realm pair
+     * Gets whether there are any HTTP authentication username/password combinations saved.
      *
-     * @param host The host the password applies to
-     * @param realm The realm the password applies to
-     * @return String[] if found, String[0] is username, which can be null and
-     *         String[1] is password. Return null if it can't find anything.
-     */
-    String[] getHttpAuthUsernamePassword(String host, String realm) {
-        if (host == null || realm == null || !checkInitialized()){
-            return null;
-        }
-
-        final String[] columns = new String[] {
-                HTTPAUTH_USERNAME_COL, HTTPAUTH_PASSWORD_COL
-        };
-        final String selection = "(" + HTTPAUTH_HOST_COL + " == ?) AND ("
-                + HTTPAUTH_REALM_COL + " == ?)";
-        synchronized (mHttpAuthLock) {
-            String[] ret = null;
-            Cursor cursor = null;
-            try {
-                cursor = mDatabase.query(mTableNames[TABLE_HTTPAUTH_ID],
-                        columns, selection, new String[] { host, realm }, null,
-                        null, null);
-                if (cursor.moveToFirst()) {
-                    ret = new String[2];
-                    ret[0] = cursor.getString(
-                            cursor.getColumnIndex(HTTPAUTH_USERNAME_COL));
-                    ret[1] = cursor.getString(
-                            cursor.getColumnIndex(HTTPAUTH_PASSWORD_COL));
-                }
-            } catch (IllegalStateException e) {
-                Log.e(LOGTAG, "getHttpAuthUsernamePassword", e);
-            } finally {
-                if (cursor != null) cursor.close();
-            }
-            return ret;
-        }
-    }
-
-    /**
-     *  Find out if there are any HTTP authentication passwords saved.   
-     *
-     * @return TRUE if there are passwords saved
+     * @return true if there are any HTTP authentication username/passwords saved
      */
     public boolean hasHttpAuthUsernamePassword() {
-        synchronized (mHttpAuthLock) {
-            return hasEntries(TABLE_HTTPAUTH_ID);
-        }
+        throw new MustOverrideException();
     }
 
     /**
-     * Clear HTTP authentication password database
+     * Clears any HTTP authentication username/passwords that are saved.
      */
     public void clearHttpAuthUsernamePassword() {
-        if (!checkInitialized()) {
-            return;
-        }
-
-        synchronized (mHttpAuthLock) {
-            mDatabase.delete(mTableNames[TABLE_HTTPAUTH_ID], null, null);
-        }
-    }
-
-    //
-    // form data functions
-    //
-
-    /**
-     * Set form data for a site. Tuple (FORMDATA_URLID_COL, FORMDATA_NAME_COL,
-     * FORMDATA_VALUE_COL) is unique
-     *
-     * @param url The url of the site
-     * @param formdata The form data in HashMap
-     */
-    void setFormData(String url, HashMap<String, String> formdata) {
-        if (url == null || formdata == null || !checkInitialized()) {
-            return;
-        }
-
-        final String selection = "(" + FORMURL_URL_COL + " == ?)";
-        synchronized (mFormLock) {
-            long urlid = -1;
-            Cursor cursor = null;
-            try {
-                cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID],
-                        ID_PROJECTION, selection, new String[] { url }, null, null,
-                        null);
-                if (cursor.moveToFirst()) {
-                    urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
-                } else {
-                    ContentValues c = new ContentValues();
-                    c.put(FORMURL_URL_COL, url);
-                    urlid = mDatabase.insert(
-                            mTableNames[TABLE_FORMURL_ID], null, c);
-                }
-            } catch (IllegalStateException e) {
-                Log.e(LOGTAG, "setFormData", e);
-            } finally {
-                if (cursor != null) cursor.close();
-            }
-            if (urlid >= 0) {
-                Set<Entry<String, String>> set = formdata.entrySet();
-                Iterator<Entry<String, String>> iter = set.iterator();
-                ContentValues map = new ContentValues();
-                map.put(FORMDATA_URLID_COL, urlid);
-                while (iter.hasNext()) {
-                    Entry<String, String> entry = iter.next();
-                    map.put(FORMDATA_NAME_COL, entry.getKey());
-                    map.put(FORMDATA_VALUE_COL, entry.getValue());
-                    mDatabase.insert(mTableNames[TABLE_FORMDATA_ID], null, map);
-                }
-            }
-        }
+        throw new MustOverrideException();
     }
 
     /**
-     * Get all the values for a form entry with "name" in a given site
+     * Gets whether there is any previously-entered form data saved.
      *
-     * @param url The url of the site
-     * @param name The name of the form entry
-     * @return A list of values. Return empty list if nothing is found.
-     */
-    ArrayList<String> getFormData(String url, String name) {
-        ArrayList<String> values = new ArrayList<String>();
-        if (url == null || name == null || !checkInitialized()) {
-            return values;
-        }
-
-        final String urlSelection = "(" + FORMURL_URL_COL + " == ?)";
-        final String dataSelection = "(" + FORMDATA_URLID_COL + " == ?) AND ("
-                + FORMDATA_NAME_COL + " == ?)";
-        synchronized (mFormLock) {
-            Cursor cursor = null;
-            try {
-                cursor = mDatabase.query(mTableNames[TABLE_FORMURL_ID],
-                        ID_PROJECTION, urlSelection, new String[] { url }, null,
-                        null, null);
-                while (cursor.moveToNext()) {
-                    long urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
-                    Cursor dataCursor = null;
-                    try {
-                        dataCursor = mDatabase.query(
-                                mTableNames[TABLE_FORMDATA_ID],
-                                new String[] { ID_COL, FORMDATA_VALUE_COL },
-                                dataSelection,
-                                new String[] { Long.toString(urlid), name },
-                                null, null, null);
-                        if (dataCursor.moveToFirst()) {
-                            int valueCol = dataCursor.getColumnIndex(
-                                    FORMDATA_VALUE_COL);
-                            do {
-                                values.add(dataCursor.getString(valueCol));
-                            } while (dataCursor.moveToNext());
-                        }
-                    } catch (IllegalStateException e) {
-                        Log.e(LOGTAG, "getFormData dataCursor", e);
-                    } finally {
-                        if (dataCursor != null) dataCursor.close();
-                    }
-                }
-            } catch (IllegalStateException e) {
-                Log.e(LOGTAG, "getFormData cursor", e);
-            } finally {
-                if (cursor != null) cursor.close();
-            }
-            return values;
-        }
-    }
-
-    /**
-     * Find out if there is form data saved.
-     *
-     * @return TRUE if there is form data in the database
+     * @return true if there is form data saved
      */
     public boolean hasFormData() {
-        synchronized (mFormLock) {
-            return hasEntries(TABLE_FORMURL_ID);
-        }
+        throw new MustOverrideException();
     }
 
     /**
-     * Clear form database
+     * Clears any stored previously-entered form data.
      */
     public void clearFormData() {
-        if (!checkInitialized()) {
-            return;
-        }
-
-        synchronized (mFormLock) {
-            mDatabase.delete(mTableNames[TABLE_FORMURL_ID], null, null);
-            mDatabase.delete(mTableNames[TABLE_FORMDATA_ID], null, null);
-        }
+        throw new MustOverrideException();
     }
 }
diff --git a/core/java/android/webkit/WebViewDatabaseClassic.java b/core/java/android/webkit/WebViewDatabaseClassic.java
new file mode 100644
index 0000000..9b1d4cb
--- /dev/null
+++ b/core/java/android/webkit/WebViewDatabaseClassic.java
@@ -0,0 +1,624 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.database.sqlite.SQLiteStatement;
+import android.util.Log;
+
+final class WebViewDatabaseClassic extends WebViewDatabase {
+    private static final String LOGTAG = "WebViewDatabaseClassic";
+    private static final String DATABASE_FILE = "webview.db";
+    private static final String CACHE_DATABASE_FILE = "webviewCache.db";
+
+    private static final int DATABASE_VERSION = 11;
+    // 2 -> 3 Modified Cache table to allow cache of redirects
+    // 3 -> 4 Added Oma-Downloads table
+    // 4 -> 5 Modified Cache table to support persistent contentLength
+    // 5 -> 4 Removed Oma-Downoads table
+    // 5 -> 6 Add INDEX for cache table
+    // 6 -> 7 Change cache localPath from int to String
+    // 7 -> 8 Move cache to its own db
+    // 8 -> 9 Store both scheme and host when storing passwords
+    // 9 -> 10 Update httpauth table UNIQUE
+    // 10 -> 11 Drop cookies and cache now managed by the chromium stack,
+    //          and update the form data table to use the new format
+    //          implemented for b/5265606.
+
+    private static WebViewDatabaseClassic sInstance = null;
+
+    private static SQLiteDatabase sDatabase = null;
+
+    // synchronize locks
+    private final Object mPasswordLock = new Object();
+    private final Object mFormLock = new Object();
+    private final Object mHttpAuthLock = new Object();
+
+    private static final String mTableNames[] = {
+        "password", "formurl", "formdata", "httpauth"
+    };
+
+    // Table ids (they are index to mTableNames)
+    private static final int TABLE_PASSWORD_ID = 0;
+    private static final int TABLE_FORMURL_ID = 1;
+    private static final int TABLE_FORMDATA_ID = 2;
+    private static final int TABLE_HTTPAUTH_ID = 3;
+
+    // column id strings for "_id" which can be used by any table
+    private static final String ID_COL = "_id";
+
+    private static final String[] ID_PROJECTION = new String[] {
+        "_id"
+    };
+
+    // column id strings for "password" table
+    private static final String PASSWORD_HOST_COL = "host";
+    private static final String PASSWORD_USERNAME_COL = "username";
+    private static final String PASSWORD_PASSWORD_COL = "password";
+
+    // column id strings for "formurl" table
+    private static final String FORMURL_URL_COL = "url";
+
+    // column id strings for "formdata" table
+    private static final String FORMDATA_URLID_COL = "urlid";
+    private static final String FORMDATA_NAME_COL = "name";
+    private static final String FORMDATA_VALUE_COL = "value";
+
+    // column id strings for "httpauth" table
+    private static final String HTTPAUTH_HOST_COL = "host";
+    private static final String HTTPAUTH_REALM_COL = "realm";
+    private static final String HTTPAUTH_USERNAME_COL = "username";
+    private static final String HTTPAUTH_PASSWORD_COL = "password";
+
+    // Initially true until the background thread completes.
+    private boolean mInitialized = false;
+
+    WebViewDatabaseClassic(final Context context) {
+        new Thread() {
+            @Override
+            public void run() {
+                init(context);
+            }
+        }.start();
+
+        // Singleton only, use getInstance()
+    }
+
+    public static synchronized WebViewDatabaseClassic getInstance(Context context) {
+        if (sInstance == null) {
+            sInstance = new WebViewDatabaseClassic(context);
+        }
+        return sInstance;
+    }
+
+    private synchronized void init(Context context) {
+        if (mInitialized) {
+            return;
+        }
+
+        initDatabase(context);
+        // Before using the Chromium HTTP stack, we stored the WebKit cache in
+        // our own DB. Clean up the DB file if it's still around.
+        context.deleteDatabase(CACHE_DATABASE_FILE);
+
+        // Thread done, notify.
+        mInitialized = true;
+        notify();
+    }
+
+    private void initDatabase(Context context) {
+        try {
+            sDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0, null);
+        } catch (SQLiteException e) {
+            // try again by deleting the old db and create a new one
+            if (context.deleteDatabase(DATABASE_FILE)) {
+                sDatabase = context.openOrCreateDatabase(DATABASE_FILE, 0,
+                        null);
+            }
+        }
+
+        // sDatabase should not be null,
+        // the only case is RequestAPI test has problem to create db
+        if (sDatabase == null) {
+            mInitialized = true;
+            notify();
+            return;
+        }
+
+        if (sDatabase.getVersion() != DATABASE_VERSION) {
+            sDatabase.beginTransactionNonExclusive();
+            try {
+                upgradeDatabase();
+                sDatabase.setTransactionSuccessful();
+            } finally {
+                sDatabase.endTransaction();
+            }
+        }
+    }
+
+    private static void upgradeDatabase() {
+        upgradeDatabaseToV10();
+        upgradeDatabaseFromV10ToV11();
+        // Add future database upgrade functions here, one version at a
+        // time.
+        sDatabase.setVersion(DATABASE_VERSION);
+    }
+
+    private static void upgradeDatabaseFromV10ToV11() {
+        int oldVersion = sDatabase.getVersion();
+
+        if (oldVersion >= 11) {
+            // Nothing to do.
+            return;
+        }
+
+        // Clear out old java stack cookies - this data is now stored in
+        // a separate database managed by the Chrome stack.
+        sDatabase.execSQL("DROP TABLE IF EXISTS cookies");
+
+        // Likewise for the old cache table.
+        sDatabase.execSQL("DROP TABLE IF EXISTS cache");
+
+        // Update form autocomplete  URLs to match new ICS formatting.
+        Cursor c = sDatabase.query(mTableNames[TABLE_FORMURL_ID], null, null,
+                null, null, null, null);
+        while (c.moveToNext()) {
+            String urlId = Long.toString(c.getLong(c.getColumnIndex(ID_COL)));
+            String url = c.getString(c.getColumnIndex(FORMURL_URL_COL));
+            ContentValues cv = new ContentValues(1);
+            cv.put(FORMURL_URL_COL, WebTextView.urlForAutoCompleteData(url));
+            sDatabase.update(mTableNames[TABLE_FORMURL_ID], cv, ID_COL + "=?",
+                    new String[] { urlId });
+        }
+        c.close();
+    }
+
+    private static void upgradeDatabaseToV10() {
+        int oldVersion = sDatabase.getVersion();
+
+        if (oldVersion >= 10) {
+            // Nothing to do.
+            return;
+        }
+
+        if (oldVersion != 0) {
+            Log.i(LOGTAG, "Upgrading database from version "
+                    + oldVersion + " to "
+                    + DATABASE_VERSION + ", which will destroy old data");
+        }
+
+        if (9 == oldVersion) {
+            sDatabase.execSQL("DROP TABLE IF EXISTS "
+                    + mTableNames[TABLE_HTTPAUTH_ID]);
+            sDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
+                    + " (" + ID_COL + " INTEGER PRIMARY KEY, "
+                    + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
+                    + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
+                    + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
+                    + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
+                    + ") ON CONFLICT REPLACE);");
+            return;
+        }
+
+        sDatabase.execSQL("DROP TABLE IF EXISTS cookies");
+        sDatabase.execSQL("DROP TABLE IF EXISTS cache");
+        sDatabase.execSQL("DROP TABLE IF EXISTS "
+                + mTableNames[TABLE_FORMURL_ID]);
+        sDatabase.execSQL("DROP TABLE IF EXISTS "
+                + mTableNames[TABLE_FORMDATA_ID]);
+        sDatabase.execSQL("DROP TABLE IF EXISTS "
+                + mTableNames[TABLE_HTTPAUTH_ID]);
+        sDatabase.execSQL("DROP TABLE IF EXISTS "
+                + mTableNames[TABLE_PASSWORD_ID]);
+
+        // formurl
+        sDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMURL_ID]
+                + " (" + ID_COL + " INTEGER PRIMARY KEY, " + FORMURL_URL_COL
+                + " TEXT" + ");");
+
+        // formdata
+        sDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_FORMDATA_ID]
+                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
+                + FORMDATA_URLID_COL + " INTEGER, " + FORMDATA_NAME_COL
+                + " TEXT, " + FORMDATA_VALUE_COL + " TEXT," + " UNIQUE ("
+                + FORMDATA_URLID_COL + ", " + FORMDATA_NAME_COL + ", "
+                + FORMDATA_VALUE_COL + ") ON CONFLICT IGNORE);");
+
+        // httpauth
+        sDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_HTTPAUTH_ID]
+                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
+                + HTTPAUTH_HOST_COL + " TEXT, " + HTTPAUTH_REALM_COL
+                + " TEXT, " + HTTPAUTH_USERNAME_COL + " TEXT, "
+                + HTTPAUTH_PASSWORD_COL + " TEXT," + " UNIQUE ("
+                + HTTPAUTH_HOST_COL + ", " + HTTPAUTH_REALM_COL
+                + ") ON CONFLICT REPLACE);");
+        // passwords
+        sDatabase.execSQL("CREATE TABLE " + mTableNames[TABLE_PASSWORD_ID]
+                + " (" + ID_COL + " INTEGER PRIMARY KEY, "
+                + PASSWORD_HOST_COL + " TEXT, " + PASSWORD_USERNAME_COL
+                + " TEXT, " + PASSWORD_PASSWORD_COL + " TEXT," + " UNIQUE ("
+                + PASSWORD_HOST_COL + ", " + PASSWORD_USERNAME_COL
+                + ") ON CONFLICT REPLACE);");
+    }
+
+    // Wait for the background initialization thread to complete and check the
+    // database creation status.
+    private boolean checkInitialized() {
+        synchronized (this) {
+            while (!mInitialized) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    Log.e(LOGTAG, "Caught exception while checking " +
+                                  "initialization");
+                    Log.e(LOGTAG, Log.getStackTraceString(e));
+                }
+            }
+        }
+        return sDatabase != null;
+    }
+
+    private boolean hasEntries(int tableId) {
+        if (!checkInitialized()) {
+            return false;
+        }
+
+        Cursor cursor = null;
+        boolean ret = false;
+        try {
+            cursor = sDatabase.query(mTableNames[tableId], ID_PROJECTION,
+                    null, null, null, null, null);
+            ret = cursor.moveToFirst() == true;
+        } catch (IllegalStateException e) {
+            Log.e(LOGTAG, "hasEntries", e);
+        } finally {
+            if (cursor != null) cursor.close();
+        }
+        return ret;
+    }
+
+    //
+    // password functions
+    //
+
+    /**
+     * Set password. Tuple (PASSWORD_HOST_COL, PASSWORD_USERNAME_COL) is unique.
+     *
+     * @param schemePlusHost The scheme and host for the password
+     * @param username The username for the password. If it is null, it means
+     *            password can't be saved.
+     * @param password The password
+     */
+    void setUsernamePassword(String schemePlusHost, String username,
+                String password) {
+        if (schemePlusHost == null || !checkInitialized()) {
+            return;
+        }
+
+        synchronized (mPasswordLock) {
+            final ContentValues c = new ContentValues();
+            c.put(PASSWORD_HOST_COL, schemePlusHost);
+            c.put(PASSWORD_USERNAME_COL, username);
+            c.put(PASSWORD_PASSWORD_COL, password);
+            sDatabase.insert(mTableNames[TABLE_PASSWORD_ID], PASSWORD_HOST_COL,
+                    c);
+        }
+    }
+
+    /**
+     * Retrieve the username and password for a given host
+     *
+     * @param schemePlusHost The scheme and host which passwords applies to
+     * @return String[] if found, String[0] is username, which can be null and
+     *         String[1] is password. Return null if it can't find anything.
+     */
+    String[] getUsernamePassword(String schemePlusHost) {
+        if (schemePlusHost == null || !checkInitialized()) {
+            return null;
+        }
+
+        final String[] columns = new String[] {
+                PASSWORD_USERNAME_COL, PASSWORD_PASSWORD_COL
+        };
+        final String selection = "(" + PASSWORD_HOST_COL + " == ?)";
+        synchronized (mPasswordLock) {
+            String[] ret = null;
+            Cursor cursor = null;
+            try {
+                cursor = sDatabase.query(mTableNames[TABLE_PASSWORD_ID],
+                        columns, selection, new String[] { schemePlusHost }, null,
+                        null, null);
+                if (cursor.moveToFirst()) {
+                    ret = new String[2];
+                    ret[0] = cursor.getString(
+                            cursor.getColumnIndex(PASSWORD_USERNAME_COL));
+                    ret[1] = cursor.getString(
+                            cursor.getColumnIndex(PASSWORD_PASSWORD_COL));
+                }
+            } catch (IllegalStateException e) {
+                Log.e(LOGTAG, "getUsernamePassword", e);
+            } finally {
+                if (cursor != null) cursor.close();
+            }
+            return ret;
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#hasUsernamePassword
+     */
+    @Override
+    public boolean hasUsernamePassword() {
+        synchronized (mPasswordLock) {
+            return hasEntries(TABLE_PASSWORD_ID);
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#clearUsernamePassword
+     */
+    @Override
+    public void clearUsernamePassword() {
+        if (!checkInitialized()) {
+            return;
+        }
+
+        synchronized (mPasswordLock) {
+            sDatabase.delete(mTableNames[TABLE_PASSWORD_ID], null, null);
+        }
+    }
+
+    //
+    // http authentication password functions
+    //
+
+    /**
+     * Set HTTP authentication password. Tuple (HTTPAUTH_HOST_COL,
+     * HTTPAUTH_REALM_COL, HTTPAUTH_USERNAME_COL) is unique.
+     *
+     * @param host The host for the password
+     * @param realm The realm for the password
+     * @param username The username for the password. If it is null, it means
+     *            password can't be saved.
+     * @param password The password
+     */
+    void setHttpAuthUsernamePassword(String host, String realm, String username,
+            String password) {
+        if (host == null || realm == null || !checkInitialized()) {
+            return;
+        }
+
+        synchronized (mHttpAuthLock) {
+            final ContentValues c = new ContentValues();
+            c.put(HTTPAUTH_HOST_COL, host);
+            c.put(HTTPAUTH_REALM_COL, realm);
+            c.put(HTTPAUTH_USERNAME_COL, username);
+            c.put(HTTPAUTH_PASSWORD_COL, password);
+            sDatabase.insert(mTableNames[TABLE_HTTPAUTH_ID], HTTPAUTH_HOST_COL,
+                    c);
+        }
+    }
+
+    /**
+     * Retrieve the HTTP authentication username and password for a given
+     * host+realm pair
+     *
+     * @param host The host the password applies to
+     * @param realm The realm the password applies to
+     * @return String[] if found, String[0] is username, which can be null and
+     *         String[1] is password. Return null if it can't find anything.
+     */
+    String[] getHttpAuthUsernamePassword(String host, String realm) {
+        if (host == null || realm == null || !checkInitialized()){
+            return null;
+        }
+
+        final String[] columns = new String[] {
+                HTTPAUTH_USERNAME_COL, HTTPAUTH_PASSWORD_COL
+        };
+        final String selection = "(" + HTTPAUTH_HOST_COL + " == ?) AND ("
+                + HTTPAUTH_REALM_COL + " == ?)";
+        synchronized (mHttpAuthLock) {
+            String[] ret = null;
+            Cursor cursor = null;
+            try {
+                cursor = sDatabase.query(mTableNames[TABLE_HTTPAUTH_ID],
+                        columns, selection, new String[] { host, realm }, null,
+                        null, null);
+                if (cursor.moveToFirst()) {
+                    ret = new String[2];
+                    ret[0] = cursor.getString(
+                            cursor.getColumnIndex(HTTPAUTH_USERNAME_COL));
+                    ret[1] = cursor.getString(
+                            cursor.getColumnIndex(HTTPAUTH_PASSWORD_COL));
+                }
+            } catch (IllegalStateException e) {
+                Log.e(LOGTAG, "getHttpAuthUsernamePassword", e);
+            } finally {
+                if (cursor != null) cursor.close();
+            }
+            return ret;
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#hasHttpAuthUsernamePassword
+     */
+    @Override
+    public boolean hasHttpAuthUsernamePassword() {
+        synchronized (mHttpAuthLock) {
+            return hasEntries(TABLE_HTTPAUTH_ID);
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#clearHttpAuthUsernamePassword
+     */
+    @Override
+    public void clearHttpAuthUsernamePassword() {
+        if (!checkInitialized()) {
+            return;
+        }
+
+        synchronized (mHttpAuthLock) {
+            sDatabase.delete(mTableNames[TABLE_HTTPAUTH_ID], null, null);
+        }
+    }
+
+    //
+    // form data functions
+    //
+
+    /**
+     * Set form data for a site. Tuple (FORMDATA_URLID_COL, FORMDATA_NAME_COL,
+     * FORMDATA_VALUE_COL) is unique
+     *
+     * @param url The url of the site
+     * @param formdata The form data in HashMap
+     */
+    void setFormData(String url, HashMap<String, String> formdata) {
+        if (url == null || formdata == null || !checkInitialized()) {
+            return;
+        }
+
+        final String selection = "(" + FORMURL_URL_COL + " == ?)";
+        synchronized (mFormLock) {
+            long urlid = -1;
+            Cursor cursor = null;
+            try {
+                cursor = sDatabase.query(mTableNames[TABLE_FORMURL_ID],
+                        ID_PROJECTION, selection, new String[] { url }, null, null,
+                        null);
+                if (cursor.moveToFirst()) {
+                    urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
+                } else {
+                    ContentValues c = new ContentValues();
+                    c.put(FORMURL_URL_COL, url);
+                    urlid = sDatabase.insert(
+                            mTableNames[TABLE_FORMURL_ID], null, c);
+                }
+            } catch (IllegalStateException e) {
+                Log.e(LOGTAG, "setFormData", e);
+            } finally {
+                if (cursor != null) cursor.close();
+            }
+            if (urlid >= 0) {
+                Set<Entry<String, String>> set = formdata.entrySet();
+                Iterator<Entry<String, String>> iter = set.iterator();
+                ContentValues map = new ContentValues();
+                map.put(FORMDATA_URLID_COL, urlid);
+                while (iter.hasNext()) {
+                    Entry<String, String> entry = iter.next();
+                    map.put(FORMDATA_NAME_COL, entry.getKey());
+                    map.put(FORMDATA_VALUE_COL, entry.getValue());
+                    sDatabase.insert(mTableNames[TABLE_FORMDATA_ID], null, map);
+                }
+            }
+        }
+    }
+
+    /**
+     * Get all the values for a form entry with "name" in a given site
+     *
+     * @param url The url of the site
+     * @param name The name of the form entry
+     * @return A list of values. Return empty list if nothing is found.
+     */
+    ArrayList<String> getFormData(String url, String name) {
+        ArrayList<String> values = new ArrayList<String>();
+        if (url == null || name == null || !checkInitialized()) {
+            return values;
+        }
+
+        final String urlSelection = "(" + FORMURL_URL_COL + " == ?)";
+        final String dataSelection = "(" + FORMDATA_URLID_COL + " == ?) AND ("
+                + FORMDATA_NAME_COL + " == ?)";
+        synchronized (mFormLock) {
+            Cursor cursor = null;
+            try {
+                cursor = sDatabase.query(mTableNames[TABLE_FORMURL_ID],
+                        ID_PROJECTION, urlSelection, new String[] { url }, null,
+                        null, null);
+                while (cursor.moveToNext()) {
+                    long urlid = cursor.getLong(cursor.getColumnIndex(ID_COL));
+                    Cursor dataCursor = null;
+                    try {
+                        dataCursor = sDatabase.query(
+                                mTableNames[TABLE_FORMDATA_ID],
+                                new String[] { ID_COL, FORMDATA_VALUE_COL },
+                                dataSelection,
+                                new String[] { Long.toString(urlid), name },
+                                null, null, null);
+                        if (dataCursor.moveToFirst()) {
+                            int valueCol = dataCursor.getColumnIndex(
+                                    FORMDATA_VALUE_COL);
+                            do {
+                                values.add(dataCursor.getString(valueCol));
+                            } while (dataCursor.moveToNext());
+                        }
+                    } catch (IllegalStateException e) {
+                        Log.e(LOGTAG, "getFormData dataCursor", e);
+                    } finally {
+                        if (dataCursor != null) dataCursor.close();
+                    }
+                }
+            } catch (IllegalStateException e) {
+                Log.e(LOGTAG, "getFormData cursor", e);
+            } finally {
+                if (cursor != null) cursor.close();
+            }
+            return values;
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#hasFormData
+     */
+    @Override
+    public boolean hasFormData() {
+        synchronized (mFormLock) {
+            return hasEntries(TABLE_FORMURL_ID);
+        }
+    }
+
+    /**
+     * @see WebViewDatabase#clearFormData
+     */
+    @Override
+    public void clearFormData() {
+        if (!checkInitialized()) {
+            return;
+        }
+
+        synchronized (mFormLock) {
+            sDatabase.delete(mTableNames[TABLE_FORMURL_ID], null, null);
+            sDatabase.delete(mTableNames[TABLE_FORMDATA_ID], null, null);
+        }
+    }
+}
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index a832b0a..1d302f1 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -16,6 +16,8 @@
 
 package android.webkit;
 
+import android.content.Context;
+
 /**
  * This is the main entry-point into the WebView back end implementations, which the WebView
  * proxy class uses to instantiate all the other objects as needed. The backend must provide an
@@ -63,21 +65,32 @@
     /**
      * Gets the singleton CookieManager instance for this WebView implementation. The
      * implementation must return the same instance on subsequent calls.
-     * @return the singleton CookieManager instance.
+     *
+     * @return the singleton CookieManager instance
      */
     CookieManager getCookieManager();
 
     /**
      * Gets the singleton WebIconDatabase instance for this WebView implementation. The
      * implementation must return the same instance on subsequent calls.
-     * @return the singleton WebIconDatabase instance.
+     *
+     * @return the singleton WebIconDatabase instance
      */
     WebIconDatabase getWebIconDatabase();
 
     /**
      * Gets the singleton WebStorage instance for this WebView implementation. The
      * implementation must return the same instance on subsequent calls.
-     * @return the singleton WebStorage instance.
+     *
+     * @return the singleton WebStorage instance
      */
     WebStorage getWebStorage();
+
+    /**
+     * Gets the singleton WebViewDatabase instance for this WebView implementation. The
+     * implementation must return the same instance on subsequent calls.
+     *
+     * @return the singleton WebViewDatabase instance
+     */
+    WebViewDatabase getWebViewDatabase(Context context);
 }
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 53d5e0b..a2531f8 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -58,6 +58,8 @@
 import android.view.ViewTreeObserver;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
 import android.view.inputmethod.BaseInputConnection;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
@@ -660,6 +662,11 @@
     private int mLastHandledItemCount;
 
     /**
+     * Used for smooth scrolling at a consistent rate
+     */
+    static final Interpolator sLinearInterpolator = new LinearInterpolator();
+
+    /**
      * Interface definition for a callback to be invoked when the list or grid
      * has been scrolled.
      */
@@ -3753,6 +3760,7 @@
         void start(int initialVelocity) {
             int initialY = initialVelocity < 0 ? Integer.MAX_VALUE : 0;
             mLastFlingY = initialY;
+            mScroller.setInterpolator(null);
             mScroller.fling(0, initialY, 0, initialVelocity,
                     0, Integer.MAX_VALUE, 0, Integer.MAX_VALUE);
             mTouchMode = TOUCH_MODE_FLING;
@@ -3782,6 +3790,7 @@
         }
 
         void startOverfling(int initialVelocity) {
+            mScroller.setInterpolator(null);
             mScroller.fling(0, mScrollY, 0, initialVelocity, 0, 0,
                     Integer.MIN_VALUE, Integer.MAX_VALUE, 0, getHeight());
             mTouchMode = TOUCH_MODE_OVERFLING;
@@ -3811,9 +3820,10 @@
             postOnAnimation(this);
         }
 
-        void startScroll(int distance, int duration) {
+        void startScroll(int distance, int duration, boolean linear) {
             int initialY = distance < 0 ? Integer.MAX_VALUE : 0;
             mLastFlingY = initialY;
+            mScroller.setInterpolator(linear ? sLinearInterpolator : null);
             mScroller.startScroll(0, initialY, 0, distance, duration);
             mTouchMode = TOUCH_MODE_FLING;
             postOnAnimation(this);
@@ -4107,14 +4117,14 @@
             } else {
                 // On-screen, just scroll.
                 final int targetTop = getChildAt(position - firstPos).getTop();
-                smoothScrollBy(targetTop - offset, duration);
+                smoothScrollBy(targetTop - offset, duration, true);
                 return;
             }
 
             // Estimate how many screens we should travel
             final float screenTravelCount = (float) viewTravelCount / childCount;
-            mScrollDuration = screenTravelCount < 1 ? (int) (screenTravelCount * duration) :
-                    (int) (duration / screenTravelCount);
+            mScrollDuration = screenTravelCount < 1 ?
+                    duration : (int) (duration / screenTravelCount);
             mLastSeenPos = INVALID_POSITION;
 
             postOnAnimation(this);
@@ -4151,7 +4161,7 @@
                         Math.max(mListPadding.bottom, mExtraScroll) : mListPadding.bottom;
 
                 final int scrollBy = lastViewHeight - lastViewPixelsShowing + extraScroll;
-                smoothScrollBy(scrollBy, mScrollDuration);
+                smoothScrollBy(scrollBy, mScrollDuration, true);
 
                 mLastSeenPos = lastPos;
                 if (lastPos < mTargetPos) {
@@ -4182,14 +4192,14 @@
                 final int extraScroll = Math.max(mListPadding.bottom, mExtraScroll);
                 if (nextPos < mBoundPos) {
                     smoothScrollBy(Math.max(0, nextViewHeight + nextViewTop - extraScroll),
-                            mScrollDuration);
+                            mScrollDuration, true);
 
                     mLastSeenPos = nextPos;
 
                     postOnAnimation(this);
                 } else  {
                     if (nextViewTop > extraScroll) {
-                        smoothScrollBy(nextViewTop - extraScroll, mScrollDuration);
+                        smoothScrollBy(nextViewTop - extraScroll, mScrollDuration, true);
                     }
                 }
                 break;
@@ -4210,7 +4220,7 @@
                 final int extraScroll = firstPos > 0 ?
                         Math.max(mExtraScroll, mListPadding.top) : mListPadding.top;
 
-                smoothScrollBy(firstViewTop - extraScroll, mScrollDuration);
+                smoothScrollBy(firstViewTop - extraScroll, mScrollDuration, true);
 
                 mLastSeenPos = firstPos;
 
@@ -4229,7 +4239,7 @@
 
                 if (lastPos == mLastSeenPos) {
                     // No new views, let things keep going.
-                    post(this);
+                    postOnAnimation(this);
                     return;
                 }
 
@@ -4240,13 +4250,13 @@
                 final int extraScroll = Math.max(mListPadding.top, mExtraScroll);
                 mLastSeenPos = lastPos;
                 if (lastPos > mBoundPos) {
-                    smoothScrollBy(-(lastViewPixelsShowing - extraScroll), mScrollDuration);
+                    smoothScrollBy(-(lastViewPixelsShowing - extraScroll), mScrollDuration, true);
                     postOnAnimation(this);
                 } else {
                     final int bottom = listHeight - extraScroll;
                     final int lastViewBottom = lastViewTop + lastViewHeight;
                     if (bottom > lastViewBottom) {
-                        smoothScrollBy(-(bottom - lastViewBottom), mScrollDuration);
+                        smoothScrollBy(-(bottom - lastViewBottom), mScrollDuration, true);
                     }
                 }
                 break;
@@ -4255,7 +4265,7 @@
             case MOVE_OFFSET: {
                 if (mLastSeenPos == firstPos) {
                     // No new views, let things keep going.
-                    post(this);
+                    postOnAnimation(this);
                     return;
                 }
 
@@ -4277,17 +4287,22 @@
 
                 final float modifier = Math.min(Math.abs(screenTravelCount), 1.f);
                 if (position < firstPos) {
-                    smoothScrollBy((int) (-getHeight() * modifier), mScrollDuration);
+                    final int distance = (int) (-getHeight() * modifier);
+                    final int duration = (int) (mScrollDuration * modifier);
+                    smoothScrollBy(distance, duration, true);
                     postOnAnimation(this);
                 } else if (position > lastPos) {
-                    smoothScrollBy((int) (getHeight() * modifier), mScrollDuration);
+                    final int distance = (int) (getHeight() * modifier);
+                    final int duration = (int) (mScrollDuration * modifier);
+                    smoothScrollBy(distance, duration, true);
                     postOnAnimation(this);
                 } else {
                     // On-screen, just scroll.
                     final int targetTop = getChildAt(position - firstPos).getTop();
                     final int distance = targetTop - mOffsetFromTop;
-                    smoothScrollBy(distance,
-                            (int) (mScrollDuration * ((float) distance / getHeight())));
+                    final int duration = (int) (mScrollDuration *
+                            ((float) Math.abs(distance) / getHeight()));
+                    smoothScrollBy(distance, duration, true);
                 }
                 break;
             }
@@ -4393,6 +4408,10 @@
      * @param duration Duration of the scroll animation in milliseconds.
      */
     public void smoothScrollBy(int distance, int duration) {
+        smoothScrollBy(distance, duration, false);
+    }
+
+    void smoothScrollBy(int distance, int duration, boolean linear) {
         if (mFlingRunnable == null) {
             mFlingRunnable = new FlingRunnable();
         }
@@ -4414,7 +4433,7 @@
             }
         } else {
             reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
-            mFlingRunnable.startScroll(distance, duration);
+            mFlingRunnable.startScroll(distance, duration, linear);
         }
     }
 
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index 6aee5a0..1c72a0d 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -35,7 +35,7 @@
     private final SplineOverScroller mScrollerX;
     private final SplineOverScroller mScrollerY;
 
-    private final Interpolator mInterpolator;
+    private Interpolator mInterpolator;
 
     private final boolean mFlywheel;
 
@@ -113,6 +113,10 @@
         this(context, interpolator, flywheel);
     }
 
+    void setInterpolator(Interpolator interpolator) {
+        mInterpolator = interpolator;
+    }
+
     /**
      * The amount of friction applied to flings. The default value
      * is {@link ViewConfiguration#getScrollFriction}.
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 214775a..e628bc1 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -23,6 +23,7 @@
 import android.content.Intent;
 import android.content.IntentSender;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Configuration;
 import android.graphics.Bitmap;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
@@ -87,7 +88,32 @@
      */
     private MemoryUsageCounter mMemoryUsageCounter;
 
-    
+    /**
+     * Maps bitmaps to unique indicies to avoid Bitmap duplication.
+     */
+    private BitmapCache mBitmapCache;
+
+    /**
+     * Indicates whether or not this RemoteViews object is contained as a child of any other
+     * RemoteViews.
+     */
+    private boolean mIsRoot = true;
+
+    /**
+     * Constants to whether or not this RemoteViews is composed of a landscape and portrait
+     * RemoteViews.
+     */
+    private static final int MODE_NORMAL = 0;
+    private static final int MODE_HAS_LANDSCAPE_AND_PORTRAIT = 1;
+
+    /**
+     * Used in conjunction with the special constructor
+     * {@link #RemoteViews(RemoteViews, RemoteViews)} to keep track of the landscape and portrait
+     * RemoteViews.
+     */
+    private RemoteViews mLandscape = null;
+    private RemoteViews mPortrait = null;
+
     /**
      * This flag indicates whether this RemoteViews object is being created from a
      * RemoteViewsService for use as a child of a widget collection. This flag is used
@@ -163,6 +189,10 @@
             }
             return true;
         }
+
+        public void setBitmapCache(BitmapCache bitmapCache) {
+            // Do nothing
+        }
     }
 
     private class SetEmptyView extends Action {
@@ -643,6 +673,112 @@
         }
     }
 
+    private static class BitmapCache {
+        ArrayList<Bitmap> mBitmaps;
+
+        public BitmapCache() {
+            mBitmaps = new ArrayList<Bitmap>();
+        }
+
+        public BitmapCache(Parcel source) {
+            int count = source.readInt();
+            mBitmaps = new ArrayList<Bitmap>();
+            for (int i = 0; i < count; i++) {
+                Bitmap b = Bitmap.CREATOR.createFromParcel(source);
+                mBitmaps.add(b);
+            }
+        }
+
+        public int getBitmapId(Bitmap b) {
+            if (b == null) {
+                return -1;
+            } else {
+                if (mBitmaps.contains(b)) {
+                    return mBitmaps.indexOf(b);
+                } else {
+                    mBitmaps.add(b);
+                    return (mBitmaps.size() - 1);
+                }
+            }
+        }
+
+        public Bitmap getBitmapForId(int id) {
+            if (id == -1 || id >= mBitmaps.size()) {
+                return null;
+            } else {
+                return mBitmaps.get(id);
+            }
+        }
+
+        public void writeBitmapsToParcel(Parcel dest, int flags) {
+            int count = mBitmaps.size();
+            dest.writeInt(count);
+            for (int i = 0; i < count; i++) {
+                mBitmaps.get(i).writeToParcel(dest, flags);
+            }
+        }
+
+        public void assimilate(BitmapCache bitmapCache) {
+            ArrayList<Bitmap> bitmapsToBeAdded = bitmapCache.mBitmaps;
+            int count = bitmapsToBeAdded.size();
+            for (int i = 0; i < count; i++) {
+                Bitmap b = bitmapsToBeAdded.get(i);
+                if (!mBitmaps.contains(b)) {
+                    mBitmaps.add(b);
+                }
+            }
+        }
+
+        public void addBitmapMemory(MemoryUsageCounter memoryCounter) {
+            for (int i = 0; i < mBitmaps.size(); i++) {
+                memoryCounter.addBitmapMemory(mBitmaps.get(i));
+            }
+        }
+    }
+
+    private class BitmapReflectionAction extends Action {
+        int bitmapId;
+        int viewId;
+        Bitmap bitmap;
+        String methodName;
+
+        BitmapReflectionAction(int viewId, String methodName, Bitmap bitmap) {
+            this.bitmap = bitmap;
+            this.viewId = viewId;
+            this.methodName = methodName;
+            bitmapId = mBitmapCache.getBitmapId(bitmap);
+        }
+
+        BitmapReflectionAction(Parcel in) {
+            viewId = in.readInt();
+            methodName = in.readString();
+            bitmapId = in.readInt();
+            bitmap = mBitmapCache.getBitmapForId(bitmapId);
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(TAG);
+            dest.writeInt(viewId);
+            dest.writeString(methodName);
+            dest.writeInt(bitmapId);
+        }
+
+        @Override
+        public void apply(View root, ViewGroup rootParent) throws ActionException {
+            ReflectionAction ra = new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP,
+                    bitmap);
+            ra.apply(root, rootParent);
+        }
+
+        @Override
+        public void setBitmapCache(BitmapCache bitmapCache) {
+            bitmapId = bitmapCache.getBitmapId(bitmap);
+        }
+
+        public final static int TAG = 12;
+    }
+
     /**
      * Base class for the reflection actions.
      */
@@ -894,24 +1030,7 @@
                 case BITMAP:
                     if (this.value != null) {
                         final Bitmap b = (Bitmap) this.value;
-                        final Bitmap.Config c = b.getConfig();
-                        // If we don't know, be pessimistic and assume 4
-                        int bpp = 4;
-                        if (c != null) {
-                            switch (c) {
-                            case ALPHA_8:
-                                bpp = 1;
-                                break;
-                            case RGB_565:
-                            case ARGB_4444:
-                                bpp = 2;
-                                break;
-                            case ARGB_8888:
-                                bpp = 4;
-                                break;
-                            }
-                        }
-                        counter.bitmapIncrement(b.getWidth() * b.getHeight() * bpp);
+                        counter.addBitmapMemory(b);
                     }
                     break;
                 default:
@@ -920,6 +1039,16 @@
         }
     }
 
+    private void configureRemoteViewsAsChild(RemoteViews rv) {
+        mBitmapCache.assimilate(rv.mBitmapCache);
+        rv.setBitmapCache(mBitmapCache);
+        rv.setNotRoot();
+    }
+
+    void setNotRoot() {
+        mIsRoot = false;
+    }
+
     /**
      * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the
      * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()}
@@ -929,17 +1058,31 @@
         public ViewGroupAction(int viewId, RemoteViews nestedViews) {
             this.viewId = viewId;
             this.nestedViews = nestedViews;
+            if (nestedViews != null) {
+                configureRemoteViewsAsChild(nestedViews);
+            }
         }
 
-        public ViewGroupAction(Parcel parcel) {
+        public ViewGroupAction(Parcel parcel, BitmapCache bitmapCache) {
             viewId = parcel.readInt();
-            nestedViews = parcel.readParcelable(null);
+            boolean nestedViewsNull = parcel.readInt() == 0;
+            if (!nestedViewsNull) {
+                nestedViews = new RemoteViews(parcel, bitmapCache);
+            } else {
+                nestedViews = null;
+            }
         }
 
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeInt(TAG);
             dest.writeInt(viewId);
-            dest.writeParcelable(nestedViews, 0 /* no flags */);
+            if (nestedViews != null) {
+                dest.writeInt(1);
+                nestedViews.writeToParcel(dest, flags);
+            } else {
+                // signifies null
+                dest.writeInt(0);
+            }
         }
 
         @Override
@@ -959,7 +1102,14 @@
         @Override
         public void updateMemoryUsageEstimate(MemoryUsageCounter counter) {
             if (nestedViews != null) {
-                counter.bitmapIncrement(nestedViews.estimateBitmapMemoryUsage());
+                counter.increment(nestedViews.estimateMemoryUsage());
+            }
+        }
+
+        @Override
+        public void setBitmapCache(BitmapCache bitmapCache) {
+            if (nestedViews != null) {
+                nestedViews.setBitmapCache(bitmapCache);
             }
         }
 
@@ -1027,18 +1177,39 @@
      */
     private class MemoryUsageCounter {
         public void clear() {
-            mBitmapHeapMemoryUsage = 0;
+            mMemoryUsage = 0;
         }
 
-        public void bitmapIncrement(int numBytes) {
-            mBitmapHeapMemoryUsage += numBytes;
+        public void increment(int numBytes) {
+            mMemoryUsage += numBytes;
         }
 
-        public int getBitmapHeapMemoryUsage() {
-            return mBitmapHeapMemoryUsage;
+        public int getMemoryUsage() {
+            return mMemoryUsage;
         }
 
-        int mBitmapHeapMemoryUsage;
+        public void addBitmapMemory(Bitmap b) {
+            final Bitmap.Config c = b.getConfig();
+            // If we don't know, be pessimistic and assume 4
+            int bpp = 4;
+            if (c != null) {
+                switch (c) {
+                case ALPHA_8:
+                    bpp = 1;
+                    break;
+                case RGB_565:
+                case ARGB_4444:
+                    bpp = 2;
+                    break;
+                case ARGB_8888:
+                    bpp = 4;
+                    break;
+                }
+            }
+            increment(b.getWidth() * b.getHeight() * bpp);
+        }
+
+        int mMemoryUsage;
     }
 
     /**
@@ -1051,62 +1222,122 @@
     public RemoteViews(String packageName, int layoutId) {
         mPackage = packageName;
         mLayoutId = layoutId;
+        mBitmapCache = new BitmapCache();
 
         // setup the memory usage statistics
         mMemoryUsageCounter = new MemoryUsageCounter();
         recalculateMemoryUsage();
     }
 
+    private boolean hasLandscapeAndPortraitLayouts() {
+        return (mLandscape != null) && (mPortrait != null);
+    }
+
+     /**
+     * Create a new RemoteViews object that will inflate as the specified
+     * landspace or portrait RemoteViews, depending on the current configuration.
+     *
+     * @param landscape The RemoteViews to inflate in landscape configuration
+     * @param portrait The RemoteViews to inflate in portrait configuration
+     */
+    public RemoteViews(RemoteViews landscape, RemoteViews portrait) {
+        if (landscape == null || portrait == null) {
+            throw new RuntimeException("Both RemoteViews must be non-null");
+        }
+        if (landscape.getPackage().compareTo(portrait.getPackage()) != 0) {
+            throw new RuntimeException("Both RemoteViews must share the same package");
+        }
+        mPackage = portrait.getPackage();
+        mLayoutId = portrait.getLayoutId();
+
+        mLandscape = landscape;
+        mPortrait = portrait;
+
+        // setup the memory usage statistics
+        mMemoryUsageCounter = new MemoryUsageCounter();
+
+        mBitmapCache = new BitmapCache();
+        configureRemoteViewsAsChild(landscape);
+        configureRemoteViewsAsChild(portrait);
+
+        recalculateMemoryUsage();
+    }
+
     /**
      * Reads a RemoteViews object from a parcel.
      * 
      * @param parcel
      */
     public RemoteViews(Parcel parcel) {
-        mPackage = parcel.readString();
-        mLayoutId = parcel.readInt();
-        mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false;
+        this(parcel, null);
+    }
 
-        int count = parcel.readInt();
-        if (count > 0) {
-            mActions = new ArrayList<Action>(count);
-            for (int i=0; i<count; i++) {
-                int tag = parcel.readInt();
-                switch (tag) {
-                case SetOnClickPendingIntent.TAG:
-                    mActions.add(new SetOnClickPendingIntent(parcel));
-                    break;
-                case SetDrawableParameters.TAG:
-                    mActions.add(new SetDrawableParameters(parcel));
-                    break;
-                case ReflectionAction.TAG:
-                    mActions.add(new ReflectionAction(parcel));
-                    break;
-                case ViewGroupAction.TAG:
-                    mActions.add(new ViewGroupAction(parcel));
-                    break;
-                case ReflectionActionWithoutParams.TAG:
-                    mActions.add(new ReflectionActionWithoutParams(parcel));
-                    break;
-                case SetEmptyView.TAG:
-                    mActions.add(new SetEmptyView(parcel));
-                    break;
-                case SetPendingIntentTemplate.TAG:
-                    mActions.add(new SetPendingIntentTemplate(parcel));
-                    break;
-                case SetOnClickFillInIntent.TAG:
-                    mActions.add(new SetOnClickFillInIntent(parcel));
-                    break;
-                case SetRemoteViewsAdapterIntent.TAG:
-                    mActions.add(new SetRemoteViewsAdapterIntent(parcel));
-                    break;
-                case TextViewDrawableAction.TAG:
-                    mActions.add(new TextViewDrawableAction(parcel));
-                    break;
-                default:
-                    throw new ActionException("Tag " + tag + " not found");
+    private RemoteViews(Parcel parcel, BitmapCache bitmapCache) {
+        int mode = parcel.readInt();
+
+        // We only store a bitmap cache in the root of the RemoteViews.
+        if (bitmapCache == null) {
+            mBitmapCache = new BitmapCache(parcel);
+        } else {
+            setBitmapCache(bitmapCache);
+            setNotRoot();
+        }
+
+        if (mode == MODE_NORMAL) {
+            mPackage = parcel.readString();
+            mLayoutId = parcel.readInt();
+            mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false;
+
+            int count = parcel.readInt();
+            if (count > 0) {
+                mActions = new ArrayList<Action>(count);
+                for (int i=0; i<count; i++) {
+                    int tag = parcel.readInt();
+                    switch (tag) {
+                    case SetOnClickPendingIntent.TAG:
+                        mActions.add(new SetOnClickPendingIntent(parcel));
+                        break;
+                    case SetDrawableParameters.TAG:
+                        mActions.add(new SetDrawableParameters(parcel));
+                        break;
+                    case ReflectionAction.TAG:
+                        mActions.add(new ReflectionAction(parcel));
+                        break;
+                    case ViewGroupAction.TAG:
+                        mActions.add(new ViewGroupAction(parcel, mBitmapCache));
+                        break;
+                    case ReflectionActionWithoutParams.TAG:
+                        mActions.add(new ReflectionActionWithoutParams(parcel));
+                        break;
+                    case SetEmptyView.TAG:
+                        mActions.add(new SetEmptyView(parcel));
+                        break;
+                    case SetPendingIntentTemplate.TAG:
+                        mActions.add(new SetPendingIntentTemplate(parcel));
+                        break;
+                    case SetOnClickFillInIntent.TAG:
+                        mActions.add(new SetOnClickFillInIntent(parcel));
+                        break;
+                    case SetRemoteViewsAdapterIntent.TAG:
+                        mActions.add(new SetRemoteViewsAdapterIntent(parcel));
+                        break;
+                    case TextViewDrawableAction.TAG:
+                        mActions.add(new TextViewDrawableAction(parcel));
+                        break;
+                    case BitmapReflectionAction.TAG:
+                        mActions.add(new BitmapReflectionAction(parcel));
+                        break;
+                    default:
+                        throw new ActionException("Tag " + tag + " not found");
+                    }
                 }
             }
+        } else {
+            // MODE_HAS_LANDSCAPE_AND_PORTRAIT
+            mLandscape = new RemoteViews(parcel, mBitmapCache);
+            mPortrait = new RemoteViews(parcel, mBitmapCache);
+            mPackage = mPortrait.getPackage();
+            mLayoutId = mPortrait.getLayoutId();
         }
 
         // setup the memory usage statistics
@@ -1116,11 +1347,18 @@
 
     @Override
     public RemoteViews clone() {
-        final RemoteViews that = new RemoteViews(mPackage, mLayoutId);
-        if (mActions != null) {
-            that.mActions = (ArrayList<Action>)mActions.clone();
-        }
+        RemoteViews that;
+        if (!hasLandscapeAndPortraitLayouts()) {
+            that = new RemoteViews(mPackage, mLayoutId);
 
+            if (mActions != null) {
+                that.mActions = (ArrayList<Action>)mActions.clone();
+            }
+        } else {
+            RemoteViews land = mLandscape.clone();
+            RemoteViews port = mPortrait.clone();
+            that = new RemoteViews(land, port);
+        }
         // update the memory usage stats of the cloned RemoteViews
         that.recalculateMemoryUsage();
         return that;
@@ -1130,6 +1368,13 @@
         return mPackage;
     }
 
+    /**
+     * Reutrns the layout id of the root layout associated with this RemoteViews. In the case
+     * that the RemoteViews has both a landscape and portrait root, this will return the layout
+     * id associated with the portrait layout.
+     *
+     * @return the layout id.
+     */
     public int getLayoutId() {
         return mLayoutId;
     }
@@ -1151,20 +1396,47 @@
     private void recalculateMemoryUsage() {
         mMemoryUsageCounter.clear();
 
-        // Accumulate the memory usage for each action
-        if (mActions != null) {
-            final int count = mActions.size();
-            for (int i= 0; i < count; ++i) {
-                mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter);
+        if (!hasLandscapeAndPortraitLayouts()) {
+            // Accumulate the memory usage for each action
+            if (mActions != null) {
+                final int count = mActions.size();
+                for (int i= 0; i < count; ++i) {
+                    mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter);
+                }
             }
+            if (mIsRoot) {
+                mBitmapCache.addBitmapMemory(mMemoryUsageCounter);
+            }
+        } else {
+            mMemoryUsageCounter.increment(mLandscape.estimateMemoryUsage());
+            mMemoryUsageCounter.increment(mPortrait.estimateMemoryUsage());
+            mBitmapCache.addBitmapMemory(mMemoryUsageCounter);
+        }
+    }
+
+    /**
+     * Recursively sets BitmapCache in the hierarchy and update the bitmap ids.
+     */
+    private void setBitmapCache(BitmapCache bitmapCache) {
+        mBitmapCache = bitmapCache;
+        if (!hasLandscapeAndPortraitLayouts()) {
+            if (mActions != null) {
+                final int count = mActions.size();
+                for (int i= 0; i < count; ++i) {
+                    mActions.get(i).setBitmapCache(bitmapCache);
+                }
+            }
+        } else {
+            mLandscape.setBitmapCache(bitmapCache);
+            mPortrait.setBitmapCache(bitmapCache);
         }
     }
 
     /**
      * Returns an estimate of the bitmap heap memory usage for this RemoteViews.
      */
-    int estimateBitmapMemoryUsage() {
-        return mMemoryUsageCounter.getBitmapHeapMemoryUsage();
+    int estimateMemoryUsage() {
+        return mMemoryUsageCounter.getMemoryUsage();
     }
 
     /**
@@ -1173,6 +1445,11 @@
      * @param a The action to add
      */
     private void addAction(Action a) {
+        if (hasLandscapeAndPortraitLayouts()) {
+            throw new RuntimeException("RemoteViews specifying separate landscape and portrait" +
+                    " layouts cannot be modified. Instead, fully configure the landscape and" +
+                    " portrait layouts individually before constructing the combined layout.");
+        }
         if (mActions == null) {
             mActions = new ArrayList<Action>();
         }
@@ -1644,7 +1921,7 @@
      * @param value The value to pass to the method.
      */
     public void setBitmap(int viewId, String methodName, Bitmap value) {
-        addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, value));
+        addAction(new BitmapReflectionAction(viewId, methodName, value));
     }
 
     /**
@@ -1679,6 +1956,18 @@
         setCharSequence(viewId, "setContentDescription", contentDescription);
     }
 
+    private RemoteViews getRemoteViewsToApply(Context context) {
+        if (hasLandscapeAndPortraitLayouts()) {
+            int orientation = context.getResources().getConfiguration().orientation;
+            if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+                return mLandscape;
+            } else {
+                return mPortrait;
+            }
+        }
+        return this;
+    }
+
     /**
      * Inflates the view hierarchy represented by this object and applies
      * all of the actions.
@@ -1691,6 +1980,8 @@
      * @return The inflated view hierarchy
      */
     public View apply(Context context, ViewGroup parent) {
+        RemoteViews rvToApply = getRemoteViewsToApply(context);
+
         View result;
 
         Context c = prepareContext(context);
@@ -1701,13 +1992,13 @@
         inflater = inflater.cloneInContext(c);
         inflater.setFilter(this);
 
-        result = inflater.inflate(mLayoutId, parent, false);
+        result = inflater.inflate(rvToApply.getLayoutId(), parent, false);
 
-        performApply(result, parent);
+        rvToApply.performApply(result, parent);
 
         return result;
     }
-    
+
     /**
      * Applies all of the actions to the provided view.
      *
@@ -1717,8 +2008,20 @@
      * the {@link #apply(Context,ViewGroup)} call.
      */
     public void reapply(Context context, View v) {
+        RemoteViews rvToApply = getRemoteViewsToApply(context);
+
+        // In the case that a view has this RemoteViews applied in one orientation, is persisted
+        // across orientation change, and has the RemoteViews re-applied in the new orientation,
+        // we throw an exception, since the layouts may be completely unrelated.
+        if (hasLandscapeAndPortraitLayouts()) {
+            if (v.getId() != rvToApply.getLayoutId()) {
+                throw new RuntimeException("Attempting to re-apply RemoteViews to a view that" +
+                        " that does not share the same root layout id.");
+            }
+        }
+
         prepareContext(context);
-        performApply(v, (ViewGroup) v.getParent());
+        rvToApply.performApply(v, (ViewGroup) v.getParent());
     }
 
     private void performApply(View v, ViewGroup parent) {
@@ -1757,25 +2060,42 @@
     public boolean onLoadClass(Class clazz) {
         return clazz.isAnnotationPresent(RemoteView.class);
     }
-    
+
     public int describeContents() {
         return 0;
     }
 
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mPackage);
-        dest.writeInt(mLayoutId);
-        dest.writeInt(mIsWidgetCollectionChild ? 1 : 0);
-        int count;
-        if (mActions != null) {
-            count = mActions.size();
+        if (!hasLandscapeAndPortraitLayouts()) {
+            dest.writeInt(MODE_NORMAL);
+            // We only write the bitmap cache if we are the root RemoteViews, as this cache
+            // is shared by all children.
+            if (mIsRoot) {
+                mBitmapCache.writeBitmapsToParcel(dest, flags);
+            }
+            dest.writeString(mPackage);
+            dest.writeInt(mLayoutId);
+            dest.writeInt(mIsWidgetCollectionChild ? 1 : 0);
+            int count;
+            if (mActions != null) {
+                count = mActions.size();
+            } else {
+                count = 0;
+            }
+            dest.writeInt(count);
+            for (int i=0; i<count; i++) {
+                Action a = mActions.get(i);
+                a.writeToParcel(dest, 0);
+            }
         } else {
-            count = 0;
-        }
-        dest.writeInt(count);
-        for (int i=0; i<count; i++) {
-            Action a = mActions.get(i);
-            a.writeToParcel(dest, 0);
+            dest.writeInt(MODE_HAS_LANDSCAPE_AND_PORTRAIT);
+            // We only write the bitmap cache if we are the root RemoteViews, as this cache
+            // is shared by all children.
+            if (mIsRoot) {
+                mBitmapCache.writeBitmapsToParcel(dest, flags);
+            }
+            mLandscape.writeToParcel(dest, flags);
+            mPortrait.writeToParcel(dest, flags);
         }
     }
 
diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java
index 8067435..f266d50 100644
--- a/core/java/android/widget/RemoteViewsAdapter.java
+++ b/core/java/android/widget/RemoteViewsAdapter.java
@@ -595,7 +595,7 @@
             for (Integer i : mIndexRemoteViews.keySet()) {
                 final RemoteViews v = mIndexRemoteViews.get(i);
                 if (v != null) {
-                    mem += v.estimateBitmapMemoryUsage();
+                    mem += v.estimateMemoryUsage();
                 }
             }
             return mem;
@@ -942,10 +942,6 @@
      * which  wouldn't otherwise be possible.
      */
     public void setVisibleRangeHint(int lowerBound, int upperBound) {
-        if (lowerBound < 0 || upperBound < 0) {
-            throw new RuntimeException("Attempted to set invalid range: lowerBound="+lowerBound +
-                    "," + "upperBound="+upperBound);
-        }
         mVisibleWindowLowerBound = lowerBound;
         mVisibleWindowUpperBound = upperBound;
     }
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index 99cd0b8..561326e 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -381,6 +381,17 @@
     }
 
     /**
+     * Returns the IME options set on the query text field.
+     * @return the ime options
+     * @see TextView#setImeOptions(int)
+     *
+     * @attr ref android.R.styleable#SearchView_imeOptions
+     */
+    public int getImeOptions() {
+        return mQueryTextView.getImeOptions();
+    }
+
+    /**
      * Sets the input type on the query text field.
      *
      * @see TextView#setInputType(int)
@@ -392,6 +403,16 @@
         mQueryTextView.setInputType(inputType);
     }
 
+    /**
+     * Returns the input type set on the query text field.
+     * @return the input type
+     *
+     * @attr ref android.R.styleable#SearchView_inputType
+     */
+    public int getInputType() {
+        return mQueryTextView.getInputType();
+    }
+
     /** @hide */
     @Override
     public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
@@ -514,6 +535,26 @@
     }
 
     /**
+     * Gets the hint text to display in the query text field.
+     * @return the query hint text, if specified, null otherwise.
+     *
+     * @attr ref android.R.styleable#SearchView_queryHint
+     */
+    public CharSequence getQueryHint() {
+        if (mQueryHint != null) {
+            return mQueryHint;
+        } else if (mSearchable != null) {
+            CharSequence hint = null;
+            int hintId = mSearchable.getHintId();
+            if (hintId != 0) {
+                hint = getContext().getString(hintId);
+            }
+            return hint;
+        }
+        return null;
+    }
+
+    /**
      * Sets the default or resting state of the search field. If true, a single search icon is
      * shown by default and expands to show the text field and other buttons when pressed. Also,
      * if the default state is iconified, then it collapses to that state when the close button
@@ -651,6 +692,15 @@
         requestLayout();
     }
 
+    /**
+     * Gets the specified maximum width in pixels, if set. Returns zero if
+     * no maximum width was specified.
+     * @return the maximum width of the view
+     */
+    public int getMaxWidth() {
+        return mMaxWidth;
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         // Let the standard measurements take effect in iconified state.
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index a91b16e..98e45fb 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -457,7 +457,16 @@
         public void parse() {
             Editable editable = (Editable) mTextView.getText();
             // Iterate over the newly added text and schedule new SpellCheckSpans
-            final int start = editable.getSpanStart(mRange);
+            final int start;
+            if (mIsSentenceSpellCheckSupported) {
+                // TODO: Find the start position of the sentence.
+                // Set span with the context
+                start =  Math.max(
+                        0, editable.getSpanStart(mRange) - MIN_SENTENCE_LENGTH);
+            } else {
+                start = editable.getSpanStart(mRange);
+            }
+
             final int end = editable.getSpanEnd(mRange);
 
             int wordIteratorWindowEnd = Math.min(end, start + WORD_ITERATOR_INTERVAL);
@@ -512,9 +521,7 @@
                     return;
                 }
                 // TODO: Find the start position of the sentence.
-                // Set span with the context
-                final int spellCheckStart =  Math.max(
-                        0, Math.min(wordStart, regionEnd - MIN_SENTENCE_LENGTH));
+                final int spellCheckStart =  wordStart;
                 if (regionEnd <= spellCheckStart) {
                     return;
                 }
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index dd59444..5507047 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -322,6 +322,7 @@
         const float sy = scaledHeight / float(decoded->height());
 
         bitmap->setConfig(decoded->getConfig(), scaledWidth, scaledHeight);
+        bitmap->setIsOpaque(decoded->isOpaque());
         bitmap->allocPixels(&javaAllocator, NULL);
         bitmap->eraseColor(0);
 
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 60d2159..3ae2b4e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -112,6 +112,13 @@
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
     <protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
 
+    <protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
+    <protected-broadcast android:name="android.intent.action.ANALOG_AUDIO_DOCK_PLUG" />
+    <protected-broadcast android:name="android.intent.action.DIGITAL_AUDIO_DOCK_PLUG" />
+    <protected-broadcast android:name="android.intent.action.HDMI_AUDIO_PLUG" />
+    <protected-broadcast android:name="android.intent.action.USB_AUDIO_ACCESSORY_PLUG" />
+    <protected-broadcast android:name="android.intent.action.USB_AUDIO_DEVICE_PLUG" />
+
     <protected-broadcast android:name="android.net.conn.CONNECTIVITY_CHANGE" />
     <protected-broadcast android:name="android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE" />
 
diff --git a/core/res/res/layout/choose_type_and_account.xml b/core/res/res/layout/choose_type_and_account.xml
index 5a05126..d7068b7bf 100644
--- a/core/res/res/layout/choose_type_and_account.xml
+++ b/core/res/res/layout/choose_type_and_account.xml
@@ -38,7 +38,7 @@
     <View android:layout_height="3dip"
           android:layout_width="match_parent"
           android:background="#323232"/>
-    
+
     <TextView android:id="@+id/description"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
@@ -56,7 +56,12 @@
         android:layout_weight="1"
         android:scrollbarAlwaysDrawVerticalTrack="true" />
 
+    <View android:layout_height="1dip"
+        android:layout_width="match_parent"
+        android:background="?android:attr/dividerHorizontal" />
+
     <Button android:id="@+id/addAccount"
+        style="?android:attr/buttonBarButtonStyle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginLeft="2dip"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 5f48a1c..e033d22 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Jou tablet gaan nou afskakel."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Jou foon gaan nou afsit."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Wil jy afskakel?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Herlaai na veilige modus"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Wil jy na veilige modus herlaai? Dit sal alle derdeparty programme deaktiveer wat jy geïnstalleer het. Hulle sal herstel word wanneer jy weer herlaai."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Onlangs"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Geen onlangse programme nie."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-opsies"</string>
@@ -219,12 +217,14 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Laat die program toe om WAP-boodskappe te ontvang en te verwerk. Kwaadwillige programme kan jou boodskappe monitor of uitvee sonder om dit aan jou te wys."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"haal lopende programme op"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Laat die program toe om inligting op te haal oor huidige en onlangse take. Kwaadwillige programme kan dalk private inligting oor ander programme ontdek."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"haal besonderhede van lopende programme op"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Laat die program toe om inligting op te haal oor huidige en onlangse take. Kwaadwillige programme kan dalk private inligting oor ander programme ontdek."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"herrangskik lopende programme"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Laat die program toe om take na die voorgrond en agtergrond te skuif. Kwaadwillige programme kan hulself sonder jou beheer na vore dwing."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"stop lopende programme"</string>
     <string name="permdesc_removeTasks" msgid="1394714352062635493">"Laat die program toe om take te verwyder en hul programme te dood. Kwaadwillige programme kan die gedrag van ander programme ontwrig."</string>
     <string name="permlab_startAnyActivity" msgid="2918768238045206456">"begin enige aktiwiteit"</string>
-    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Laat die program toe om \'n aktiwiteit te begin, ongeag van toestemming-beskerming of uitgevoerde status."</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Laat die program toe om \'n aktiwiteit te begin, ongeag toestemming-beskerming of uitgevoerde status."</string>
     <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"stel skermversoenbaarheid"</string>
     <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Laat die program toe om om die skermversoenbaarheid-modus van ander programme te beheer. Kwaadwillige programme kan die gedrag van ander programme breek."</string>
     <string name="permlab_setDebugApp" msgid="3022107198686584052">"aktiveer programontfouting"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Laat die program toe om klewerige uitsendings te stuur, wat oorbly nadat die uitsending klaar is. Kwaadwillige programme kan die tablet stadig of onstabiel maak deurdat dit te veel geheue gebruik."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Laat die program toe om klewerige uitsendings te stuur, wat oorbly nadat die uitsending klaar is. Kwaadwillige programme kan die foon stadig of onstabiel maak deurdat dit te veel geheue gebruik."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lees kontakdata"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Laat die program toe om al die data oor jou kontakte wat op jou tablet geberg is te lees, insluitend hoe dikwels jy gebel, ge-epos of op ander maniere met spesifieke individue gekommunikeer het. Dit help met die outomatiese voltooiing van e-posadresse en ander gerieflike kenmerke. Kwaadwillige programme kan hierdie toestemming gebruik om jou kontakdata aan ander mense te stuur."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Laat die program toe om al die data oor jou kontakte wat op jou foon geberg is te lees, insluitend hoe dikwels jy gebel, ge-epos of op ander maniere met spesifieke individue gekommunikeer het. Dit help met die outomatiese voltooiing van e-posadresse en ander gerieflike kenmerke. Kwaadwillige programme kan hierdie toestemming gebruik om jou kontakdata aan ander mense te stuur."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"skryf kontakdata"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Laat die program toe om al die data oor jou kontakte wat op jou tablet geberg is te lees, insluitend hoe dikwels jy gebel, ge-epos of op ander maniere met spesifieke individue gekommunikeer het. Dit help met die outomateise voltooiing van e-posadresse en ander gerieflike kenmerke. Kwaadwillige programme kan hierdie toestemming gebruik om jou kontakdata uit te vee of te verander."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Laat die program toe om al die data oor jou kontakte wat op jou foon geberg is te lees, insluitend hoe dikwels jy gebel, ge-epos of op ander maniere met spesifieke individue gekommunikeer het. Dit help met die outomatiese voltooiing van e-posadresse en ander gerieflike kenmerke. Kwaadwillige programme kan hierdie toestemming gebruik om jou kontakdata uit te vee of te verander."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lees oproeprekord"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Laat die program toe om jou tablet se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te lees. Kwaadwillige programme kan dit gebruik om jou data na ander mense te stuur."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Laat die program toe om jou foon se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te lees. Kwaadwillige programme kan dit gebruik om jou data na ander mense te stuur."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"karakter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"woord"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"skakel"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"reël"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Fabriektoets het gefaal"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 9e99114..8f0ad171 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -146,8 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ጡባዊዎ ይዘጋል።"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ስልክዎ ይዘጋል።"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"ዘግተህ መውጣት  ትፈልጋለህ?"</string>
-    <string name="reboot_safemode_title" msgid="7054509914500140361">"ወደ ጥንቁቅ ሁናቴ ውስጥ ዳግም አስጀምር"</string>
-    <string name="reboot_safemode_confirm" msgid="55293944502784668">"ወደ ጥንቁቅ ሁናቴ ውስጥ ዳግም ማስጀመር ትፈልጋለህ? ይሄ ሁሉንም የጫንካቸው የሶስተኛ ወገን መተግበሪያዎችን ያሰናክላል።  እንደገና ዳግም ስታስጀምር ይመለስሉሃል።"</string>
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"በአስተማማኝ ኹነታ ውስጥ ዳግም አስጀምር"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"በአስተማማኝ ኹነታ ውስጥ ዳግም ማስጀመር ትፈልጋለህ? ይሄ ሁሉንም የጫንካቸው የሶስተኛ ወገን መተግበሪያዎችን ያሰናክላል።  እንደገና ዳግም ስታስጀምር ይመለስሉሃል።"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"የቅርብ ጊዜ"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"ምንም የቅርብ ጊዜ ትግበራዎች የሉም"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"የጡባዊ አማራጮች"</string>
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"WAP መልዕክቶችን ለመቀበል እና ለማስኬድ ለመተግበሪያው ይፈቅዳሉ፡፡ ተንኮል አዘል መተግበሪያዎች አንተን ሳያሳዩ ሊሰርዙዎቸው ወይም መልዕክቶችህን ሊቆጣጠሩ ይችላሉ፡፡"</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"አሂድ መተግበሪያዎችን ሰርስረህ አውጣ"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"ስለ አሁኑ እና በቅርቡ እየተካሄዱ ያሉ ተግባሮችን መረጃ ሰርስሮ ለማውጣት ለመተግበሪያው ይፈቅዳሉ፡፡ ስለ ሌሎች መተግበሪያዎች የግል መረጃ ተንኮል አዘል መተግበሪያዎች ሊያገኙ ይችላሉ፡፡"</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"እየሄዱ ስላሉ የመተግበሪያዎች ዝርዝሮች አምጣ"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"መተግበሪያው በአሁኑ ጊዜ እየተካሄዱ ስላሉና በቅርብ ጊዜ ስለተካሄዱ ተግባሮች መረጃ ሰርስሮ እንዲያወጣ ይፈቅድለታል። ተንኮል-አዘል መተግበሪያዎች ስለ ሌሎች መተግበሪያዎች የግል መረጃ ሊያገኙ ይችላሉ።"</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"አሂድ ትግበራዎችን ድጋሚ ደርድር"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"ወደ ግንባር ዎይ እና ዳራ ስራዎችን ለማንቀሳቀስ ለመተግበሪያው ይፈቅዳሉ፡፡ ያለአንተ ቁጥጥር  ተንኮል አዘል መተግበሪያዎች ራሳቸውን ወደፊት መምጣት ሊያስገድዱ ይችላሉ፡፡"</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"የአሂድ ትግበራዎች አቁም"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"ስርጭቱ ከተጠናቀቀ በኋላ የሚቀሩ፣ አጣባቂ ስርጭቶችን ለመላክ ለመተግበሪያው ይፈቅዳል፡፡ በጣም ብዙ ማህደረ ትውስታ  እንዲጠቀም በማድረግ ተንኮል አዘል መተግበሪያዎች ጡባዊ ተኮን እንዲቀራፈፍ ወይም ያልተረጋጋ እንዲሆን ሊያደርጉት ይችላሉ፡፡"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"ስርጭቱ ከተጠናቀቀ በኋላ የሚቀሩ፣ አጣባቂ ስርጭቶችን ለመላክ ለመተግበሪያው ይፈቅዳሉ፡፡ በጣም ብዙ ማህደረ ትውስታ  እንዲጠቀም በማድረግ ጎጂ መተግበሪያዎች ስልኩን እንዲቀራፈፍ ወይም ያልተረጋጋ እንዲሆን ሊያደርጉት ይችላሉ፡፡"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"የዕውቂያ ውሂብ አንበብ"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"መተግበሪያው በጡባዊ ተኮህ ስለተከማቹ ዕውቂያዎች ያሉትን ውሂቦች በሙሉ፤ ጥሪ ያደረግክበትን፣ ኢሜይል የላክበትን ወይም ከተወሰኑ ግለሰቦች ጋር በሌላ መንገድ የተገናኘህበትን ድግምግሞሽ ጨምሮ እንዲያነብ ይፈቅድለታል። ይህ ለኢሜይል አድራሻዎች በራስ-አጠናቅቅ እና ለሌሎች ምቹ ባህሪያት ይረዳል። ጎጂ መተግበሪያዎች ይህንን ፈቃድ የዕውቂያህን ውሂብ ለሌሎች ሰዎች ለመላክ ሊጠቀሙት ይችላሉ።"</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"መተግበሪያው በስልክህ ስለተከማቹ ዕውቂያዎች ያሉትን ውሂቦች በሙሉ ጥሪ ያደረግክበትን፣ ኢሜይል የላክበትን ወይም ከተወሰኑ ግለሰቦች ጋር በሌላ መንገድ የተገናኘህበትን ድግምግሞሽ ጨምሮ መተግበሪያው እንዲያነብ ይፈቅድለታል። ይሄ ለኢሜይል አድራሻዎች በራስ-አጠናቅቅ እና ለሌሎች ምቹ ባህሪያት ይረዳል። ተንኮል-አዘል መተግበሪያዎች ይህንን ፈቃድ የዕውቂያህን ውሂብ ለሌሎች ሰዎች ለመላክ ሊጠቀሙት ይችላሉ።"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"የእውቂያ ውሂብ ፃፍ"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"መተግበሪያው በጡባዊ ቱኮህ ስለተከማቹ ዕውቂያዎች ያሉትን ውሂቦች በሙሉ፤ ጥሪ ያደረግክበትን፣ ኢሜይል የላክበትን ወይም ከተወሰኑ ግለሰቦች ጋር በሌላ መንገድ የተገናኘህበትን ድግምግሞሽ ጨምሮ እንዲቀይር ይፈቅድለታል። ይህ ለኢሜይል አድራሻዎች በራስ-አጠናቅቅ እና ለሌሎች ምቹ ባህሪያት ይረዳል። ተንኮል-አዘል መተግበሪያዎች ይህንን የዕውቂያህን ውሂብ ለመሰረዝ ወይም ለመቀየር ሊጠቀሙበት ይችላሉ።"</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"መተግበሪያው በስልክህ ስለተከማቹ ዕውቂያዎች ያሉትን ውሂቦች በሙሉ፤ ጥሪ ያደረግክበትን፣ ኢሜይል የላክበትን ወይም ከተወሰኑ ግለሰቦች ጋር በሌላ መንገድ የተገናኘህበትን ድግምግሞሽ ጨምሮ እንዲቀይር ይፈቅድለታል። ይህ ለኢሜይል አድራሻዎች በራስ-አጠናቅቅ እና ለሌሎች ምቹ ባህሪያት ይረዳል። ተንኮል-አዘል መተግበሪያዎች ይህንን የዕውቂያህን ውሂብ ለመሰረዝ ወይም ለመቀየር ሊጠቀሙበት ይችላሉ።"</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"የጥሪ ምዝግብ ማስታወሻን አንብብ"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የጡባዊ ተኮህን ምዝግብ ማስታወሻ እንዲያነብ ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች ለሌሎች ሰዎች ውሂብህን ለመላክ ሊጠቀሙበት ይችላሉ።"</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክ ጥሪህን ምዝግብ ማስታወሻ እንዲያነብ ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች ለሌሎች ሰዎች ውሂብህን ለመላክ ሊጠቀሙበት ይችላሉ።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index b7dc5bc..a22a17e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"سيتم إيقاف تشغيل الجهاز اللوحي."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"سيتم إيقاف تشغيل هاتفك."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"هل تريد إيقاف التشغيل؟"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"إعادة تشغيل في الوضع الآمن"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"هل تريد إعادة تشغيل الكمبيوتر في الوضع الآمن؟ سيؤدي ذلك إلى تعطيل جميع تطبيقات الجهات الخارجية التي تم تثبيتها. ستتم استعادتها عند إعادة التشغيل مرة أخرى."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"حديثة"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"ليست هناك تطبيقات حديثة."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"خيارات الجهاز اللوحي"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"للسماح للتطبيق بتلقي رسائل WAP ومعالجتها. قد تراقب بعض التطبيقات الضارة رسائلك أو تحذفها بدون عرضها لك."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"استرداد التطبيقات التي قيد التشغيل"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"للسماح للتطبيق باسترداد معلومات حول المهام المُشغلة الحالية والحديثة. قد تكتشف التطبيقات الضارة معلومات خاصة حول التطبيقات الأخرى."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"استرداد تفاصيل التطبيقات قيد التشغيل"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"للسماح للتطبيق باسترداد معلومات تفصيلية حول المهام قيد التشغيل حاليًا ومؤخرًا. قد تكتشف التطبيقات الضارة معلومات خاصة حول التطبيقات الأخرى."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"إعادة ترتيب التطبيقات قيد التشغيل"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"للسماح لتطبيق ما بنقل المهام إلى المقدمة والخلفية. قد تفرض التطبيقات الضارة نفسها إلى المقدمة بدون تحكم منك."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"إيقاف التطبيقات التي قيد التشغيل"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"للسماح للتطبيق بإرسال بث طويل الزيارة، والذي يظل بعد انتهاء البث. قد تجعل التطبيقات الضارة الجهاز اللوحي بطيئًا أو غير مستقر من خلال التسبب في استخدامه لمساحة كبيرة للغاية من الذاكرة."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"للسماح للتطبيق بإرسال بث طويل الزيارة، والذي يظل بعد انتهاء البث. قد تجعل التطبيقات الضارة الهاتف بطيئًا أو غير مستقر من خلال التسبب في استخدامه لمساحة كبيرة للغاية من الذاكرة."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"قراءة بيانات جهة الاتصال"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"للسماح للتطبيق بقراءة جميع البيانات عن جهات الاتصال المخزنة على جهازك اللوحي، بما في ذلك معدل الاتصال بأفراد معينين أو إرسال رسائل إلكترونية إليهم أو التواصل معهم بطرق أخرى. يفيد هذا ميزة الإكمال التلقائي لعناوين البريد الإلكتروني والميزات المناسبة الأخرى. ويمكن للتطبيقات الضارة استخدام هذا الإذن لإرسال بيانات الاتصال إلى أشخاص آخرين."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"للسماح للتطبيق بقراءة جميع البيانات عن جهات الاتصال المخزنة على هاتفك، بما في ذلك معدل الاتصال بأفراد معينين أو إرسال رسائل إلكترونية إليهم أو التواصل معهم بطرق أخرى. يفيد هذا ميزة الإكمال التلقائي لعناوين البريد الإلكتروني والميزات المناسبة الأخرى. ويمكن للتطبيقات الضارة استخدام هذا الإذن لإرسال بيانات الاتصال إلى أشخاص آخرين."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"كتابة بيانات جهة الاتصال"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"للسماح للتطبيق بتعديل البيانات عن جهات الاتصال المخزنة على جهازك اللوحي، بما في ذلك معدل الاتصال بأفراد معينين أو إرسال رسائل إلكترونية إليهم أو التواصل معهم بطرق أخرى. يفيد هذا ميزة الإكمال التلقائي لعناوين البريد الإلكتروني والميزات المناسبة الأخرى. ويمكن للتطبيقات الضارة استخدام هذا لمسح أو تعديل بيانات الاتصال."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"للسماح للتطبيق بتعديل البيانات عن جهات الاتصال المخزنة على هاتفك، بما في ذلك معدل الاتصال بأفراد معينين أو إرسال رسائل إلكترونية إليهم أو التواصل معهم بطرق أخرى. يفيد هذا ميزة الإكمال التلقائي لعناوين البريد الإلكتروني والميزات المناسبة الأخرى. ويمكن للتطبيقات الضارة استخدام هذا لمسح أو تعديل بيانات الاتصال."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"قراءة سجل المكالمات"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"للسماح للتطبيق بقراءة سجل المكالمات، بما في ذلك البيانات عن المكالمات الواردة والصادرة. وربما تستخدم التطبيقات الضارة هذا لإرسال بياناتك إلى أشخاص آخرين."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"للسماح للتطبيق بقراءة سجل مكالمات الهاتف، بما في ذلك البيانات عن المكالمات الواردة والصادرة. وربما تستخدم التطبيقات الضارة هذا لإرسال بياناتك إلى أشخاص آخرين."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ب ت ث"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"حرف"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"كلمة"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"رابط"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"سطر"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"أخفق اختبار المصنع"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index bb70672..74ee308 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшэт будзе адключаны."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ваш тэлефон будзе выключаны."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Закрыць?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Перазагрузка ў бяспечным рэжыме"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Хочаце перазагрузіцца ў бяспечным рэжыме? Гэта дазволіць адключыць усе іншыя ўсталяваныя прыкладанні. Пасля перазагрузкi iх праца будзе адноўлена."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Апошнія"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Няма апошніх прыкладанняў."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Параметры планшэта"</string>
@@ -219,12 +217,14 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Дазваляе прыкладанням атрымліваць і апрацоўваць WAP-паведамленні. Шкоднасныя прыкладанні могуць адсочваць вашы паведамленні або выдаляць іх, не паказваючы вам."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"атрымаць запушчаныя прыкладанні"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Дазваляе прыкладанням атрымліваць інфармацыю пра бягучыя і нядаўна запушчаныя заданнi. Шкоднасныя прыкладанні могуць атрымліваць асабістую інфармацыю пра іншыя прыкладаннi."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"атрымаць падрабязныя дадзеныя пра запушчаныя прыкладаннi"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Дазваляе прыкладанню атрымліваць падрабязную інфармацыю пра бягучыя і нядаўна запушчаныя задачы. Шкоднасныя прыкладанні могуць атрымліваць асабістую інфармацыю пра іншыя прыкладаннi."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"змяніць парадак запушчаных прыкладанняў"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Дазваляе прыкладанням перамяшчаць заданні на ​​пярэдні план і фон. Шкоднасныя прыкладанні могуць прымусова рабіць сябе асноўнымі без вашага ведама."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"спыніць запушчаныя прыкладанні"</string>
     <string name="permdesc_removeTasks" msgid="1394714352062635493">"Дазваляе прыкладанням выдаляць заданні і спыняць прыкладанні, якія іх выкарыстоўваюць. Шкоднасныя прыкладаннi могуць перашкодзiць працы іншых прыкладанняў."</string>
     <string name="permlab_startAnyActivity" msgid="2918768238045206456">"пачынаць любы працэс"</string>
-    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Дазваляе прыкладанню пачынаць любы працэс, незалежна ад абароны дазволам ці стану экспартавання."</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Дазваляе прыкладанню пачынаць любы працэс, незалежна ад абароны дазволам ці стану экспарту."</string>
     <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"усталяваць сумяшчальнасць экранаў"</string>
     <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Дазваляе прыкладанню кіраваць рэжымам сумяшчальнасці экранаў іншых прыкладанняў. Шкоднаснае ПЗ можа перашкодзiць працы іншых прыкладанняў."</string>
     <string name="permlab_setDebugApp" msgid="3022107198686584052">"уключыць адладку прыкладання"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Дазваляе прыкладанням дасылаць далейшыя звязаныя перадачы, якія застаюцца пасля заканчэння асноўнай перадачы. Шкоднасныя прыкладанні могуць зрабіць працу планшэта павольнай або няўстойлівай, прымушаючы яго выкарыстоўваць занадта шмат памяці."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Дазваляе прыкладанню дасылаць далейшыя звязаныя перадачы, якія застаюцца пасля заканчэння асноўнай перадачы. Шкоднасныя прыкладанні могуць зрабіць працу тэлефона павольнай або няўстойлівай, прымушаючы яго выкарыстоўваць занадта шмат памяці."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"чытаць кантактныя дадзеныя"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Дазваляе прыкладанням чытаць усе дадзеныя пра кантактах, якія захоўваюцца на планшэце, у тым ліку найбольш частыя, якiм вы тэлефанавалi, пiсалi па электроннай пошце ці ці з якiмi звязвалiся іншым спосабам. Гэта дазваляе аўтаматычна завяршаць адрасы электроннай пошты і іншыя зручныя функцыі. Шкоднасныя праграмы могуць выкарыстоўваць гэты дазвол, каб адпраўляць свае кантактныя дадзеныя іншым людзям."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Дазваляе прыкладанням чытаць усе дадзеныя пра кантактах, якія захоўваюцца ў тэлефоне, у тым ліку найбольш частыя, якiм вы тэлефанавалi, пiсалi па электроннай пошце ці звязвалiся з iмi іншым спосабам. Гэта дазваляе аўтаматычна завяршаць адрасы электроннай пошты і іншыя зручныя функцыі. Шкоднасныя праграмы могуць выкарыстоўваць гэты дазвол, каб адпраўляць свае кантактныя дадзеныя іншым людзям."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"запісваць кантактныя дадзеныя"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Дазваляе прыкладанням чытаць усе дадзеныя пра кантактах, якія захоўваюцца ў тэлефоне, у тым ліку найбольш частыя, якiм вы тэлефанавалi, пiсалi па электроннай пошце ці з якiмi звязвалiся іншым спосабам. Гэта дазваляе аўтаматычна завяршаць адрасы электроннай пошты і іншыя зручныя функцыі. Шкоднасныя праграмы могуць выкарыстоўваць гэты дазвол, каб адпраўляць свае кантактныя дадзеныя іншым людзям."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Дазваляе прыкладанням чытаць усе дадзеныя пра кантактах, якія захоўваюцца ў тэлефоне, у тым ліку найбольш частыя, якiм вы тэлефанавалi, пiсалi па электроннай пошце ці з якiмi звязвалiся іншым спосабам. Гэта дазваляе аўтаматычна завяршаць адрасы электроннай пошты і іншыя зручныя функцыі. Шкоднасныя праграмы могуць выкарыстоўваць гэты дазвол, каб адпраўляць свае кантактныя дадзеныя іншым людзям."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"чытанне гiсторыi выклікаў"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Дазваляе прыкладанню чытаць гiсторыю выклiкаў планшэту, у тым лiку дадзеныя пра ўваходныя і зыходныя выклiкi. Шкоднасныя прыкладаннi могуць выкарыстоўваць гэта, каб адпраўляць вашы дадзеныя іншым людзям."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Дазваляе прыкладанню чытаць гiсторыю выклiкаў, у тым лiку ўваходныя і зыходныя выклiкi. Шкоднасныя праграмы могуць выкарыстоўваць гэта, каб адпраўляць вашы дадзеныя іншым людзям."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"Знак"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"слова"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"спасылка"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"радок"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Не атрымалася выканаць заводскую праверку"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index f29bd97..71c781d 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таблетът ви ще се изключи."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефонът ви ще се изключи."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Искате ли да изключите?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Рестартиране в безопасен режим"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Искате ли да рестартирате в безопасен режим? Това ще деактивира всички инсталирани от вас приложения на трети страни. Те ще бъдат възстановени, когато рестартирате отново."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Скорошни"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Няма скорошни приложения."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Опции за таблета"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Разрешава на приложението да получава и обработва WAP съобщения. Злонамерените приложения могат да наблюдават съобщенията ви или да ги изтрият, без да ви ги покажат."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"извличане на изпълняваните приложения"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Разрешава на приложението да извлича информация за задачите, изпълнявани понастоящем и неотдавна. Злонамерените приложения могат да открият поверителна информация за други приложения."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"извличане на подробности за изпълняваните прилож."</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Разрешава на приложението да извлича подробна информация за задачите, изпълнявани понастоящем и неотдавна. Злонамерените приложения могат да открият поверителна информация за други приложения."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"пренареждане на изпълняваните приложения"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Разрешава на приложението да прехвърля задачи на преден и на заден план. Злонамерените приложения могат сами да се изведат на преден план без ваша намеса."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"спиране на изпълняваните приложения"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Разрешава на приложението да изпраща оставащи излъчвания, които се запазват след края на излъчването. Злонамерените приложения могат да причинят бавна или нестабилна работа на таблета, като го накарат да използва твърде много памет."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Разрешава на приложението да изпраща оставащи излъчвания, които се запазват след края на излъчването. Злонамерените приложения могат да причинят бавна или нестабилна работа на телефона, като го накарат да използва твърде много памет."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"четене на данни за контактите"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Разрешава на приложението да чете всички данни за съхранените на таблета ви контакти, включително честотата на обаждане, изпращане на имейли или общуване по друг начин с конкретни лица. Това помага при автоматичното довършване на имейл адресите и на други удобни функции. Злонамерените приложения могат да използват това разрешение, за да изпращат данните за контактите ви на други хора."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Разрешава на приложението да чете всички данни за съхранените на телефона ви контакти, включително честотата на обаждане, изпращане на имейли или общуване по друг начин с конкретни лица. Това помага при автоматичното довършване на имейл адресите и на други удобни функции. Злонамерените приложения могат да използват това разрешение, за да изпращат данните за контактите ви на други хора."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"запис на данни за контактите"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Разрешава на приложението да променя данните за съхранените на таблета ви контакти, включително честотата на обаждане, изпращане на имейли или общуване по друг начин с конкретни лица. Това помага при автоматичното довършване на имейл адресите и на други удобни функции. Злонамерените приложения могат да използват това, за да изтриват или променят данните за контактите ви."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Разрешава на приложението да променя данните за съхранените на телефона ви контакти, включително честотата на обаждане, изпращане на имейли или общуване по друг начин с конкретни лица. Това помага при автоматичното довършване на имейл адресите и на други удобни функции. Злонамерените приложения могат да използват това, за да изтриват или променят данните за контактите ви."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"четене на списъка с обаждания"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Разрешава на приложението да чете списъка с обаждания на таблета ви, включително данните за входящите и изходящите обаждания. Злонамерените приложения могат да използват това, за да изпращат информацията ви на други хора."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Разрешава на приложението да чете списъка с обаждания на телефона ви, включително данните за входящите и изходящите обаждания. Злонамерените приложения могат да използват това, за да изпращат информацията ви на други хора."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"знак"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"дума"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"връзка"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"ред"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Фабричният тест не бе успешен"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 19bf798..385477b 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"La tauleta s\'apagarà."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El telèfon s\'apagarà."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vols apagar-lo?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reinicia en mode segur"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Vols reiniciar en mode segur? Es desactivaran les aplicacions de tercers que hagis instal·lat. Es restabliran quan tornis a reiniciar."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recents"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"No hi ha aplicacions recents"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcions de la tauleta"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permet que l\'aplicació rebi i processi missatges WAP. Les aplicacions malicioses poden supervisar els missatges o suprimir-los sense mostrar-te\'ls."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"recupera les aplicacions en execució"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permet que l\'aplicació recuperi informació sobre les tasques que s\'estan executant actualment i que s\'han executat recentment. Les aplicacions malicioses poden descobrir informació privada sobre altres aplicacions."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recupera els detalls d\'aplicacions en execució"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permet que l\'aplicació recuperi informació detallada sobre les tasques que s\'estan executant actualment i que s\'han executat recentment. Les aplicacions malicioses poden descobrir informació privada sobre altres aplicacions."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"canvia l\'ordre de les aplicacions en execució"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permet que l\'aplicació desplaci tasques en primer o segon pla. Les aplicacions malicioses poden aparèixer en primer pla sense el teu consentiment."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"atura les aplicacions que s\'estan executant"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permet que l\'aplicació enviï emissions permanents, que es conserven després de finalitzar l\'emissió. Les aplicacions malicioses poden alentir o desestabilitzar la tauleta si li fan utilitzar massa memòria."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permet que l\'aplicació enviï emissions permanents, que es conserven després de finalitzar l\'emissió. Les aplicacions malicioses poden alentir o desestabilitzar el telèfon si li fan utilitzar massa memòria."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"llegir dades de contacte"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permet que l\'aplicació llegeixi totes les dades sobre els contactes emmagatzemades a la tauleta, inclosa la freqüència amb la qual has trucat a determinades persones, els has enviat correus electrònics o t\'hi has comunicat. Això ajuda a completar automàticament les adreces electròniques, i també és útil per a altres funcions. Les aplicacions malicioses poden fer servir aquest permís per enviar les teves dades de contacte a altres persones."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permet que l\'aplicació llegeixi totes les dades sobre els contactes emmagatzemades al telèfon, inclosa la freqüència amb la qual has trucat a determinades persones, els has enviat correus electrònics o t\'hi has comunicat. Això ajuda a completar automàticament les adreces electròniques, i també és útil per a altres funcions. Les aplicacions malicioses poden fer servir aquest permís per enviar les teves dades de contacte a altres persones."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"escriure dades de contacte"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permet que l\'aplicació modifiqui les dades sobre els contactes emmagatzemades a la tauleta, inclosa la freqüència amb la qual has trucat a determinades persones, els has enviat correus electrònics o t\'hi has comunicat. Això ajuda a completar automàticament les adreces electròniques, i també és útil per a altres funcions. Les aplicacions malicioses poden fer servir aquest permís per esborrar o per modificar les teves dades de contacte."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permet que l\'aplicació modifiqui les dades sobre els contactes emmagatzemades al telèfon, inclosa la freqüència amb la qual has trucat a determinades persones, els has enviat correus electrònics o t\'hi has comunicat. Això ajuda a completar automàticament les adreces electròniques, i també és útil per a altres funcions. Les aplicacions malicioses poden fer servir aquest permís per esborrar o per modificar les teves dades de contacte."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lectura del registre de trucades"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permet que l\'aplicació llegeixi el registre de trucades de la teva tauleta, incloses les dades de les trucades entrants i sortints. És possible que les aplicacions malicioses ho utilitzin per enviar les teves dades a altres persones."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permet que l\'aplicació llegeixi el registre de trucades del teu telèfon, incloses les dades de les trucades entrants i sortints. És possible que les aplicacions malicioses ho utilitzin per enviar les teves dades a altres persones."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"caràcter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"paraula"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"enllaç"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"línia"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Error a la prova de fàbrica"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4a2908e..f7faa3f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -48,8 +48,8 @@
     <string name="mismatchPin" msgid="609379054496863419">"Zadané kódy PIN se neshodují."</string>
     <string name="invalidPin" msgid="3850018445187475377">"Zadejte kód PIN o délce 4-8 číslic."</string>
     <string name="invalidPuk" msgid="8761456210898036513">"Zadejte osmimístný nebo delší kód PUK."</string>
-    <string name="needPuk" msgid="919668385956251611">"Karta SIM je blokována pomocí kódu PUK. Odblokujete ji zadáním kódu PUK."</string>
-    <string name="needPuk2" msgid="4526033371987193070">"Chcete-li odblokovat kartu SIM, zadejte kód PUK2."</string>
+    <string name="needPuk" msgid="919668385956251611">"SIM karta je blokována pomocí kódu PUK. Odblokujete ji zadáním kódu PUK."</string>
+    <string name="needPuk2" msgid="4526033371987193070">"Chcete-li odblokovat SIM kartu, zadejte kód PUK2."</string>
     <string name="imei" msgid="2625429890869005782">"IMEI"</string>
     <string name="meid" msgid="4841221237681254195">"MEID"</string>
     <string name="ClipMmi" msgid="6952821216480289285">"Příchozí identifikace volajícího"</string>
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet se vypne."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Váš telefon bude vypnut."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Chcete vypnout telefon?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Restart v nouzovém režimu"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Chcete zařízení restartovat v nouzovém režimu? Deaktivujete tak veškeré nainstalované aplikace třetích stran. Po dalším restartu budou obnoveny."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nejnovější"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Žádné nové aplikace"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabletu"</string>
@@ -210,15 +208,17 @@
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"posílat zprávy SMS bez potvrzení"</string>
     <string name="permdesc_sendSmsNoConfirmation" msgid="3437759207020400204">"Umožňuje aplikaci odesílat zprávy SMS. Škodlivé aplikace vás mohou připravit o peníze odesíláním zpráv bez vašeho svolení."</string>
     <string name="permlab_readSms" msgid="4085333708122372256">"čtení zpráv SMS a MMS"</string>
-    <string name="permdesc_readSms" product="tablet" msgid="2341692916884515613">"Umožňuje aplikaci číst zprávy SMS uložené v tabletu nebo na kartě SIM. Škodlivé aplikace mohou číst důvěrné zprávy."</string>
-    <string name="permdesc_readSms" product="default" msgid="5653850482025875493">"Umožňuje aplikaci číst zprávy SMS uložené v telefonu nebo na kartě SIM. Škodlivé aplikace mohou číst důvěrné zprávy."</string>
+    <string name="permdesc_readSms" product="tablet" msgid="2341692916884515613">"Umožňuje aplikaci číst zprávy SMS uložené v tabletu nebo na SIM kartě. Škodlivé aplikace mohou číst důvěrné zprávy."</string>
+    <string name="permdesc_readSms" product="default" msgid="5653850482025875493">"Umožňuje aplikaci číst zprávy SMS uložené v telefonu nebo na SIM kartě. Škodlivé aplikace mohou číst důvěrné zprávy."</string>
     <string name="permlab_writeSms" msgid="6881122575154940744">"úprava zpráv SMS a MMS"</string>
-    <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Umožňuje aplikaci zapisování do zpráv SMS uložených v tabletu nebo na kartě SIM. Škodlivé aplikace mohou vaše zprávy smazat."</string>
-    <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Umožňuje aplikaci zapisování do zpráv SMS uložených v telefonu nebo na kartě SIM. Škodlivé aplikace mohou vaše zprávy smazat."</string>
+    <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Umožňuje aplikaci zapisování do zpráv SMS uložených v tabletu nebo na SIM kartě. Škodlivé aplikace mohou vaše zprávy smazat."</string>
+    <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Umožňuje aplikaci zapisování do zpráv SMS uložených v telefonu nebo na SIM kartě. Škodlivé aplikace mohou vaše zprávy smazat."</string>
     <string name="permlab_receiveWapPush" msgid="8258226427716551388">"příjem WAP"</string>
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Umožňuje aplikaci přijmout a zpracovat zprávy WAP. Škodlivé aplikace mohou sledovat vaše zprávy nebo je smazat, aniž by vám byly zobrazeny."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"načtení spuštěných aplikací"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Umožňuje aplikaci získat informace o aktuálně a naposledy spuštěných úlohách. Škodlivé aplikace mohou odhalit soukromé informace o ostatních aplikacích."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"získání podrobností o spuštěných aplikacích"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Umožňuje aplikaci získat podrobné informace o aktuálně a naposledy spuštěných úlohách. Škodlivé aplikace mohou odhalit soukromé informace o ostatních aplikacích."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"změna uspořádání spuštěných aplikací"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Umožňuje aplikaci přesunout úlohy na popředí nebo pozadí. Škodlivé aplikace mohou vynutit zobrazení na popředí bez vašeho svolení."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"zastavení činnosti aplikací"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou tablet zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Umožňuje aplikaci odeslat trvalá vysílání, která přetrvávají i po skončení vysílání. Škodlivé aplikace mohou telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"číst data kontaktů"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Umožňuje aplikaci číst všechny údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Pomáhá to při automatickém doplňování e-mailových adres a dalších užitečných funkcích. Škodlivé aplikace mohou toto povolení zneužít k posílání vašich kontaktních údajů jiným lidem."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Umožňuje aplikaci číst všechny údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Pomáhá to při automatickém doplňování e-mailových adres a dalších užitečných funkcích. Škodlivé aplikace mohou toto povolení zneužít k posílání vašich kontaktních údajů jiným lidem."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"zapisovat data kontaktů"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Umožňuje aplikaci upravovat všechny údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Pomáhá to při automatickém doplňování e-mailových adres a dalších užitečných funkcích. Škodlivé aplikace mohou toto povolení zneužít k mazání nebo úpravě vašich kontaktních údajů."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Umožňuje aplikaci upravovat všechny údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Pomáhá to při automatickém doplňování e-mailových adres a dalších užitečných funkcích. Škodlivé aplikace mohou toto povolení zneužít k mazání nebo úpravě vašich kontaktních údajů."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"číst seznam hovorů"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Umožňuje aplikaci číst seznam hovorů vašeho tabletu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace mohou tato data posílat jiným osobám."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Umožňuje aplikaci číst seznam hovorů vašeho telefonu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace mohou tato data posílat jiným osobám."</string>
@@ -696,15 +692,15 @@
     <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Zkusit znovu"</string>
     <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Překročili jste maximální povolený počet pokusů o odemknutí obličejem."</string>
     <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Nabíjení, <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
-    <string name="lockscreen_charged" msgid="4938930459620989972">"Nabito."</string>
+    <string name="lockscreen_charged" msgid="4938930459620989972">"nabito"</string>
     <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="lockscreen_low_battery" msgid="1482873981919249740">"Připojte dobíjecí zařízení."</string>
-    <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Není vložena SIM karta."</string>
-    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"V tabletu není karta SIM."</string>
-    <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"V telefonu není žádná karta SIM."</string>
-    <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Vložte kartu SIM."</string>
-    <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"Karta SIM chybí nebo je nečitelná. Vložte kartu SIM."</string>
-    <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Vaše karta SIM byla natrvalo zablokována."\n" Požádejte svého poskytovatele bezdrátových služeb o další kartu SIM."</string>
+    <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Není vložena SIM karta"</string>
+    <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"V tabletu není SIM karta."</string>
+    <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"V telefonu není žádná SIM karta."</string>
+    <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Vložte SIM kartu."</string>
+    <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM karta chybí nebo je nečitelná. Vložte SIM kartu."</string>
+    <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Vaše SIM karta byla natrvalo zablokována."\n" Požádejte svého poskytovatele bezdrátových služeb o další SIM kartu."</string>
     <string name="lockscreen_transport_prev_description" msgid="201594905152746886">"Tlačítko Předchozí stopa"</string>
     <string name="lockscreen_transport_next_description" msgid="6089297650481292363">"Tlačítko Další stopa"</string>
     <string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Tlačítko Pozastavit"</string>
@@ -712,10 +708,10 @@
     <string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Tlačítko Zastavit"</string>
     <string name="emergency_calls_only" msgid="6733978304386365407">"Pouze tísňová volání"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Síť je blokována"</string>
-    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"Karta SIM je zablokována pomocí kódu PUK."</string>
+    <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM karta je zablokována pomocí kódu PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Další informace naleznete v uživatelské příručce; nebo kontaktujte zákaznickou podporu."</string>
-    <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"Karta SIM je zablokována."</string>
-    <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Odblokování karty SIM..."</string>
+    <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM karta je zablokována."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Odblokování SIM karty..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste použili nesprávné bezpečnostní gesto. "\n\n"Zkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
     <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně zadali heslo. "\n\n"Zkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
     <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně zadali kód PIN. "\n\n"Zkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"znak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"slovo"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"odkaz"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"řádek"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Test továrního nastavení se nezdařil"</string>
@@ -1038,10 +1030,10 @@
     <string name="sms_short_code_confirm_allow" msgid="8957573662645722940">"Odeslat zprávu"</string>
     <string name="sms_short_code_confirm_deny" msgid="6374609298084435887">"Neodesílat"</string>
     <string name="sms_short_code_confirm_report" msgid="2588793956061677070">"Nahlásit škodlivou aplikaci"</string>
-    <string name="sim_removed_title" msgid="6227712319223226185">"Karta SIM odebrána"</string>
-    <string name="sim_removed_message" msgid="2333164559970958645">"Mobilní síť bude dostupná až poté, co vložíte platnou kartu SIM a restartujete zařízení."</string>
+    <string name="sim_removed_title" msgid="6227712319223226185">"SIM karta odebrána"</string>
+    <string name="sim_removed_message" msgid="2333164559970958645">"Mobilní síť bude dostupná až poté, co vložíte platnou SIM kartu a restartujete zařízení."</string>
     <string name="sim_done_button" msgid="827949989369963775">"Hotovo"</string>
-    <string name="sim_added_title" msgid="3719670512889674693">"Karta SIM přidána."</string>
+    <string name="sim_added_title" msgid="3719670512889674693">"SIM karta přidána."</string>
     <string name="sim_added_message" msgid="6599945301141050216">"Mobilní síť bude přístupná po restartu zařízení."</string>
     <string name="sim_restart_button" msgid="4722407842815232347">"Restartovat"</string>
     <string name="time_picker_dialog_title" msgid="8349362623068819295">"Nastavení času"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index d8eecb9..56001f1 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -217,12 +217,14 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Tillader, at appen kan modtage og behandle WAP-beskeder. Ondsindede apps kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"hente kørende apps"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Tillader, at appen kan hente oplysninger om aktuelle og seneste opgaver. Ondsindede apps kan registrere private oplysninger om andre apps."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"hente oplysninger om apps, der kører"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tillader, at appen kan hente oplysninger om aktuelle og seneste opgaver. Ondsindede apps kan muligvis finde personlige oplysninger om andre apps."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"omorganisere kørende apps"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Tillader, at appen kan flytte opgaver til forgrunden og baggrunden. Ondsindede apps kan tvinge sig selv i forgrunden uden din kontrol."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"stoppe kørsel af apps"</string>
     <string name="permdesc_removeTasks" msgid="1394714352062635493">"Tillader, at en app kan fjerne opgaver og lukke deres apps. Ondsindede apps kan forstyrre adfærden for andre apps."</string>
     <string name="permlab_startAnyActivity" msgid="2918768238045206456">"starte en aktivitet"</string>
-    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Tillader, at appen starter en hvilken som helst aktivitet, uanset tilladelsesbeskyttelse eller eksportstatus."</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Tillader, at appen starter en hvilken som helst aktivitet, uanset tilladelsesbeskyttelse eller eksporteret tilstand."</string>
     <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"indstil skærmens kompatibilitet"</string>
     <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Tillader, at appen kontrollerer kompatibilitetstilstanden for skærme i andre applikationer. Ondsindede applikationer kan forstyrre andre applikationers adfærd."</string>
     <string name="permlab_setDebugApp" msgid="3022107198686584052">"aktivere fejlretning af appen"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Tillader, at appen kan sende klæbende udsendelser, der efterlades, selvom udsendelsen er slut. Ondsindede apps kan gøre din tablet langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Tillader, at appen kan sende klæbende udsendelser, der efterlades, når udsendelsen er slut. Ondsindede apps kan gøre din telefon langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"læs kontaktdata"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Tillader, at appen læser alle de data om dine kontaktpersoner, der er gemt på din tablet, herunder hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte individer. Dette hjælper i forbindelse med automatisk fuldførelse af e-mailadresser og andre nyttige funktioner. Ondsindede apps kan bruge denne tilladelse til at sende dine kontaktoplysninger til andre."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Tillader, at appen læser alle de data om dine kontaktpersoner, der er gemt på din telefon, herunder hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte individer. Dette hjælper i forbindelse med automatisk fuldførelse af e-mailadresser og andre nyttige funktioner. Ondsindede apps kan bruge denne tilladelse til at sende dine kontaktoplysninger til andre."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"skriv kontaktdata"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Tillader, at appen ændrer data om dine kontaktpersoner, der er gemt på tabletten, herunder hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte individer. Dette hjælper i forbindelse med automatisk fuldførelse af e-mailadresser og andre nyttige funktioner. Ondsindede apps kan bruge denne tilladelse til at sende dine kontaktoplysninger til andre."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Tillader, at appen ændrer data om dine kontaktpersoner, der er gemt på telefonen, herunder hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte individer. Dette hjælper i forbindelse med automatisk fuldførelse af e-mailadresser og andre nyttige funktioner. Ondsindede apps kan bruge denne tilladelse til at sende dine kontaktoplysninger til andre."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"læs opkaldsliste"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Tillader, at appen læser din tablets opkaldsliste, herunder data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at sende dine data til andre personer."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Tillader, at appen læser telefonens opkaldsliste, herunder data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at sende dine data til andre personer."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 43a3ba2..69c8178 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ihr Tablet wird heruntergefahren."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon wird heruntergefahren."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Möchten Sie das Gerät herunterfahren?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Im abgesicherten Modus starten"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Möchten Sie im abgesicherten Modus neu starten? Dadurch werden alle Apps von Drittanbietern deaktiviert, die Sie installiert haben. Sie werden jedoch nach einem weiteren Neustart wiederhergestellt."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Kürzlich geöffnet"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Keine kürzlich geöffneten Apps"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-Optionen"</string>
@@ -204,7 +202,7 @@
     <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"Notfall-Broadcasts empfangen"</string>
     <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Ermöglicht der App, Notfall-Broadcasts zu empfangen und zu verarbeiten. Diese Berechtigung steht nur System-Apps zur Verfügung."</string>
     <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Cell Broadcast-Nachrichten lesen"</string>
-    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ermöglicht es der App, von Ihrem Gerät empfangene Cell Broadcast-Nachrichten zu lesen. Cell Broadcast-Benachrichtigungen werden an einigen Standorten gesendet, um Sie über Notfallsituationen zu informieren. Schädliche Apps können die Leistung oder den Betrieb Ihres Geräts beeinträchtigen, wenn eine Cell Broadcast-Notfallbenachrichtigung eingeht."</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ermöglicht der App, von Ihrem Gerät empfangene Cell Broadcast-Nachrichten zu lesen. Cell Broadcast-Benachrichtigungen werden an einigen Standorten gesendet, um Sie über Notfallsituationen zu informieren. Schädliche Apps können die Leistung oder den Betrieb Ihres Geräts beeinträchtigen, wenn eine Cell Broadcast-Notfallbenachrichtigung eingeht."</string>
     <string name="permlab_sendSms" msgid="5600830612147671529">"Kurznachrichten senden"</string>
     <string name="permdesc_sendSms" msgid="906546667507626156">"Ermöglicht der App das Senden von SMS. Bei schädlichen Apps können Kosten entstehen, wenn diese Nachrichten ohne Ihre Zustimmung versenden."</string>
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"SMS-Nachrichten ohne Bestätigung senden"</string>
@@ -219,12 +217,14 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Ermöglicht der App, WAP-Mitteilungen zu empfangen und zu verarbeiten. Schädliche Apps können so Ihre Nachrichten überwachen oder löschen, bevor sie angezeigt werden."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"aktive Apps abrufen"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Ermöglicht der App, Informationen zu aktuellen und kürzlich ausgeführten Aufgaben abzurufen. Schädliche Apps können so geheime Informationen zu anderen Apps erhalten."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"Details zu ausgeführten Apps abrufen"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Ermöglicht der App, detaillierte Informationen zu aktuellen und kürzlich ausgeführten Aufgaben abzurufen. Schädliche Apps können so geheime Informationen zu anderen Apps erhalten."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"Aktive Apps neu ordnen"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Ermöglicht der App, Aufgaben in den Vorder- und Hintergrund zu verschieben. Schädliche Apps können so ohne Ihr Zutun eine Anzeige im Vordergrund erzwingen."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"Aktive Apps beenden"</string>
     <string name="permdesc_removeTasks" msgid="1394714352062635493">"Ermöglicht der App, Aufgaben zu entfernen und die entsprechenden Apps zu beenden. Schädliche Apps können das Verhalten anderer Apps stören."</string>
     <string name="permlab_startAnyActivity" msgid="2918768238045206456">"Beliebige Aktivität starten"</string>
-    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Ermöglicht es der App, ungeachtet der Berechtigungen oder des Exportstatus beliebige Aktivitäten zu starten"</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Ermöglicht der App, ungeachtet der Berechtigungen oder des Exportstatus beliebige Aktivitäten zu starten"</string>
     <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"Bildschirmkompatibilität festlegen"</string>
     <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Ermöglicht der App, den Bildschirmkompatibilitätsmodus anderer Apps zu steuern. Schädliche Apps können das Verhalten anderer Apps stören."</string>
     <string name="permlab_setDebugApp" msgid="3022107198686584052">"Fehlerbeseitigung für App aktivieren"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Ermöglicht der App, dauerhafte Broadcasts zu senden, die auch nach Ende des Broadcasts bestehen bleiben. Schädliche Apps können das Tablet langsam oder unstabil machen, indem zuviel Speicherplatz belegt wird."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Ermöglicht der App, dauerhafte Broadcasts zu senden, die auch nach Ende des Broadcasts bestehen bleiben. Schädliche Apps können das Telefon langsam oder unstabil machen, indem zuviel Speicherplatz belegt wird."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"Kontaktdaten lesen"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Ermöglicht der App, alle Daten Ihrer auf dem Tablet gespeicherten Kontakte zu lesen, einschließlich der Häufigkeit, mit der Sie angerufen, E-Mails gesendet oder auf andere Weise mit bestimmten Personen kommuniziert haben. Dadurch werden die automatische Vervollständigung von E-Mail-Adressen und andere praktische Funktionen verbessert. Schädliche Apps können mit dieser Berechtigung Ihre Kontaktdaten an andere Personen senden."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Ermöglicht der App, alle Daten Ihrer auf dem Telefon gespeicherten Kontakte zu lesen, einschließlich der Häufigkeit, mit der Sie angerufen, E-Mails gesendet oder auf andere Weise mit bestimmten Personen kommuniziert haben. Dadurch werden die automatische Vervollständigung von E-Mail-Adressen und andere praktische Funktionen verbessert. Schädliche Apps können mit dieser Berechtigung Ihre Kontaktdaten an andere Personen senden."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"Kontaktdaten schreiben"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Ermöglicht der App, die Daten Ihrer auf dem Tablet gespeicherten Kontakte zu ändern, einschließlich der Häufigkeit, mit der Sie angerufen, E-Mails gesendet oder auf andere Weise mit bestimmten Personen kommuniziert haben. Dadurch werden die automatische Vervollständigung von E-Mail-Adressen und andere praktische Funktionen verbessert. Schädliche Apps können mit dieser Berechtigung Ihre Kontaktdaten ändern oder löschen."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Ermöglicht der App, die Daten Ihrer auf dem Telefon gespeicherten Kontakte zu ändern, einschließlich der Häufigkeit, mit der Sie angerufen, E-Mails gesendet oder auf andere Weise mit bestimmten Personen kommuniziert haben. Dadurch werden die automatische Vervollständigung von E-Mail-Adressen und andere praktische Funktionen verbessert. Schädliche Apps können mit dieser Berechtigung Ihre Kontaktdaten ändern oder löschen."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"Anrufprotokoll lesen"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Ermöglicht der App, das Anrufprotokoll Ihres Tablets zu lesen, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so Ihre Daten an Dritte senden."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Ermöglicht der App, das Anrufprotokoll Ihres Telefons zu lesen, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so Ihre Daten an Dritte senden."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"Zeichen"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"Wort"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"Link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"Zeile"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Werkstest fehlgeschlagen"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 609684a..1cdce38 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Το tablet σας θα απενεργοποιηθεί."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Το τηλέφωνό σας θα απενεργοποιηθεί."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Θέλετε να γίνει τερματισμός λειτουργίας;"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Επανεκκίνηση στην ασφαλή λειτουργία"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Θέλετε να κάνετε επανεκκίνηση στην ασφαλή λειτουργία; Αυτό θα απενεργοποιήσει όλες τις εφαρμογές τρίτων που έχετε εγκαταστήσει. Θα γίνει επαναφορά τους στην επόμενη επανεκκίνηση."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Πρόσφατα"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Δεν υπάρχουν πρόσφατες εφαρμογές."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Επιλογές tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων WAP. Τυχόν κακόβουλες εφαρμογές ενδέχεται να παρακολουθούν τα μηνύματά σας ή να τα διαγράφουν χωρίς να εμφανίζονται πρώτα σε εσάς."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"ανάκτηση εκτελούμενων εφαρμογών"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Επιτρέπει στην εφαρμογή να ανακτήσει πληροφορίες σχετικά με τις τρέχουσες εκτελούμενες εργασίες και στις εργασίες που έχουν πρόσφατα εκτελεστεί. Τυχόν κακόβουλες εφαρμογές ενδέχεται να ανακαλύψουν ιδιωτικές πληροφορίες σχετικά με άλλες εφαρμογές."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ανάκτηση λεπτομερειών σχετικά με τις εκτελούμενες εφαρμογές"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Επιτρέπει στην εφαρμογή την ανάκτηση λεπτομερών πληροφοριών σχετικά με τις τρέχουσες εκτελούμενες εργασίες και τις εργασίες που έχουν εκτελεστεί πρόσφατα. Τυχόν κακόβουλες εφαρμογές ενδέχεται να ανακαλύψουν ιδιωτικές πληροφορίες σχετικά με άλλες εφαρμογές."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"αναδιάταξη εκτελούμενων εφαρμογών"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Επιτρέπει στην εφαρμογή τη μετακίνηση εργασιών στο προσκήνιο και στο φόντο. Τυχόν κακόβουλες εφαρμογές μπορούν να προωθηθούν στο προσκήνιο χωρίς να μπορείτε να τις ελέγξετε."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"διακοπή εκτέλεσης εφαρμογών"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Τυχόν κακόβουλες εφαρμογές ενδέχεται να καταστήσουν τη λειτουργία του tablet αργή ή ασταθή προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Τυχόν κακόβουλες εφαρμογές ενδέχεται να καταστήσουν τη λειτουργία του τηλεφώνου αργή ή ασταθή προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"ανάγνωση δεδομένων επαφής"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Επιτρέπει στην εφαρμογή να διαβάζει όλα τα δεδομένα σχετικά με τις επαφές που έχουν αποθηκευτεί στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία κάνατε κλήσεις, στείλατε μηνύματα ηλεκτρονικού ταχυδρομείου ή επικοινωνήσατε με άλλους τρόπους με συγκεκριμένα άτομα. Αυτό βοηθάει με την αυτόματη συμπλήρωση των διευθύνσεων ηλεκτρονικού ταχυδρομείου και άλλες χρήσιμες λειτουργίες. Οι κακόβουλες εφαρμογές μπορούν να χρησιμοποιήσουν αυτήν την άδεια για να στείλουν τα στοιχεία επικοινωνίας σας σε άλλα άτομα."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα δεδομένα σχετικά με τις επαφές σας που έχουν αποθηκευτεί στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία κάνατε κλήσεις, στείλατε μηνύματα ηλεκτρονικού ταχυδρομείου ή επικοινωνήσατε με άλλους τρόπους με συγκεκριμένα άτομα. Αυτό βοηθάει με την αυτόματη συμπλήρωση των διευθύνσεων ηλεκτρονικού ταχυδρομείου και άλλες χρήσιμες λειτουργίες. Οι κακόβουλες εφαρμογές μπορούν να χρησιμοποιήσουν αυτήν την άδεια για να στείλουν τα στοιχεία επικοινωνίας σας σε άλλα άτομα."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"εγγραφή δεδομένων επαφής"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Επιτρέπει στην εφαρμογή να τροποποιεί τα δεδομένα σχετικά με τις επαφές σας που έχουν αποθηκευτεί στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία κάνατε κλήσεις, στείλατε μηνύματα ηλεκτρονικού ταχυδρομείου ή επικοινωνήσατε με άλλους τρόπους με συγκεκριμένα άτομα. Αυτό βοηθάει με την αυτόματη συμπλήρωση των διευθύνσεων ηλεκτρονικού ταχυδρομείου και άλλες χρήσιμες λειτουργίες. Οι κακόβουλες εφαρμογές μπορούν να χρησιμοποιήσουν αυτήν την άδεια για να διαγράψουν ή να τροποποιήσουν τα στοιχεία επικοινωνίας σας."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Επιτρέπει στην εφαρμογή να τροποποιεί τα δεδομένα σχετικά με τις επαφές σας που έχουν αποθηκευτεί στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία κάνατε κλήσεις, στείλατε μηνύματα ηλεκτρονικού ταχυδρομείου ή επικοινωνήσατε με άλλους τρόπους με συγκεκριμένα άτομα. Αυτό βοηθάει με την αυτόματη συμπλήρωση των διευθύνσεων ηλεκτρονικού ταχυδρομείου και άλλες χρήσιμες λειτουργίες. Οι κακόβουλες εφαρμογές μπορούν να χρησιμοποιήσουν αυτήν την άδεια για να διαγράψουν ή να τροποποιήσουν τα στοιχεία επικοινωνίας σας."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"ανάγνωση αρχείου καταγραφής κλήσεων"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Επιτρέπει στην εφαρμογή να διαβάζει το αρχείο καταγραφής κλήσεων του tablet σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να στείλουν τα δεδομένα σας σε άλλα άτομα."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Επιτρέπει στην εφαρμογή να διαβάζει το αρχείο καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να στείλουν τα δεδομένα σας σε άλλα άτομα."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ΑΒΓ"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"χαρακτήρας"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"λέξη"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"σύνδεσμος"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"γραμμή"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Η εργοστασιακή δοκιμή απέτυχε"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 96ae05f..dad075f 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Your tablet will shut down."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Your phone will shut down."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Do you want to shut down?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot to safe mode"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Do you want to reboot into safe mode? This will disable all third-party applications that you have installed. They will be restored when you reboot again."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recent"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"No recent apps"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet options"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Allows the app to receive and process WAP messages. Malicious apps may monitor your messages or delete them without showing them to you."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"retrieve running apps"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Allows the app to retrieve information about currently and recently running tasks. Malicious apps may discover private information about other apps."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"retrieve details of running apps"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Allows the app to retrieve detailed information about currently and recently running tasks. Malicious apps may discover private information about other apps."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"re-order running apps"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Allows the app to move tasks to the foreground and background. Malicious apps may force themselves to the front without your control."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"stop running apps"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Allows the app to send sticky broadcasts, which remain after the broadcast ends. Malicious apps may make the tablet slow or unstable by causing it to use too much memory."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Allows the app to send sticky broadcasts, which remain after the broadcast ends. Malicious apps may make the phone slow or unstable by causing it to use too much memory."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"read contact data"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Allows the app to read all the data about your contacts stored on your tablet, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This helps with auto-completion of email addresses and other convenient features. Malicious apps can use this permission to send your contact data to other people."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Allows the app to read all the data about your contacts stored on your phone, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This helps with auto-completion of email addresses and other convenient features. Malicious apps can use this permission to send your contact data to other people."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"write contact data"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Allows the app to modify the data about your contacts stored on your tablet, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This helps with auto-completion of email addresses and other convenient features. Malicious apps may use this to erase or modify your contact data."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Allows the app to modify the data about your contacts stored on your phone, including the frequency with which you\'ve called, emailed or communicated in other ways with specific individuals. This helps with auto-completion of email addresses and other convenient features. Malicious apps may use this to erase or modify your contact data."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"read call log"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Allows the app to read your tablet\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to send your data to other people."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Allows the app to read your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to send your data to other people."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"character"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"word"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"line"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Factory test failed"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 79c72f4..8da460c 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tu tablet se apagará."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Tu dispositivo se apagará."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"¿Deseas apagarlo?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar en modo seguro"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"¿Deseas reiniciar el dispositivo en modo seguro? Las aplicaciones de terceros que instalaste se desactivarán y se restablecerán cuando vuelvas a reiniciar el dispositivo."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"No hay aplicaciones recientes."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opciones de tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permite que la aplicación reciba y procese mensajes WAP. Las aplicaciones maliciosas pueden controlar tus mensajes o eliminarlos sin mostrártelos."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicaciones en ejecución"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permite que la aplicación recupere información sobre tareas en ejecución y recientemente ejecutadas. Las aplicaciones maliciosas pueden descubrir información privada sobre otras aplicaciones."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recuperar información sobre las aplicaciones en ejecución"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite que la aplicación recupere información detallada sobre tareas en ejecución y recientemente ejecutadas. Las aplicaciones malintencionadas pueden hallar información privada sobre otras aplicaciones."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"reorganizar aplicaciones en ejecución"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permite que la aplicación mueva tareas al primero o segundo plano. Las aplicaciones maliciosas pueden forzar su paso al primer plano sin que tú las controles."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"detener las aplicaciones en ejecución"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permite que la aplicación envíe transmisiones persistentes que permanecen luego de que finaliza la transmisión. Las aplicaciones maliciosas pueden hacer que la tableta funcione más lentamente o de manera inestable al forzarla a utilizar mucha memoria."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permite que la aplicación envíe transmisiones persistentes que permanecen luego de que finaliza la transmisión. Las aplicaciones maliciosas pueden hacer que el dispositivo funcione más lento o de manera inestable al forzarlo a utilizar mucha memoria."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"leer datos de contacto"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permite a la aplicación leer todos los datos sobre los contactos almacenados en tu tableta, incluida la frecuencia con la que realizaste llamadas, enviaste correos o te comunicaste de otras maneras con personas específicas. Esto ayuda a la escritura automática de direcciones de correo y a otras funciones convenientes. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus datos de contacto a otras personas."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permite a la aplicación leer todos los datos sobre los contactos almacenados en tu teléfono, incluida la frecuencia con la que realizaste llamadas, enviaste correos o te comunicaste de otras maneras con personas específicas. Esto ayuda a la escritura automática de direcciones de correo y a otras funciones convenientes. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus datos de contacto a otras personas."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"escribir datos de contacto"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permite a la aplicación modificar los datos sobre los contactos almacenados en tu tableta, incluida la frecuencia con la que realizaste llamadas, enviaste correos o te comunicaste de otras maneras con personas específicas. Esto ayuda a la escritura automática de direcciones de correo y a otras funciones convenientes. Las aplicaciones malintencionadas pueden utilizarlo para borrar o modificar tus datos de contacto."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permite a la aplicación modificar los datos sobre los contactos almacenados en tu teléfono, incluida la frecuencia con la que realizaste llamadas, enviaste correos o te comunicaste de otras maneras con personas específicas. Esto ayuda a la escritura automática de direcciones de correo y a otras funciones convenientes. Las aplicaciones malintencionadas pueden utilizarlo para borrar o modificar tus datos de contacto."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"leer el registro de llamadas"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite que la aplicación lea el registro de llamadas de la tableta, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que la aplicación lea el registro de llamadas del dispositivo, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"Carácter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"Palabra"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"Vínculo"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"Línea"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Error en la prueba de fábrica"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 1b37836..3c81a05 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"El tablet se apagará."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"El teléfono se apagará."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"¿Seguro que quieres apagar el teléfono?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar en modo seguro"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"¿Quieres reiniciar el sistema en modo seguro? Se inhabilitarán todas las aplicaciones externas que hayas instalado. Esas aplicaciones se restaurarán la próxima vez que reinicies del sistema."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Reciente"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"No hay aplicaciones recientes."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opciones del tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permite que la aplicación reciba y procese mensajes WAP. Las aplicaciones malintencionadas pueden controlar los mensajes o eliminarlos sin mostrarlos al usuario."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicaciones en ejecución"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permite que la aplicación recupere información sobre tareas que se están ejecutando en este momento o que se han ejecutado recientemente. Las aplicaciones malintencionadas pueden usar este permiso para acceder a información privada sobre otras aplicaciones."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recuperar información de aplicaciones en ejecución"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite que la aplicación recupere información sobre tareas que se están ejecutando en este momento o que se han ejecutado recientemente. Las aplicaciones malintencionadas pueden usar este servicio para acceder a información privada sobre otras aplicaciones."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"reorganizar aplicaciones en ejecución"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permite que la aplicación mueva tareas a segundo o a primer plano. Algunas aplicaciones malintencionadas pueden aparecer en primer plano sin el control del usuario."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"detener aplicaciones en ejecución"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permite que la aplicación envíe emisiones que permanecen en el dispositivo una vez que la emisión ha finalizado. Las aplicaciones malintencionadas pueden ralentizar el tablet o volverlo inestable al hacer que use demasiada memoria."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permite que la aplicación envíe emisiones persistentes, que permanecen en el dispositivo una vez que la emisión haya finalizado. Las aplicaciones malintencionadas pueden ralentizar el teléfono o volverlo inestable al hacer que use demasiada memoria."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"leer los datos de contacto"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permite que la aplicación lea los datos de los contactos almacenados en el tablet, incluida la frecuencia con la que los hayas llamado, les hayas enviado un correo electrónico o te hayas puesto en contacto con ellos de otro modo. Esta información permite rellenar automáticamente direcciones de correo electrónico y otras funciones prácticas. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar los datos de tus contactos a otros usuarios."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permite que la aplicación lea los datos de los contactos almacenados en el teléfono, incluida la frecuencia con la que los hayas llamado, les hayas enviado un correo electrónico o te hayas puesto en contacto con ellos de otro modo. Esta información permite rellenar automáticamente direcciones de correo electrónico y otras funciones prácticas. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar los datos de tus contactos a otros usuarios."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"escribir datos de contacto"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permite que la aplicación modifique los datos de los contactos almacenados en el tablet, incluida la frecuencia con la que los hayas llamado, les hayas enviado un correo electrónico o te hayas puesto en contacto con ellos de otro modo. Esta información permite rellenar automáticamente direcciones de correo electrónico y otras funciones prácticas. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos de tus contactos."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permite que la aplicación modifique los datos de los contactos almacenados en el teléfono, incluida la frecuencia con la que los hayas llamado, les hayas enviado un correo electrónico o te hayas puesto en contacto con ellos de otro modo. Esta información permite rellenar automáticamente direcciones de correo electrónico y otras funciones prácticas. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos de tus contactos."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"leer el registro de llamadas"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite que la aplicación lea el registro de llamadas del tablet, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que la aplicación lea el registro de llamadas del teléfono, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"carácter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"palabra"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"enlace"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"línea"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Fallo en la prueba de fábrica"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 0e652f3..8d39fd0 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Võimaldab rakendusel vastu võtta ja töödelda WAP-sõnumeid. Pahatahtlikud rakendused võivad teie sõnumeid jälgida või neid kustutada teile näitamata."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"Käitatud rakenduste toomine"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Võimaldab rakendusel hankida teavet praegu töötavate ja hiljuti töötanud ülesannete kohta. Pahatahtlikud rakendused võivad avastada privaatset teavet teiste rakenduste kohta."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"töötavate rakenduste üksikasjade toomine"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Võimaldab rakendusel tuua üksikasjalikku teavet praegu töötavate ja hiljuti käitatud ülesannete kohta. Pahatahtlikud rakendused võivad tuvastada privaatset teavet muude rakenduste kohta."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"käitatud rakenduste ümberjärjestamine"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Võimaldab rakendusel teisaldada ülesanded esiplaanile ja taustale. Pahatahtlikud rakendused võivad sundida end esiplaanile tulema teie loata."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"käitatud rakenduste peatamine"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Võimaldab rakendusel saata püsivaid edastusi, mis jäävad pärast saate lõppemist alles. Pahatahtlikud rakendused võivad muuta tahvelarvuti aeglaseks või ebastabiilseks, põhjustades selle liiga suurt mälukasutust."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Võimaldab rakendusel saata püsivaid edastusi, mis jäävad pärast saate lõppemist alles. Pahatahtlikud rakendused võivad muuta telefoni aeglaseks või ebastabiilseks, põhjustades selle liiga suurt mälukasutust."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"loe kontaktandmeid"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Lubab rakendusel lugeda kõikide tahvelarvutisse salvestatud kontaktide andmeid, sh seda, kui sageli olete nendele inimestele helistanud, meilinud või nendega muul viisil suhelnud. See on kasulik e-posti aadresside automaatsel täitmisel ja muude mugavusfunktsioonide puhul. Pahatahtlikud rakendused võivad selle loa abil saata teie kontaktandmed teistele inimestele."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Lubab rakendusel lugeda kõikide telefoni salvestatud kontaktide andmeid, sh seda, kui sageli olete nendele inimestele helistanud, meilinud või nendega muul viisil suhelnud. See on kasulik e-posti aadresside automaatsel täitmisel ja muude mugavusfunktsioonide puhul. Pahatahtlikud rakendused võivad selle loa abil saata teie kontaktandmed teistele inimestele."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"kirjuta kontaktandmeid"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Lubab rakendusel muuta kõikide tahvelarvutisse salvestatud kontaktide andmeid, sh seda, kui sageli olete nendele inimestele helistanud, meilinud või nendega muul viisil suhelnud. See on kasulik e-posti aadresside automaatsel täitmisel ja muude mugavusfunktsioonide puhul. Pahatahtlikud rakendused võivad kasutada seda luba kontaktandmete muutmiseks või kustutamiseks."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Lubab rakendusel muuta kõikide telefoni salvestatud kontaktide andmeid, sh seda, kui sageli olete nendele inimestele helistanud, meilinud või nendega muul viisil suhelnud. See on kasulik e-posti aadresside automaatsel täitmisel ja muude mugavusfunktsioonide puhul. Pahatahtlikud rakendused võivad kasutada seda luba kontaktandmete muutmiseks või kustutamiseks."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"kõnelogi lugemine"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Lubab rakendusel lugeda tahvelarvuti kõnelogi, sh teavet sissetulevate ja väljaminevate kõnede kohta. Pahatahtlikud rakendused võivad saata selle abil teie teavet teistele inimestele."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Lubab rakendusel lugeda telefoni kõnelogi, sh teavet sissetulevate ja väljaminevate kõnede kohta. Pahatahtlikud rakendused võivad saata selle abil teie teavet teistele inimestele."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 00750a9..31e2876 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"رایانه لوحی شما خاموش می شود."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"گوشی شما خاموش می شود."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"آیا می‎خواهید تلفن خاموش شود؟"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"راه‌اندازی مجدد در حالت امن"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"آیا می‌خواهید با حالت امن راه‌اندازی مجدد کنید؟ با این کار کلیه برنامه‌های شخص ثالثی که نصب کرده‌اید غیر فعال می‌شود. با راه‌اندازی دوباره سیستم این برنامه‌ها دوباره بازیابی می‌شوند."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"اخیر"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"برنامه‎های جدید موجود نیست."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"گزینه های رایانه لوحی"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"به برنامه اجازه می‎دهد تا پیامهای WAP را دریافت و پردازش کند. برنامه‎های مخرب می‎توانند پیامهای شما را کنترل کنند یا آنها را بدون نشان دادن آنها به شما حذف کنند."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"بازیابی برنامه‎های در حال اجرا"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"به برنامه اجازه می‎دهد تا اطلاعات مربوط به کارهایی که اخیرا و در حال حاضر اجرا می‎شوند را بازیابی کند. برنامه‎های مخرب می‎توانند اطلاعات شخصی مربوط به برنامه‎های دیگر را پیدا کنند."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"بازیابی جزئیات برنامه‌های در حال اجرا"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"به برنامه اجازه می‎دهد تا اطلاعات مفصلی مربوط به کارهایی که در حال حاضر و اخیراً اجرا می‎شوند را بازیابی کند. برنامه‎های مخرب می‎توانند اطلاعات شخصی مربوط به برنامه‎های دیگر را پیدا کنند."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"تنظیم مجدد ترتیب برنامه‎های در حال اجرا"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"به برنامه اجازه می‎دهد تا کارها را به پیش زمینه و پس زمینه منتقل کند. برنامه‎های مخرب می‎توانند بدون کنترل به اجبار خود را به جلو منتقل کنند."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"متوقف کردن برنامه‎های در حال اجرا"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"به برنامه اجازه می‎دهد تا پخشهای ماندگار را که پس از اتمام پخش باقی می‎مانند ارسال شوند. برنامه‎های مخرب می‎توانند با استفاده بیش از حد از حافظه وضعیت آن را ناپایدار سازند یا باعث کند شدن رایانه لوحی شوند."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"به برنامه اجازه می‎دهد تا پخشهای ماندگار را که پس از اتمام پخش باقی می‎مانند ارسال کند. برنامه‎های مخرب می‎توانند با استفاده بیش از حد از حافظه تلفن را کند یا ناپایدار کنند."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"خواندن اطلاعات تماس"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبان را که بر روی گوشی ذخیره شده است بخواند و این داده‌ها شامل لیست مخاطبانی که با آن‌ها مکرراً تماس می‌گیرید، ایمیل می‌زنید یا با راه‌های دیگر با آن‌ها ارتباط برقرار می‌کنید می‌شود. این موارد در تکمیل خودکار آدرس‌های ایمیل یا دیگر موارد برای راحتی کار به شما کمک می‌کنند. برنامه‌های خرابکار می‌توانند از این مجوز برای ارسال داده‌های تماس شما به افراد دیگر استفاده کنند."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبان را که بر روی گوشی ذخیره شده است پاک کند و این داده‌ها شامل لیست مخاطبانی که با آن‌ها مکرراً تماس می‌گیرید، ایمیل می‌زنید یا با راه‌های دیگر با آن‌ها ارتباط برقرار می‌کنید می‌شود. این موارد در تکمیل خودکار آدرس‌های ایمیل یا دیگر موارد برای راحتی کار به شما کمک می‌کنند. برنامه‌های خرابکار می‌توانند از این مجوز برای ارسال داده‌های تماس شما به افراد دیگر استفاده کنند."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"نوشتن اطلاعات تماس"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبان را که بر روی رایانه لوحی شما ذخیره شده است تغییر دهد و این داده‌ها شامل لیست مخاطبانی که با آن‌ها مکرراً تماس می‌گیرید، ایمیل می‌زنید یا با راه‌های دیگر با آن‌ها ارتباط برقرار می‌کنید می‌شود. این موارد در تکمیل خودکار آدرس‌های ایمیل یا دیگر موارد برای راحتی کار به شما کمک می‌کنند. برنامه‌های خرابکار می‌توانند از این مجوز برای ارسال داده‌های تماس شما به افراد دیگر یا حذف آن‌ها استفاده کنند."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"به برنامه اجازه می‌دهد داده‌های مربوط به مخاطبان را که بر روی گوشی ذخیره شده است تغییر دهد و این داده‌ها شامل لیست مخاطبانی که با آن‌ها مکرراً تماس می‌گیرید، ایمیل می‌زنید یا با راه‌های دیگر با آن‌ها ارتباط برقرار می‌کنید می‌شود. این موارد در تکمیل خودکار آدرس‌های ایمیل یا دیگر موارد برای راحتی کار به شما کمک می‌کنند. برنامه‌های خرابکار می‌توانند از این مجوز برای ارسال داده‌های تماس شما به افراد دیگر یا حذف آن‌ها استفاده کنند."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"خواندن گزارش تماس"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"به برنامه اجازه می‌دهد گزارشات تماس رایانه لوحی شما، از جمله داده‌هایی درمورد تماس‎های ورودی و خروجی را بخواند. برنامه‌های مخرب ممکن است از این ویژگی برای ارسال داده‌های شما به دیگران استفاده کنند."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"به برنامه اجازه می‌دهد گزارشات تماس تلفنی شما، از جمله داده‌هایی درمورد تماس‎های ورودی و خروجی را بخواند. برنامه‌های مخرب ممکن است از این ویژگی برای ارسال داده‌های شما به دیگران استفاده کنند."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"نویسه"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"کلمه"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"پیوند"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"خط"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"تست کارخانه انجام نشد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index a23d534..3aa4796 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet-laitteesi sammutetaan."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Puhelin suljetaan."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Haluatko sammuttaa?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Käynnistä vikasietotilassa"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Haluatko käynnistää uudelleen vikasietotilassa? Tällöin kolmansien osapuolten sovelluksia ei käynnistetä. Sovellukset otetaan jälleen käyttöön, kun käynnistät laitteen uudelleen."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Viimeisimmät"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Ei viimeaikaisia sovelluksia"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet-laitteen asetukset"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Antaa sovelluksen vastaanottaa ja käsitellä WAP-viestejä. Haitalliset sovellukset voivat valvoa viestejä tai poistaa niitä näyttämättä niitä sinulle."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"käynnissä olevien sovellusten noutaminen"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Antaa sovelluksen noutaa käynnissä oleviin ja käynnissä olleisiin tehtäviin liittyviä tietoja. Haitalliset sovellukset saattavat saada näin muihin sovelluksiin liittyviä yksityisiä tietoja."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"hae tiedot suoritettavista sovelluksista"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Antaa sovellukselle oikeuden noutaa käynnissä oleviin ja käynnissä olleisiin tehtäviin liittyviä tietoja. Haitalliset sovellukset saattavat saada näin muihin sovelluksiin liittyviä yksityisiä tietoja."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"käynnissä olevien sovellusten järjesteleminen"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Antaa sovelluksen siirtää tehtäviä etualalle ja taustalle. Haitalliset sovellukset voivat pakottaa itsensä etualalle ilman käyttäjän hallintaa."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"käynnissä olevien sovellusten pysäyttäminen"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Antaa sovelluksen lähettää pysyviä lähetyksiä, jotka pysyvät olemassa lähetyksen päätyttyä. Haitalliset sovellukset voivat tehdä tablet-laitteesta hitaan tai epävakaan kasvattamalla sen muistinkäyttöä liikaa."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Antaa sovelluksen lähettää pysyviä lähetyksiä, jotka pysyvät olemassa lähetyksen päätyttyä. Haitalliset sovellukset voivat tehdä puhelimesta hitaan tai epävakaan kasvattamalla sen muistinkäyttöä liikaa."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lue yhteystietoja"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Antaa sovelluksen lukea kaikki tablet-laitteesi yhteystiedot, myös tiedot siitä, miten usein olet puhelimitse, sähköpostitse tai muilla tavoin viestinyt tiettyjen henkilöiden kanssa. Ominaisuus helpottaa sähköpostiosoitteiden automaattista hakemista sekä monia muita hyödyllisiä toimintoja, mutta haittasovellukset voivat lähettää sen avulla yhteystietojasi muille."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Antaa sovelluksen lukea kaikki puhelimesi yhteystiedot, myös tiedot siitä, miten usein olet puhelimitse, sähköpostitse tai muilla tavoin viestinyt tiettyjen henkilöiden kanssa. Ominaisuus helpottaa sähköpostiosoitteiden automaattista hakemista sekä monia muita hyödyllisiä toimintoja, mutta haittasovellukset voivat lähettää sen avulla yhteystietojasi muille."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"kirjoita yhteystietoja"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Antaa sovelluksen muokata kaikkia tablet-laitteesi yhteystietoja, myös tietoja siitä, miten usein olet puhelimitse, sähköpostitse tai muilla tavoin viestinyt tiettyjen henkilöiden kanssa. Ominaisuus helpottaa sähköpostiosoitteiden automaattista hakemista sekä monia muita hyödyllisiä toimintoja, mutta haittasovellukset voivat poistaa tai muokata sen avulla yhteystietojasi."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Antaa sovelluksen muokata kaikkia puhelimesi yhteystietoja, myös tietoja siitä, miten usein olet puhelimitse, sähköpostitse tai muilla tavoin viestinyt tiettyjen henkilöiden kanssa. Ominaisuus helpottaa sähköpostiosoitteiden automaattista hakemista sekä monia muita hyödyllisiä toimintoja, mutta haittasovellukset voivat poistaa tai muokata sen avulla yhteystietojasi."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lue puhelulokia"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Antaa sovelluksen lukea tablet-laitteesi puhelulokia, kuten tietoja vastatuista ja soitetuista puheluista. Haitalliset sovellukset voivat lähettää tietojasi muille henkilöille."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Antaa sovelluksen lukea puhelimesi puhelulokia, kuten tietoja vastatuista ja soitetuista puheluista. Haitalliset sovellukset voivat lähettää tietojasi muille henkilöille."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"merkki"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"sana"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"linkki"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"rivi"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Tehdastesti epäonnistui"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index c4d04aa..3b79fc3 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permet à l\'application de recevoir et de traiter des messages WAP. Des applications malveillantes peuvent surveiller vos messages ou les supprimer avant même que vous puissiez les voir."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"récupérer les applications en cours d\'exécution"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permet à l\'application de récupérer les informations relatives aux tâches actuellement ou récemment exécutées. Des applications malveillantes peuvent exploiter cette fonctionnalité pour obtenir des informations privées relatives à d\'autres applications."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"récupérer les détails des applications en cours d\'exécution"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permet à l\'application de récupérer des informations détaillées sur les tâches en cours d\'exécution ou récemment exécutées. Des applications malveillantes peuvent utiliser cette fonctionnalité pour obtenir des informations confidentielles relatives à d\'autres applications."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"réorganiser les applications en cours d\'exécution"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permet à l\'application de faire passer les tâches de premier plan en arrière-plan. Des applications malveillantes peuvent exploiter cette fonctionnalité pour passer au premier plan sans votre consentement."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"arrêter les applications en cours d\'exécution"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permet à l\'application d\'envoyer des diffusions \"persistantes\", qui perdurent après la fin de la diffusion. Des applications malveillantes peuvent ainsi ralentir la tablette ou la rendre instable en l\'obligeant à utiliser trop de mémoire."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permet à l\'application d\'envoyer des diffusions \"persistantes\", qui perdurent une fois la diffusion terminée. Des applications malveillantes peuvent ainsi ralentir le téléphone ou le rendre instable en l\'obligeant à utiliser trop de mémoire."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"Accès aux données des contacts"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permet à l\'application de lire toutes les données de vos contacts enregistrées sur votre tablette, y compris la fréquence à laquelle vous les avez appelés, leur avez envoyé un e-mail ou avez communiqué avec chacun d\'eux via d\'autres moyens. Vous pouvez ainsi bénéficier de la saisie semi-automatique des adresses e-mail et d\'autres fonctionnalités tout aussi pratiques. Les applications malveillantes peuvent utiliser cette autorisation afin d\'envoyer les données de vos contacts à d\'autres personnes."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permet à l\'application de lire toutes les données de vos contacts enregistrées sur votre téléphone, y compris la fréquence à laquelle vous les avez appelés, leur avez envoyé un e-mail ou avez communiqué avec chacun d\'eux via d\'autres moyens. Vous pouvez ainsi bénéficier de la saisie semi-automatique des adresses e-mail et d\'autres fonctionnalités tout aussi pratiques. Les applications malveillantes peuvent utiliser cette autorisation afin d\'envoyer les données de vos contacts à d\'autres personnes."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"Édition des données d\'un contact"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permet à l\'application de modifier les données de vos contacts enregistrées sur votre tablette, y compris la fréquence à laquelle vous les avez appelés, leur avez envoyé un e-mail ou avez communiqué avec chacun d\'eux via d\'autres moyens. Vous pouvez ainsi bénéficier de la saisie semi-automatique des adresses e-mail et d\'autres fonctionnalités tout aussi pratiques. Les applications malveillantes peuvent utiliser cette autorisation afin de supprimer ou de modifier les données de vos contacts."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permet à l\'application de modifier les données de vos contacts enregistrées sur votre téléphone, y compris la fréquence à laquelle vous les avez appelés, leur avez envoyé un e-mail ou avez communiqué avec chacun d\'eux via d\'autres moyens. Vous pouvez ainsi bénéficier de la saisie semi-automatique des adresses e-mail et d\'autres fonctionnalités tout aussi pratiques. Les applications malveillantes peuvent utiliser cette autorisation afin de supprimer ou de modifier les données de vos contacts."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lire le journal d\'appels"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permet à l\'application de lire le journal d\'appels de votre tablette, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à des tiers."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permet à l\'application de lire le journal d\'appels de votre téléphone, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer vos données à des tiers."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 8a04917..1027ae7 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"एप्लिकेशन को WAP संदेशों को प्राप्त करने और संसाधित करने देता है. दुर्भावनापूर्ण एप्लिकेशन आपके संदेशों की निगरानी कर सकते हैं या आपको दिखाए बिना उन्हें हटा सकते हैं."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"चल रहे एप्‍लिकेशन पुनर्प्राप्त करें"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"एप्लिकेशन को वर्तमान में और हाल ही में चल रहे कार्यों की जानकारी पुर्नप्राप्त करने देता है. दुर्भावनापूर्ण एप्लिकेशन अन्य एप्लिकेशन के बारे में निजी जानकारी खोज सकते हैं."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"चल रहे एप्‍लिकेशन के विवरण प्राप्त करें"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"एप्लिकेशन को वर्तमान में और हाल ही में चल रहे कार्यों की जानकारी प्राप्त करने देता है. दुर्भावनापूर्ण एप्लिकेशन अन्य एप्लिकेशन के बारे में निजी जानकारी खोज सकते हैं."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"चल रहे एप्‍लिकेशन पुन: क्रमित करें"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"एप्लिकेशन को अग्रभूमि और पृष्ठभूमि में कार्यों को ले जाने देता है. दुर्भावनापूर्ण एप्लिकेशन आपके नियंत्रण के बिना स्वयं को बलपूर्वक आगे कर सकते हैं."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"चलने वाले एप्लिकेशन रोकें"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"एप्‍लिकेशन को स्‍टिकी प्रसारण भेजने देता है, जो प्रसारण समाप्त होने के बाद भी बने रहते हैं. दुर्भावनापूर्ण एप्‍लिकेशन टेबलेट की बहुत अधिक स्मृति का उपयोग करके उसे धीमा या अस्‍थिर कर सकते हैं."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"एप्‍लिकेशन को स्‍टिकी प्रसारण भेजने देता है, जो प्रसारण समाप्त होने के बाद भी बना रहता है. दुर्भावनापूर्ण एप्‍लिकेशन फ़ोन की बहुत अधिक स्मृति का उपयोग करके उसे धीमा या अस्‍थिर कर सकते हैं."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"संपर्क डेटा पढ़ें"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"एप्‍लिकेशन को आपके द्वारा विशेष व्‍यक्तियों को अन्‍य तरीकों से कॉल, ईमेल, या उनसे संचार करने की आवृत्ति सहित, आपके टेबलेट पर संग्रहीत आपके संपर्कों का सभी डेटा पढ़ने देता है. इससे ईमेल पतों के स्‍वत: पूर्ण होने और अन्‍य उपयुक्त सुविधाओं के लिए सहायता मिलती है. दुर्भावनापूर्ण एप्‍लिकेशन इस अनुमति का उपयोग आपका डेटा अन्‍य लोगों को भेजने के लिए कर सकते हैं."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"एप्‍लिकेशन को आपके द्वारा विशेष व्‍यक्तियों को अन्‍य तरीकों से कॉल करने, ईमेल करने, या उनसे संचार करने की आवृत्ति सहित, आपके फ़ोन पर संग्रहीत आपके संपर्कों का सभी डेटा पढ़ने देता है. इससे ईमेल पतों के स्‍वत: पूर्ण होने और अन्‍य उपयुक्त सुविधाओं के लिए सहायता मिलती है. दुर्भावनापूर्ण एप्‍लिकेशन इस अनुमति का उपयोग आपका डेटा अन्‍य लोगों को भेजने के लिए कर सकते हैं."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"संपर्क डेटा लिखें"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"एप्‍लिकेशन को आपके द्वारा विशेष व्‍यक्तियों को अन्‍य तरीकों से कॉल, ईमेल, या उनसे संचार करने की आवृत्ति सहित, आपके टेबलेट पर संग्रहीत आपके संपर्कों का डेटा संशोधित करने देता है. इससे ईमेल पतों के स्‍वत: पूर्ण होने और अन्‍य उपयुक्त सुविधाओं के लिए सहायता मिलती है. दुर्भावनापूर्ण एप्‍लिकेशन इस अनुमति का उपयोग आपका डेटा अन्‍य लोगों को भेजने के लिए कर सकते हैं."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"एप्‍लिकेशन को आपके द्वारा विशेष व्‍यक्तियों को अन्‍य तरीकों से कॉल, ईमेल, या उनसे संचार करने की आवृत्ति सहित, आपके फ़ोन पर संग्रहीत आपके संपर्कों का डेटा संशोधित करने देता है. इससे ईमेल पतों के स्‍वत: पूर्ण होने और अन्‍य उपयुक्त सुविधाओं के लिए सहायता मिलती है. दुर्भावनापूर्ण एप्‍लिकेशन इस अनुमति का उपयोग आपका डेटा अन्‍य लोगों को भेजने के लिए कर सकते हैं."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"कॉल लॉग पढ़ें"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"एप्‍लिकेशन को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके टेबलेट का कॉल लॉग पढ़ने देता है. दुर्भावनापूर्ण एप्‍लिकेशन अन्‍य लोगों को आपका डेटा भेजने के लिए इसका उपयोग कर सकते हैं."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"एप्‍लिकेशन को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके फ़ोन का कॉल लॉग पढ़ने देता है. दुर्भावनापूर्ण एप्‍लिकेशन अन्‍य लोगों को आपका डेटा भेजने के लिए इसका उपयोग कर सकते हैं."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 0b2f035..4288eaf 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Vaš tabletni uređaj će se isključiti."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Vaš će se telefon ipak isključiti"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Želite li isključiti uređaj?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Ponovno pokretanje u sigurnom načinu rada"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Želite li ponovo pokrenuti uređaj u sigurnom načinu rada? To će onemogućiti sve aplikacije treće strane koje ste instalirali. Bit će vraćene kada ponovo pokrenete uređaj."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavni"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nema nedavnih aplikacija."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcije tabletnog uređaja"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Omogućuje aplikaciji primanje i obradu WAP poruka. Zlonamjerne aplikacije mogu nadzirati vaše poruke ili ih brisati, a da vam ih ne pokažu."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"dohvaćanje pokrenutih aplikacija"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Omogućuje aplikaciji dohvaćanje informacija o trenutačno i nedavno pokrenutim zadacima. Zlonamjerne aplikacije mogu otkriti privatne informacije o drugim aplikacijama."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"dohvaćanje pojedinosti o pokrenutim aplikacijama"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Aplikaciji omogućuje dohvaćanje detaljnih informacija o trenutačno i nedavno pokrenutim zadacima. Zlonamjerne aplikacije mogu otkriti privatne informacije o drugim aplikacijama."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"promjena redoslijeda pokrenutih aplikacija"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Omogućuje aplikaciji da premjesti zadatke u prednji plan ili pozadinu. Zlonamjerne aplikacije mogu na silu doći u prednji plan bez vašeg nadzora."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"zaustavljanje pokrenutih aplikacija"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Omogućuje aplikaciji slanje \"ljepljivih\" emitiranja, koja se zadržavaju nakon što emitiranje završi. Zlonamjerne aplikacije mogu usporiti tabletno računalo ili ga učiniti nestabilnim uzrokujući pretjeranu upotrebu memorije."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Omogućuje aplikaciji slanje \"ljepljivih\" emitiranja, koja se zadržavaju nakon što emitiranje završi. Zlonamjerne aplikacije mogu usporiti telefon ili ga učiniti nestabilnim uzrokujući pretjeranu upotrebu memorije."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"čitanje kontaktnih podataka"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Omogućuje aplikaciji čitanje svih podataka o vašim kontaktima pohranjenim na vašem tabletnom računalu, uključujući i učestalost kojom određene pojedince nazivate, šaljete im e-poruke ili komunicirate s njima na druge načine. To pomaže pri automatskom dovršavanju e-adresa i s ostalim prigodnim značajkama. Zlonamjerne aplikacije mogu upotrijebiti to dopuštenje kako bi vaše podatke za kontakt slale drugim osobama."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Omogućuje aplikaciji čitanje svih podataka o vašim kontaktima pohranjenim na vašem telefonu, uključujući i učestalost kojom određene pojedince nazivate, šaljete im e-poruke ili komunicirate s njima na druge načine. To pomaže pri automatskom dovršavanju e-adresa i s ostalim prigodnim značajkama. Zlonamjerne aplikacije mogu upotrijebiti to dopuštenje kako bi vaše podatke za kontakt slale drugim osobama."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"pisanje kontaktnih podataka"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Omogućuje aplikaciji izmjenu podataka o vašim kontaktima pohranjenim na vašem tabletnom računalu, uključujući i učestalost kojom određene pojedince nazivate, šaljete im e-poruke ili komunicirate s njima na druge načine. To pomaže pri automatskom dovršavanju e-adresa i s ostalim prigodnim značajkama. Zlonamjerne aplikacije mogu upotrijebiti to dopuštenje kako bi vaše podatke za kontakt izbrisale ili izmijenile."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Omogućuje aplikaciji izmjenu podataka o vašim kontaktima pohranjenim na vašem telefonu, uključujući i učestalost kojom određene pojedince nazivate, šaljete im e-poruke ili komunicirate s njima na druge načine. To pomaže pri automatskom dovršavanju adresa e-pošte i s ostalim prigodnim značajkama. Zlonamjerne aplikacije mogu upotrijebiti to dopuštenje kako bi vaše podatke za kontakt izbrisale ili izmijenile."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"čitanje dnevnika poziva"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Aplikaciji omogućuje čitanje dnevnika poziva vašeg tabletnog računala zajedno s podacima o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije to mogu upotrebljavati za slanje vaših podataka drugim osobama."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Aplikaciji omogućuje čitanje dnevnika poziva vašeg telefona zajedno s podacima o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije to mogu upotrebljavati za slanje vaših podataka drugim osobama."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"znak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"riječ"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"veza"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"redak"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Tvorničko testiranje nije uspjelo"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 0213339..0190fb2 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"A táblagép ki fog kapcsolni."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"A telefon le fog állni."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Kikapcsolja?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Újraindítás csökkentett módban"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Szeretné csökkentett módban újraindítani a rendszert? Ez letiltja a telepített, harmadik féltől származó alkalmazásokat. Újraindításkor ezek visszaállnak."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Legutóbbiak"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nincs újabb alkalmazás."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Táblagép beállításait"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Lehetővé teszi az alkalmazás számára, hogy WAP üzeneteket fogadjon és dolgozzon fel. A rosszindulatú alkalmazások megfigyelhetik vagy törölhetik az üzeneteket anélkül, hogy Ön látná azokat."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"futó alkalmazások lekérése"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Lehetővé teszi az alkalmazás számára a jelenleg és a nemrég futó feladatok adatainak lekérését. A rosszindulatú alkalmazások privát adatokhoz juthatnak más alkalmazásokról."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"futó alkalmazások részleteinek lekérése"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Lehetővé teszi az alkalmazás számára a jelenleg és a nemrég futó feladatok részletes adatainak lekérését. A rosszindulatú alkalmazások más alkalmazásokkal kapcsolatos privát adatokhoz férhetnek hozzá."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"futó alkalmazások átrendezése"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Lehetővé teszi az alkalmazás számára, hogy feladatokat helyezzen át az előtérből a háttérbe és fordítva. A rosszindulatú alkalmazások az előtérbe helyezhetik magukat az Ön engedélye nélkül."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"futó alkalmazások leállítása"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Lehetővé teszi az alkalmazás számára a ragadós üzenetek küldését, amelyek a sugárzás után is megmaradnak. A rosszindulatú alkalmazások lelassíthatják vagy instabillá tehetik a táblagépet a túlzott memóriahasználattal."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Lehetővé teszi az alkalmazás számára ragadós üzenetek küldését, amelyek a sugárzás után is megmaradnak. A rosszindulatú alkalmazások lelassíthatják vagy instabillá tehetik a táblagépet a túlzott memóriahasználattal."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"névjegyadatok olvasása"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Lehetővé teszi az alkalmazás számára a táblagépen tárolt névjegyekre vonatkozó összes adat -- például az egyes személyekkel telefonon, e-mailben vagy más módon folytatott kommunikáció gyakoriságára vonatkozó adatok -- olvasását. Ez segítséget nyújt az e-mail címek automatikus kiegészítéséhez és az egyéb kényelmi funkciók működéséhez. A rosszindulatú alkalmazások ezt az engedélyt arra használhatják, hogy névjegyeit elküldjék más személyeknek."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Lehetővé teszi az alkalmazás számára a telefonon tárolt névjegyekre vonatkozó összes adat -- például az egyes személyekkel telefonon, e-mailben vagy más módon folytatott kommunikáció gyakoriságára vonatkozó adatok -- olvasását. Ez segítséget nyújt az e-mail címek automatikus kiegészítéséhez és az egyéb kényelmi funkciók működéséhez. A rosszindulatú alkalmazások ezt az engedélyt arra használhatják, hogy névjegyeit elküldjék más személyeknek."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"névjegyadatok írása"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Lehetővé teszi az alkalmazás számára a táblagépen tárolt névjegyekre vonatkozó adatok -- például az egyes személyekkel telefonon, e-mailben vagy más módon folytatott kommunikáció gyakoriságára vonatkozó adatok -- módosítását. Ez segítséget nyújt az e-mail címek automatikus kiegészítéséhez és az egyéb kényelmi funkciók működéséhez. A rosszindulatú alkalmazások ezt az engedélyt arra használhatják, hogy módosítsák vagy töröljék névjegyeinek adatait."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Lehetővé teszi az alkalmazás számára a telefonon tárolt névjegyekre vonatkozó adatok -- például az egyes személyekkel telefonon, e-mailben vagy más módon folytatott kommunikáció gyakoriságára vonatkozó adatok -- módosítását. Ez segítséget nyújt az e-mail címek automatikus kiegészítéséhez és az egyéb kényelmi funkciók működéséhez. A rosszindulatú alkalmazások ezt az engedélyt arra használhatják, hogy módosítsák vagy töröljék névjegyeinek adatait."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"Híváslista beolvasása"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Lehetővé teszi, hogy az alkalmazás hozzáférjen a táblagép híváslistájához, beleértve a bejövő és kimenő hívások adatait. A rosszindulatú alkalmazások ezt arra használhatják, hogy az adatait elküldjék másoknak."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Lehetővé teszi, hogy az alkalmazás hozzáférjen híváslistájához, beleértve a bejövő és kimenő hívások adatait. A rosszindulatú alkalmazások ezt arra használhatják, hogy az adatait elküldjék másoknak."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"karakter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"szó"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"sor"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"A gyári teszt sikertelen"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 17ed86b..9bb765d 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet Anda akan dimatikan."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ponsel Anda akan dimatikan."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Anda ingin mematikannya?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reboot ke mode aman"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Apakah Anda ingin reboot ke mode aman? Tindakan ini akan menonaktifkan semua aplikasi pihak ketiga yang telah dipasang. Aplikasi tersebut akan dipulihkan ketika Anda melakukan reboot lagi."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Terbaru"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Tidak ada apl terbaru."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opsi tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Mengizinkan apl menerima dan memproses pesan WAP. Apl berbahaya dapat memantau pesan atau menghapusnya tanpa menunjukkannya kepada Anda."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"mengambil apl yang berjalan"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Mengizinkan apl mengambil informasi tentang tugas yang sedang dijalankan dan yang baru-baru ini dijalankan. Apl berbahaya dapat menemukan informasi pribadi tentang apl lain."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"mengambil detail aplikasi yang sedang berjalan"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Izinkan aplikasi mengambil informasi mendetail tentang tugas yang saat ini dan baru-baru ini dijalankan. Aplikasi berbahaya dapat menemukan informasi pribadi tentang aplikasi lain."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"menyusun ulang apl yang berjalan"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Mengizinkan apl memindah tugas ke latar depan dan latar belakang. Apl berbahaya dapat memaksa berpindah ke depan tanpa kontrol Anda."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"menghentikan apl yang berjalan"</string>
@@ -321,7 +321,7 @@
     <string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"menggunakan media pengawasandi apa pun untuk pemutaran"</string>
     <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Mengizinkan apl menggunakan pengawasandi media apa pun yang terpasang guna mengawasandikan media untuk diputar."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"baca/tulis ke sumber daya yang dimiliki oleh diag"</string>
-    <string name="permdesc_diagnostic" msgid="6608295692002452283">"Mengizinkan apl membaca dan menulis ke sumber daya apa pun yang dimiliki oleh grup diag; misalnya, file dalam /dev. Izin ini berpotensi mempengaruhi kestabilan dan keamanan sistem. Sebaiknya ini HANYA digunakan untuk diagnostik khusus perangkat keras oleh pabrikan atau operator."</string>
+    <string name="permdesc_diagnostic" msgid="6608295692002452283">"Mengizinkan apl membaca dan menulis ke sumber daya apa pun yang dimiliki oleh grup diag; misalnya, file dalam /dev. Izin ini berpotensi memengaruhi kestabilan dan keamanan sistem. Sebaiknya ini HANYA digunakan untuk diagnostik khusus perangkat keras oleh pabrikan atau operator."</string>
     <string name="permlab_changeComponentState" msgid="6335576775711095931">"mengaktifkan atau menonaktifkan komponen apl"</string>
     <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Mengizinkan apl mengubah apakah komponen apl lain diaktifkan atau tidak. Apl berbahaya dapat menggunakan ini untuk menonaktifkan kemampuan tablet yang penting. Izin ini harus digunakan dengan hati-hati karena dapat menjadikan komponen apl tidak dapat digunakan, tidak konsisten, atau tidak stabil."</string>
     <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Mengizinkan apl mengubah apakah komponen apl lain diaktifkan atau tidak. Apl berbahaya dapat menggunakan izin ini untuk menonaktifkan kemampuan ponsel yang penting. Izin ini harus digunakan dengan hati-hati, karena mungkin saja menjadikan komponen apl tidak dapat digunakan, tidak konsisten, atau tidak stabil."</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Mengizinkan apl mengirim siaran permanen, yang tetap ada setelah siaran berakhir. Apl berbahaya dapat membuat tablet menjadi lambat atau tidak stabil dengan memicu penggunaan memori yang terlalu banyak."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Mengizinkan apl mengirim siaran permanen, yang tetap ada setelah siaran berakhir. Apl berbahaya dapat membuat ponsel menjadi lambat atau tidak stabil dengan memicu penggunaan memori yang terlalu banyak."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"baca data kenalan"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Memungkinkan aplikasi membaca semua data tentang kenalan yang disimpan pada tablet Anda, termasuk frekuensi saat Anda menghubungi, mengirim email, atau berkomunikasi dengan cara lain dengan individu tertentu. Aplikasi ini membantu pelengkapan otomatis alamat email dan fitur nyaman lainnya. Aplikasi berbahaya dapat menggunakan izin ini untuk mengirim data kenalan Anda kepada orang lain."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Memungkinkan aplikasi membaca semua data tentang kenalan yang disimpan pada ponsel Anda, termasuk frekuensi saat Anda menghubungi, mengirim email, atau berkomunikasi dengan cara lain dengan individu tertentu. Aplikasi ini membantu pelengkapan otomatis alamat email dan fitur nyaman lainnya. Aplikasi berbahaya dapat menggunakan izin ini untuk mengirim data kenalan Anda kepada orang lain."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"tuliskan data kenalan"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Memungkinkan aplikasi mengubah semua data tentang kenalan yang disimpan pada tablet Anda, termasuk frekuensi saat Anda menghubungi, mengirim email, atau berkomunikasi dengan cara lain dengan individu tertentu. Aplikasi ini membantu pelengkapan otomatis alamat email dan fitur nyaman lainnya. Aplikasi berbahaya dapat menggunakan izin ini untuk mengirim data kenalan Anda kepada orang lain."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Memungkinkan aplikasi mengubah semua data tentang kenalan yang disimpan pada ponsel Anda, termasuk frekuensi saat Anda menghubungi, mengirim email, atau berkomunikasi dengan cara lain dengan individu tertentu. Aplikasi ini membantu pelengkapan otomatis alamat email dan fitur nyaman lainnya. Aplikasi berbahaya dapat menggunakan izin ini untuk mengirim data kenalan Anda kepada orang lain."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"membaca log panggilan"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Memungkinkan apl membaca log panggilan tablet Anda, termasuk data tentang panggilan masuk dan keluar. Apl berbahaya dapat menggunakan ini untuk mengirim data ke orang lain."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Memungkinkan apl membaca log panggilan ponsel Anda, termasuk data tentang panggilan masuk dan keluar. Apl berbahaya dapat menggunakan ini untuk mengirim data ke orang lain."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"karakter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"kata"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"tautan"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"baris"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Uji pabrik gagal"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 4f16349..4203cfd 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Consente all\'applicazione di ricevere ed elaborare messaggi WAP. Le applicazioni dannose potrebbero monitorare i tuoi messaggi o eliminarli senza mostrarteli."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"recupero applicazioni in esecuzione"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Consente all\'applicazione di recuperare informazioni sulle attività attualmente e recentemente in esecuzione. Le applicazioni dannose potrebbero scoprire informazioni riservate su altre applicazioni."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recupero dettagli applicazioni in esecuzione"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Consente all\'applicazione di recuperare informazioni dettagliate sulle attività attualmente e recentemente in esecuzione. Le applicazioni dannose potrebbero scoprire informazioni riservate su altre applicazioni."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"riordinamento applicazioni in esecuzione"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Consente all\'applicazione di spostare attività in primo piano e in background. Le applicazioni dannose potrebbero forzare la loro impostazione in primo piano senza il tuo controllo."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"interruzione applicazioni in esecuzione"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Consente all\'applicazione di inviare broadcast permanenti, che permangono anche al termine del broadcast. Le applicazioni dannose potrebbero rendere il tablet lento o instabile tramite un uso eccessivo della memoria."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Consente all\'applicazione di inviare broadcast permanenti, che permangono anche al termine del broadcast. Le applicazioni dannose potrebbero rendere il telefono lento o instabile tramite un uso eccessivo della memoria."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lettura dati di contatto"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Consente all\'applicazione di leggere tutti i dati relativi ai contatti memorizzati sul tablet, inclusa la frequenza con cui hai chiamato individui specifici, hai inviato loro delle email o hai comunicato con loro in altri modi. Ciò favorisce il completamento automatico degli indirizzi email e altre comode funzioni. Le applicazioni dannose potrebbero utilizzare questa autorizzazione per inviare i tuoi dati di contatto ad altre persone."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Consente all\'applicazione di leggere tutti i dati relativi ai contatti memorizzati sul telefono, inclusa la frequenza con cui hai chiamato individui specifici, hai inviato loro delle email o hai comunicato con loro in altri modi. Ciò favorisce il completamento automatico degli indirizzi email e altre comode funzioni. Le applicazioni dannose potrebbero utilizzare questa autorizzazione per inviare i tuoi dati di contatto ad altre persone."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"scrittura dati di contatto"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Consente all\'applicazione di modificare i dati relativi ai contatti memorizzati sul tablet, inclusa la frequenza con cui hai chiamato individui specifici, hai inviato loro delle email o hai comunicato con loro in altri modi. Ciò favorisce il completamento automatico degli indirizzi email e altre comode funzioni. Le applicazioni dannose potrebbero farne uso per cancellare o modificare i tuoi dati di contatto."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Consente all\'applicazione di modificare i dati relativi ai contatti memorizzati sul telefono, inclusa la frequenza con cui hai chiamato individui specifici, hai inviato loro delle email o hai comunicato con loro in altri modi. Ciò favorisce il completamento automatico degli indirizzi email e altre comode funzioni. Le applicazioni dannose potrebbero farne uso per cancellare o modificare i tuoi dati di contatto."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lettura del registro chiamate"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Consente all\'applicazione di leggere il registro chiamate del tablet, inclusi i dati sulle chiamate in arrivo e in uscita. Le applicazioni dannose potrebbero fare uso di questa funzione per inviare dati ad altre persone."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Consente all\'applicazione di leggere il registro chiamate del telefono, inclusi i dati sulle chiamate in arrivo e in uscita. Le applicazioni dannose potrebbero fare uso di questa funzione per inviare dati ad altre persone."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 77a6c47..e8bbd56 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"מאפשר ליישום לקבל ולעבד הודעות WAP. יישומים זדוניים עלולים לעקוב אחר ההודעות שלך או למחוק אותן מבלי להציגן בפניך."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"אחזור יישומים פעילים"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"מאפשר ליישום לאחזר מידע על המשימות הנוכחיות שפועלות, ואלו שפעלו לאחרונה. יישומים זדוניים עלולים לגלות מידע אישי על יישומים אחרים."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"אחזור פרטי יישומים פועלים"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"מאפשר ליישום לאחזר מידע מפורט על המשימות הנוכחיות הפועלות ועל משימות שפעלו לאחרונה. יישומים זדוניים עלולים לגלות מידע אישי על יישומים אחרים."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"סידור מחדש של יישומים פעילים"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"מאפשר ליישום להעביר משימות לחזית ולרקע. יישומים זדוניים עלולים לאלץ את עצמם לעבור לחזית ללא שליטה מצדך."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"עצירת יישומים פעילים"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"מאפשר ליישום לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. יישומים זדוניים עלולים להאט את פעילות הטבלט או להפוך אותה לבלתי יציבה על ידי הגדרת המכשיר לשימוש ביותר מדי זיכרון."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"מאפשר ליישום לשלוח שידורים דביקים, אשר נותרים לאחר סיום השידור. יישומים זדוניים עלולים להאט את פעילות הטלפון או להפוך אותה לבלתי יציבה על ידי הגדרת המכשיר לשימוש ביותר מדי זיכרון."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"קרא נתונים של אנשי קשר"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"מאפשר ליישום לקרוא את כל נתוני אנשי הקשר שלך המאוחסנים בטאבלט, כולל את התדירות שבה התקשרת, שלחת דוא\"ל או יצרת קשר בדרכים אחרות עם אנשים מסוימים. מצב זה מסייע להשלמה אוטומטית של כתובות דוא\"ל ותכונות נוחות אחרות. יישומים זדוניים עשויים להשתמש בהרשאה זו כדי לשלוח את נתוני אנשי הקשר שלך לאנשים אחרים."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"מאפשר ליישום לקרוא את כל נתוני אנשי הקשר שלך המאוחסנים בטלפון, כולל את התדירות שבה התקשרת, שלחת דוא\"ל או יצרת קשר בדרכים אחרות עם אנשים מסוימים. מצב זה מסייע להשלמה אוטומטית של כתובות דוא\"ל ולתכונות נוחות אחרות. יישומים זדוניים עשויים להשתמש בהרשאה זו כדי לשלוח את נתוני אנשי הקשר שלך לאנשים אחרים."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"כתוב נתונים של אנשי קשר"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"מאפשר ליישום לשנות את כל נתוני אנשי הקשר שלך המאוחסנים בטאבלט, כולל את התדירות שבה התקשרת, שלחת דוא\"ל או יצרת קשר בדרכים אחרות עם אנשים מסוימים. מצב זה מסייע להשלמה אוטומטית של כתובות דוא\"ל ותכונות נוחות אחרות. יישומים זדוניים עשויים להשתמש בהרשאה זו כדי למחוק או לשנות את נתוני אנשי הקשר שלך."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"מאפשר ליישום לשנות את כל נתוני אנשי הקשר שלך המאוחסנים בטלפון, כולל את התדירות שבה התקשרת, שלחת דוא\"ל או יצרת קשר בדרכים אחרות עם אנשים מסוימים. מצב זה מסייע להשלמה אוטומטית של כתובות דוא\"ל ותכונות נוחות אחרות. יישומים זדוניים עשויים להשתמש בהרשאה זו כדי למחוק או לשנות את נתוני אנשי הקשר שלך."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"קריאת יומן שיחות"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"מאפשר ליישום לקרוא את יומן השיחות של הטבלט, כולל נתונים על שיחות נכנסות ויוצאות. יישומים זדוניים עלולים לעשות בכך שימוש כדי לשלוח את הנתונים שלך לאנשים אחרים."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"מאפשר ליישום לקרוא את יומן השיחות של הטלפון, כולל נתונים על שיחות נכנסות ויוצאות. יישומים זדוניים עלולים לעשות בכך שימוש כדי לשלוח את הנתונים שלך לאנשים אחרים."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 07a163d..a65e747 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"タブレットの電源をOFFにします。"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"携帯電話の電源を切ります。"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"シャットダウンしますか?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"再起動してセーフモードに変更"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"再起動してセーフモードにしますか?セーフモードでは、インストールしたすべてのサードパーティ製アプリが無効になります。これらのアプリはもう一度再起動すると復元されます。"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"新着"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"最近使ったアプリはありません。"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"タブレットオプション"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"WAPメッセージの受信と処理をアプリに許可します。この許可を悪意のあるアプリに利用されると、メッセージが監視されたり、表示されずに削除されたりする恐れがあります。"</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"実行中のアプリの取得"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"現在実行中または最近実行したタスクに関する情報の取得をアプリに許可します。この許可を悪意のあるアプリに利用されると、他のアプリに関する非公開情報が発見される恐れがあります。"</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"実行中のアプリの詳細の取得"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"現在実行中のタスクまたは最近実行したタスクに関する情報の取得をアプリに許可します。この許可を悪意のあるアプリに利用されると、他のアプリに関する非公開情報が読み取られる恐れがあります。"</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"実行中のアプリの順序変更"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"タスクをフォアグラウンドやバックグラウンドに移動することをアプリに許可します。この許可を悪意のあるアプリに利用されると、悪意のあるアプリが強制的に優先される恐れがあります。"</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"実行中のアプリの停止"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"配信が終了してもメモリに残るstickyブロードキャストの配信をアプリに許可します。この許可を悪意のあるアプリに利用されると、メモリの使用量が増えてタブレットの動作が遅くなったり不安定になったりする恐れがあります。"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"配信が終了してもメモリに残るstickyブロードキャストの配信をアプリに許可します。この許可を悪意のあるアプリに利用されると、メモリの使用量が増えて携帯端末の動作が遅くなったり不安定になったりする恐れがあります。"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"連絡先データの読み取り"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"タブレットに保存されている連絡先についてすべてのデータを読み取ることをアプリに許可します。このデータには、特定の相手と電話、メール、または他の手段でコミュニケーションをとった回数も含まれます。この権限はメールアドレスの自動補完やその他の便利な機能に役立ちますが、悪意のあるアプリがこれを悪用してあなたの連絡先データを第三者に送信する可能性があります。"</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"携帯端末に保存されている連絡先についてすべてのデータを読み取ることをアプリに許可します。このデータには、特定の相手と電話、メール、または他の手段でコミュニケーションをとった回数も含まれます。この権限はメールアドレスの自動補完やその他の便利な機能に役立ちますが、悪意のあるアプリがこれを悪用してあなたの連絡先データを第三者に送信する可能性があります。"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"連絡先データの書き込み"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"タブレットに保存されている連絡先についてデータの変更をアプリに許可します。このデータには、特定の相手と電話、メール、または他の手段でコミュニケーションをとった回数も含まれます。この権限はメールアドレスの自動補完やその他の便利な機能に役立ちますが、悪意のあるアプリがこれを悪用してあなたの連絡先データを消去または改ざんする可能性があります。"</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"携帯端末に保存されている連絡先についてデータの変更をアプリに許可します。このデータには、特定の相手と電話、メール、または他の手段でコミュニケーションをとった回数も含まれます。この権限はメールアドレスの自動補完やその他の便利な機能に役立ちますが、悪意のあるアプリがこれを悪用してあなたの連絡先データを消去または改ざんする可能性があります。"</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"通話履歴の読み取り"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"タブレットの通話履歴(着信や発信のデータなど)の読み取りをアプリに許可します。この許可を悪意のあるアプリに利用されると、データが他のユーザーに送信される恐れがあります。"</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"携帯端末の通話履歴(着信や発信のデータなど)の読み取りをアプリに許可します。この許可を悪意のあるアプリに利用されると、データが他のユーザーに送信される恐れがあります。"</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"文字"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"単語"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"リンク"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"行"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"出荷時試験が失敗"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 1bbff03..7a4a55b 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"태블릿이 종료됩니다."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"휴대전화가 종료됩니다."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"종료하시겠습니까?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"안전 모드로 다시 부팅"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"안전 모드로 다시 부팅하시겠습니까? 그러면 설치한 모든 제3자 애플리케이션을 사용할 수 없게 됩니다. 다시 부팅을 반복하면 애플리케이션이 복원됩니다."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"최근 사용한 앱"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"최근에 사용한 앱이 없습니다."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"태블릿 옵션"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"앱이 WAP 메시지를 받고 처리할 수 있도록 허용합니다. 이 경우 악성 앱이 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"실행 중인 앱 검색"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"앱이 현재 실행 중이거나 최근에 실행된 작업에 대한 정보를 검색할 수 있도록 허용합니다. 이 경우 악성 앱이 다른 앱에 대한 개인 정보를 검색할 수 있습니다."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"실행 중인 앱 세부정보 검색"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"앱이 현재 실행 중이거나 최근에 실행된 작업에 대한 상세한 정보를 검색할 수 있도록 허용합니다. 이 경우 악성 앱이 다른 앱에 대한 개인 정보를 검색할 수 있습니다."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"실행 중인 앱 순서 재지정"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"앱이 작업을 포그라운드나 백그라운드로 이동할 수 있도록 허용합니다. 이 경우 악성 앱이 사용자의 조작 없이 앞으로 이동할 수 있습니다."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"실행 중인 앱 중지"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"앱이 브로드캐스트가 끝난 후에 남은 브로드캐스트를 보낼 수 있도록 허용합니다. 이 경우 악성 앱이 태블릿에서 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"앱이 브로드캐스트가 끝난 후에 남은 브로드캐스트를 보낼 수 있도록 허용합니다. 이 경우 악성 앱이 휴대전화에서 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"연락처 데이터 읽기"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"특정인과 전화, 이메일 또는 기타 수단으로 연락한 빈도를 포함하여 내 태블릿에 저장된 연락처에 대한 모든 데이터를 앱이 읽도록 허용합니다. 이렇게 하면 이메일 주소 자동완성과 기타 편리한 기능을 사용할 수 있습니다. 한편 악성 앱이 이를 악용하여 내 연락처 데이터를 다른 사람에게 전송할 수 있습니다."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"특정인과 전화, 이메일 또는 기타 수단으로 연락한 빈도를 포함하여 내 휴대전화에 저장된 연락처에 대한 모든 데이터를 앱이 읽도록 허용합니다. 이렇게 하면 이메일 주소 자동완성과 기타 편리한 기능을 사용할 수 있습니다. 한편 악성 앱이 이를 악용하여 내 연락처 데이터를 다른 사람에게 전송할 수 있습니다."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"연락처 데이터 작성"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"특정인과 전화, 이메일 또는 기타 수단으로 연락한 빈도를 포함하여 내 휴대전화에 저장된 연락처에 대한 모든 데이터를 앱이 수정하도록 허용합니다. 이렇게 하면 이메일 주소 자동완성과 기타 편리한 기능을 사용할 수 있습니다. 한편 악성 앱이 이를 악용하여 내 연락처 데이터를 삭제 또는 수정할 수 있습니다."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"특정인과 전화, 이메일 또는 기타 수단으로 연락한 빈도를 포함하여 내 휴대전화에 저장된 연락처에 대한 모든 데이터를 앱이 수정하도록 허용합니다. 이렇게 하면 이메일 주소 자동완성과 기타 편리한 기능을 사용할 수 있습니다. 한편 악성 앱이 이를 악용하여 내 연락처 데이터를 삭제 또는 수정할 수 있습니다."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"통화 기록 읽기"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"앱에서 수신 및 발신 통화 데이터를 포함하여 태블릿의 통화 기록을 읽을 수 있도록 허용합니다. 이 경우 악성 앱이 데이터를 다른 사용자에게 보낼 수 있습니다."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"앱에서 수신 및 발신 통화 데이터를 포함하여 휴대전화의 통화 기록을 읽을 수 있도록 허용합니다. 이 경우 악성 앱이 데이터를 다른 사용자에게 보낼 수 있습니다."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"특성"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"단어"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"링크"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"선"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="AMPM">%P</xliff:g> <xliff:g id="HOUR">%-l</xliff:g>시"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="AMPM">%p</xliff:g> <xliff:g id="HOUR">%-l</xliff:g>시"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"출고 테스트 불합격"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 8be0aa2..fa379fb 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetinio kompiuterio veikimas bus sustabdytas."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonas bus išjungtas."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ar norite išjungti?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Iš naujo įkelti operacinę sistemą saugos režimu"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Ar norite iš naujo įkelti operacinę sistemą saugos režimu? Dėl to bus neleidžiamos visos įdiegtos trečiųjų šalių programos. Jos bus atkurtos dar kartą iš naujo įkėlus operacinę sistemą."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Naujos"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nėra naujausių programų."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Planšetinio kompiuterio parinktys"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Leidžiama programai gauti ir apdoroti WAP pranešimus. Kenkėjiškos programos gali stebėti jūsų pranešimus ar ištrinti juos neparodydamos jų jums."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"nuskaityti vykdomas programas"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Leidžiama programai nuskaityti informaciją apie šiuo ir paskutiniu metu vykdomas užduotis. Kenkėjiškos programos gali atrasti privačios informacijos apie kitas programas."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"nuskaityti veikiančių programų išsamią informaciją"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Leidžiama programai nuskaityti išsamią informaciją apie šiuo ir pastaruoju metu vykdomas užduotis. Kenkėjiškos programos gali atrasti privačios informacijos apie kitas programas."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"pertvarkyti vykdomas programas"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Leidžiama programai užduotis perkelti į priekinį planą ir į foną. Kenkėjiškos programos gali priverstinai persikelti į priekį be jūsų įsikišimo."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"sustabdyti vykdomas programas"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Leidžiama programai siųsti užsifiksuojančias transliacijas, kurios išlieka pasibaigus transliacijai. Kenkėjiškos programos gali sulėtinti planšetinį kompiuterį ar padaryti jį nestabilų versdamos naudoti per daug atminties."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Leidžiama programai siųsti užsifiksuojančias transliacijas, kurios išlieka pasibaigus transliacijai. Kenkėjiškos programos gali sulėtinti telefoną ar padaryti jį nestabilų versdamos jį naudoti per daug atminties."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"skaityti adresato duomenis"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Leidžiama programai perskaityti visus planšetiniame kompiuteryje saugomus duomenis apie kontaktus, įskaitant informaciją apie tai, kaip dažnai skambinote, rašėte el. laiškus ar kitais būdais bendravote su konkrečiais asmenimis. Tai naudinga naudojant automatinio el. pašto adresų užbaigimo ir kitas patogias funkcijas. Kenkėjiškos programos gali panaudoti šį leidimą, kad siųstų jūsų kontaktinius duomenis kitiems asmenims."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Leidžiama programai perskaityti visus telefone saugomus duomenis apie kontaktus, įskaitant informaciją apie tai, kaip dažnai skambinote, rašėte el. laiškus ar kitais būdais bendravote su konkrečiais asmenimis. Tai naudinga naudojant automatinio el. pašto adresų užbaigimo ir kitas patogias funkcijas. Kenkėjiškos programos gali panaudoti šį leidimą, kad siųstų jūsų kontaktinius duomenis kitiems asmenims."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"rašyti adresatų duomenis"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Leidžiama programai keisti planšetiniame kompiuteryje saugomus duomenis apie kontaktus, įskaitant informaciją apie tai, kaip dažnai skambinote, rašėte el. laiškus ar kitais būdais bendravote su konkrečiais asmenimis. Tai naudinga naudojant automatinio el. pašto adresų užbaigimo ir kitas patogias funkcijas. Kenkėjiškos programos gali tuo pasinaudoti, kad ištrintų arba pakeistų jūsų kontaktinius duomenis."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Leidžiama programai keisti telefone saugomus duomenis apie kontaktus, įskaitant informaciją apie tai, kaip dažnai skambinote, rašėte el. laiškus ar kitais būdais bendravote su konkrečiais asmenimis. Tai naudinga naudojant automatinio el. pašto adresų užbaigimo ir kitas patogias funkcijas. Kenkėjiškos programos gali tuo pasinaudoti, kad ištrintų arba pakeistų jūsų kontaktinius duomenis."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"skaityti skambučių žurnalą"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Programai leidžiama skaityti planšetinio kompiuterio skambučių žurnalą, įskaitant duomenis apie gaunamus ir siunčiamus skambučius. Kenkėjiškos programos tai gali naudoti, kad išsiųstų jūsų duomenis kitiems žmonėms."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Programai leidžiama skaityti telefono skambučių žurnalą, įskaitant duomenis apie gaunamus ir siunčiamus skambučius. Kenkėjiškos programos tai gali naudoti, kad išsiųstų jūsų duomenis kitiems žmonėms."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"simbolis"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"žodis"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"nuoroda"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"eilutė"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Gamyklos bandymas nepavyko"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 95a1089..6d21773 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Planšetdators tiks beidzēts."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Tālrunis tiks izslēgts."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vai vēlaties izslēgt?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Atsāknēšana drošajā režīmā"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Vai vēlaties veikt atsāknēšanu drošajā režīmā? Tādējādi tiks atspējotas visas instalētās trešo pušu lietojumprogrammas. To darbība tiks atjaunota, kad vēlreiz veiksiet atsāknēšanu."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nesens"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nav nesen izmantotu lietotņu."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Planšetdatora opcijas"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Ļauj lietotnei saņemt un apstrādāt WAP ziņojumus. Ļaunprātīgas lietotnes var pārraudzīt vai dzēst šos ziņojumus, neparādot tos jums."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"izgūt izmantotās lietotnes"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Ļauj lietotnei izgūt informāciju par šobrīd un nesen veiktajiem uzdevumiem. Ļaunprātīgas lietotnes var atklāt privātu informāciju par citām lietotnēm."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"Informācijas izguve par izmantotajām lietotnēm"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Ļauj lietotnei izgūt informāciju par šobrīd un nesen veiktajiem uzdevumiem. Ļaunprātīgas lietotnes var atklāt privātu informāciju par citām lietotnēm."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"pārkārtot izmantotās lietotnes"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Ļauj lietotnei pārvietot uzdevumus priekšplānā un fonā. Ļaunprātīgas lietotnes var tikt izvirzītas priekšplānā bez jūsu vadības."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"apturēt izmantoto lietotņu darbību"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Ļauj lietotnei sūtīt piesaistošas apraides, kas tiek saglabātas pēc apraides pabeigšanas. Ļaunprātīgas lietotnes var palēnināt planšetdatora darbību vai padarīt tā darbību nestabilu, liekot izmantot pārāk daudz atmiņas."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Ļauj lietotnei sūtīt piesaistošas apraides, kas tiek saglabātas pēc apraides pabeigšanas. Ļaunprātīgas lietotnes var palēnināt tālruņa darbību vai padarīt tā darbību nestabilu, liekot izmantot pārāk daudz atmiņas."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lasīt kontaktpersonu datus"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Ļauj lietotnei lasīt visus planšetdatorā saglabāto kontaktpersonu datus, tostarp datus par to, cik bieži esat zvanījis vai sūtījis e-pasta ziņojumus noteiktām personām vai citādi sazinājies ar šīm personām. Šī atļauja tiek izmantota e-pasta adrešu automātiskajai pabeigšanai un citām ērtām funkcijām. Ļaunprātīgas lietotnes var izmantot šo atļauju, lai sūtītu jūsu kontaktpersonu datus citām personām."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Ļauj lietotnei lasīt visus tālrunī saglabāto kontaktpersonu datus, tostarp datus par to, cik bieži esat zvanījis vai sūtījis e-pasta ziņojumus noteiktām personām vai citādi sazinājies ar šīm personām. Šī atļauja tiek izmantota e-pasta adrešu automātiskajai pabeigšanai un citām ērtām funkcijām. Ļaunprātīgas lietotnes var izmantot šo atļauju, lai sūtītu jūsu kontaktpersonu datus citām personām."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"rakstīt kontaktpersonu datus"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Ļauj lietotnei pārveidot planšetdatorā saglabāto kontaktpersonu datus, tostarp datus par to, cik bieži esat zvanījis vai sūtījis e-pasta ziņojumus noteiktām personām vai citādi sazinājies ar šīm personām. Šī atļauja tiek izmantota e-pasta adrešu automātiskajai pabeigšanai un citām ērtām funkcijām. Ļaunprātīgas lietotnes var izmantot šo atļauju, lai dzēstu vai pārveidotu jūsu kontaktpersonu datus."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Ļauj lietotnei pārveidot tālrunī saglabāto kontaktpersonu datus, tostarp datus par to, cik bieži esat zvanījis vai sūtījis e-pasta ziņojumus noteiktām personām vai citādi sazinājies ar šīm personām. Šī atļauja tiek izmantota e-pasta adrešu automātiskajai pabeigšanai un citām ērtām funkcijām. Ļaunprātīgas lietotnes var izmantot šo atļauju, lai dzēstu vai pārveidotu jūsu kontaktpersonu datus."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"nolasīt zvanu žurnālu"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Ļauj lietotnei nolasīt planšetdatora zvanu žurnālu, tostarp ienākošo un izejošo zvanu datus. Ļaunprātīgas lietotnes var to izmantot, lai sūtītu jūsu datus citām personām."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Ļauj lietotnei nolasīt tālruņa zvanu žurnālu, tostarp ienākošo un izejošo zvanu datus. Ļaunprātīgas lietotnes var to izmantot, lai sūtītu jūsu datus citām personām."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"rakstzīme"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"vārds"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"saite"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"rindiņa"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> (<xliff:g id="AMPM">%P</xliff:g>)"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> (<xliff:g id="AMPM">%p</xliff:g>)"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Rūpnīcas pārbaude neizdevās"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index c103a5c..40735433 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet anda akan dimatikan."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon anda akan dimatikan."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Adakah anda mahu menutup?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"But semula ke mod selamat"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Adakah anda mahu membut semula ke dalam mod selamat? Ini akan melumpuhkan semua aplikasi pihak ketiga yang telah anda pasang. Semua aplikasi itu akan dipulihkan semula apabila anda membut semula."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Baru-baru ini"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Tiada apl terbaharu"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Pilihan tablet"</string>
@@ -219,6 +217,10 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Membenarkan apl untuk menerima dan memproses mesej WAP. Apl hasad boleh memantau mesej anda atau memadamnya tanpa menunjukkannya kepada anda."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"dapatkan semula apl yang sedang dijalankan"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Membenarkan apl untuk mendapatkan maklumat tugasan yang sedang dan baru berjalan. Apl hasad boleh mendapat maklumat peribadi tentang apl lain."</string>
+    <!-- no translation found for permlab_getDetailedTasks (6229468674753529501) -->
+    <skip />
+    <!-- no translation found for permdesc_getDetailedTasks (153824741440717599) -->
+    <skip />
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"susun semula tertib apl yang dijalankan"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Membenarkan apl untuk memindahkan tugasan ke latar depan dan latar belakang. Apl hasad boleh memaksa diri mereka ke hadapan tanpa kawalan anda."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"hentikan apl yang sedang dijalankan"</string>
@@ -342,15 +344,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Membolehkan apl untuk menghantar siaran melekit, yang kekal selepas siaran berakhir. Apl hasad boleh membuat tablet perlahan atau tidak stabil dengan menyebabkannya menggunakan memori yang terlalu banyak."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Membolehkan apl untuk menghantar siaran melekit, yang kekal selepas siaran berakhir. Apl hasad boleh membuat telefon perlahan atau tidak stabil dengan menyebabkannya menggunakan memori yang terlalu banyak."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"baca data kenalan"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Membenarkan apl membaca semua data tentang kenalan anda yang disimpan pada tablet anda, termasuk kekerapan anda memanggil, menghantar e-mel atau berkomunikasi dengan cara yang lain dengan individu tertentu. Ini membantu auto-pelengkapan alamat e-mel dan ciri mudah lain. Apl hasad boleh menggunakan kebenaran ini untuk menghantar data kenalan anda kepada orang lain."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Membenarkan apl membaca semua data tentang kenalan anda yang disimpan pada telefon anda, termasuk kekerapan anda memanggil, menghantar e-mel atau berkomunikasi dengan cara yang lain dengan individu tertentu. Ini membantu auto-pelengkapan alamat e-mel dan ciri mudah lain. Apl hasad boleh menggunakan kebenaran ini untuk menghantar data kenalan anda kepada orang lain."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"tulis data kenalan"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Membolehkan aplikasi untuk mengubah suai data mengenai kenalan anda yang disimpan pada tablet anda, termasuk kekerapan yang anda telah dipanggil, mel, atau disampaikan dengan cara yang lain dengan individu-individu tertentu. Ini membantu dengan auto siap-alamat e-mel dan lain-lain ciri-ciri mudah. Aplikasi berniat jahat boleh menggunakan ini untuk memadam atau mengubah suai data kenalan anda."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Membenarkan apl mengubah suai data tentang kenalan anda yang disimpan pada telefon anda, termasuk kekerapan anda memanggil, menghantar e-mel atau berkomunikasi dengan cara yang lain dengan individu tertentu. Ini membantu auto-pelengkapan alamat e-mel dan ciri mudah lain. Apl hasad boleh menggunakan kebenaran ini untuk memadam atau mengubah suai data kenalan anda."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"baca log panggilan"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Membenarkan apl membaca log panggilan tablet anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk menghantar data anda kepada orang lain."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Membenarkan apl membaca log panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk menghantar data anda kepada orang lain."</string>
@@ -746,14 +744,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"watak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"perkataan"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"pautan"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"baris"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Ujian kilang gagal"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index f3854d1..e6af9e8 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Lar appen motta og behandle WAP-meldinger. Ondsinnede apper kan overvåke meldingene dine eller slette dem uten å vise dem til deg."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"hente apper som kjører"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Lar appen hente ut informasjon om oppgaver som kjører eller nylig har kjørt. Ondsinnede apper kan bruke dette til å oppdage privat informasjon om andre apper."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"hente informasjon om apper som kjører"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tillat at appen henter ut informasjon om oppgaver som kjører eller nylig har kjørt. Skadelige apper kan bruke dette til å oppdage privat informasjon om andre apper."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"Endre rekkefølge på apper som kjører"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Lar appen flytte oppgaver til forgrunnen eller bakgrunnen. Ondsinnede apper kan tvinge seg frem til forgrunnen utenfor din kontroll."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"avslutte apper som kjører"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Lar appen sende hengende kringkastinger («sticky broadcasts») som blir værende etter at kringkastingen er over. Ondsinnede apper kan gjøre nettbrettet tregt eller ustabilt ved å bruke for mye minne."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Lar appen sende hengende kringkastinger («sticky broadcasts») som blir værende etter at kringkastingen er over. Ondsinnede apper kan gjøre telefonen treg eller ustabil ved å bruke for mye minne."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"lese kontaktinformasjon"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Tillat at appen kan lese alle opplysningene om kontaktene lagret på nettbrettet ditt – inkludert hvor ofte du har ringt, sendt e-post til eller på andre måter kommunisert med spesifikke individer. Dette muliggjør autofullføring av e-postadresser og andre praktiske funksjoner. Skadelige apper kan bruke denne tillatelsen til å sende kontaktopplysningene dine til andre."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Tillat at appen kan lese alle opplysningene om kontaktene lagret på telefonen din – inkludert hvor ofte du har ringt, sendt e-post til eller på andre måter kommunisert med spesifikke individer. Dette muliggjør autofullføring av e-postadresser og andre praktiske funksjoner. Skadelige apper kan bruke denne tillatelsen til å sende kontaktopplysningene dine til andre."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"skrive kontaktinformasjon"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Tillat at appen kan endre opplysningene om kontaktene lagret på nettbrettet – inkludert hvor ofte du har ringt, sendt e-post til eller på andre måter kommunisert med spesifikke individer. Dette muliggjør autofullføring av e-postadresser og andre praktiske funksjoner. Skadelige apper kan bruke denne tillatelsen til å slette eller endre kontaktopplysningene dine."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Tillat at appen kan endre opplysningene om kontaktene lagret på telefonen din – inkludert hvor ofte du har ringt, sendt e-post til eller på andre måter kommunisert med spesifikke individer. Dette muliggjør autofullføring av e-postadresser og andre praktiske funksjoner. Skadelige apper kan bruke denne tillatelsen til å slette eller endre kontaktopplysningene dine."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"lar appen lese anropsloggen"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Lar appen lese nettbrettets samtalelogg, inkludert data om innkommende og utgående anrop. Skadelige apper kan utnytte denne tillatelsen til å sende dataene dine til andre personer."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Lar appen lese telefonens samtalelogg, inkludert data om innkommende og utgående anrop. Skadelige apper kan utnytte denne tillatelsen til å sende dataene dine til andre personer."</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 65bc6b0..226ed98 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -202,7 +202,7 @@
     <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"noodberichten ontvangen"</string>
     <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Hiermee kan de app berichten over noodsituaties ontvangen en verwerken. Deze rechten zijn alleen beschikbaar voor systeemapps."</string>
     <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"infodienstberichten lezen"</string>
-    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Toestaan dat de app infodienstberichten leest die worden ontvangen op uw apparaat. Infodienstmeldingen worden verzonden naar bepaalde locaties om u te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van uw apparaat verstoren wanneer een infodienstbericht wordt ontvangen."</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Toestaan dat de app infodienstberichten leest die worden ontvangen op uw apparaat. Infodienstberichten worden verzonden naar bepaalde locaties om u te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van uw apparaat verstoren wanneer een infodienstbericht wordt ontvangen."</string>
     <string name="permlab_sendSms" msgid="5600830612147671529">"SMS-berichten verzenden"</string>
     <string name="permdesc_sendSms" msgid="906546667507626156">"Hiermee kan de app sms\'jes verzenden. Schadelijke apps kunnen u geld kosten door zonder uw toestemming berichten te verzenden."</string>
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"zonder toestemming sms\'jes verzenden"</string>
@@ -217,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Hiermee kan de app WAP-berichten ontvangen en verwerken. Schadelijke apps kunnen uw berichten bijhouden of deze verwijderen zonder dat u ze te zien krijgt."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"actieve apps ophalen"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Hiermee kan de app informatie over huidige en recent uitgevoerde taken ophalen. Schadelijke apps kunnen op deze manier mogelijk privé-informatie over andere apps achterhalen."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"details van actieve apps ophalen"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Hiermee kan de app gedetailleerde informatie over huidige en recent uitgevoerde taken ophalen. Schadelijke apps kunnen op deze manier mogelijk privé-informatie over andere apps achterhalen."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"actieve apps opnieuw rangschikken"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Hiermee kan de app taken naar de voor- en achtergrond verplaatsen. Schadelijke apps kunnen zichzelf op de voorgrond plaatsen zonder dat u hier iets aan kunt doen."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"actieve apps stoppen"</string>
@@ -340,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Hiermee kan de app sticky broadcasts verzenden die behouden blijven nadat de broadcast is beëindigd. Schadelijke apps kunnen hiermee de tablet traag of instabiel maken door ervoor te zorgen dat er te veel geheugenruimte wordt gebruikt."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Hiermee kan de app sticky broadcasts verzenden die behouden blijven nadat de broadcast is beëindigd. Schadelijke apps kunnen hiermee de telefoon traag of instabiel maken door ervoor te zorgen dat er te veel geheugenruimte wordt gebruikt."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"contactgegevens lezen"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Hiermee kan de app alle gegevens lezen over contacten die zijn opgeslagen op uw tablet, met inbegrip van de frequentie waarmee u heeft gebeld, e-mails heeft verzonden, of op andere wijze heeft gecommuniceerd met bepaalde personen. Dit helpt bij het automatisch aanvullen van e-mailadressen en andere handige functies. Schadelijke apps kunnen deze toestemming gebruiken om uw contactgegevens naar andere mensen te verzenden."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Hiermee kan de app alle gegevens lezen over contacten die zijn opgeslagen op uw telefoon, met inbegrip van de frequentie waarmee u heeft gebeld, e-mails heeft verzonden, of op andere wijze heeft gecommuniceerd met bepaalde personen. Dit helpt bij het automatisch aanvullen van e-mailadressen en andere handige functies. Schadelijke apps kunnen deze toestemming gebruiken om uw contactgegevens naar andere mensen te verzenden."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"contactgegevens schrijven"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Hiermee kan de app gegevens wijzigen van contacten die zijn opgeslagen op uw tablet, met inbegrip van de frequentie waarmee u heeft gebeld, e-mails heeft verzonden, of op andere wijze heeft gecommuniceerd met bepaalde personen. Dit helpt bij het automatisch aanvullen van e-mailadressen en andere handige functies. Schadelijke apps kunnen deze toestemming gebruiken om uw contactgegevens naar andere mensen te verzenden."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Hiermee kan de app gegevens wijzigen van contacten die zijn opgeslagen op uw telefoon, met inbegrip van de frequentie waarmee u heeft gebeld, e-mails heeft verzonden, of op andere wijze heeft gecommuniceerd met bepaalde personen. Dit helpt bij het automatisch aanvullen van e-mailadressen en andere handige functies. Schadelijke apps kunnen deze toestemming gebruiken om uw contactgegevens naar andere mensen te verzenden."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"oproeplogboek lezen"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Toestaan dat de app het oproeplogboek van uw tablet leest, waaronder gegevens over inkomende en uitgaande oproepen. Schadelijke apps kunnen hiermee uw gegevens naar andere personen verzenden."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Toestaan dat de app het oproeplogboek van uw telefoon leest, waaronder gegevens over inkomende en uitgaande oproepen. Schadelijke apps kunnen hiermee uw gegevens naar andere personen verzenden."</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c499707..5b0a70d 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablet zostanie wyłączony."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon zostanie wyłączony"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Czy chcesz wyłączyć?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Uruchom w trybie awaryjnym"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Chcesz uruchomić urządzenie w trybie awaryjnym? W ten sposób wyłączysz wszystkie zainstalowane aplikacje innych firm. Zostaną one przywrócone po ponownym uruchomieniu."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Najnowsze"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Brak ostatnio uruchomionych aplikacji."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opcje tabletu"</string>
@@ -219,6 +217,10 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Pozwala aplikacji na odbieranie i przetwarzanie wiadomości WAP. Złośliwe aplikacje mogą monitorować wiadomości lub usuwać je, zanim zostaną wyświetlone."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"pobieranie uruchomionych aplikacji"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Pozwala aplikacji na pobieranie informacji na temat obecnie i ostatnio uruchomionych zadań. Złośliwe aplikacje mogą uzyskać dostęp do prywatnych informacji na temat innych aplikacji."</string>
+    <!-- no translation found for permlab_getDetailedTasks (6229468674753529501) -->
+    <skip />
+    <!-- no translation found for permdesc_getDetailedTasks (153824741440717599) -->
+    <skip />
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"zmienianie kolejności uruchomionych aplikacji"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Pozwala aplikacji na przenoszenie zadań między tłem i pierwszym planem. Złośliwe aplikacje mogą wymusić przeniesienie się na pierwszy plan bez Twojego udziału."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"zatrzymywanie uruchomionych aplikacji"</string>
@@ -746,14 +748,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"znak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"słowo"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"wiersz"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Nieudany test fabryczny"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 4ce6c3d..e517f51 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"O seu tablet irá encerrar."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone irá encerrar."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Pretende encerrar?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar no modo de segurança"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Pretende reiniciar no modo de segurança? Isso irá desativar todas as aplicações de terceiros instaladas. Estas serão restauradas quando reiniciar novamente."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Não existem aplicações recentes"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opções do tablet"</string>
@@ -219,6 +217,10 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permite que a aplicação receba e processe mensagens WAP. As aplicações maliciosas podem monitorizar as mensagens ou eliminá-las sem mostrá-las ao utilizador."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"obter aplicações em execução"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permite à aplicação recuperar informações sobre tarefas atualmente em execução ou que foram recentemente executadas. As aplicações maliciosas poderão descrobrir informações privadas de outras aplicações."</string>
+    <!-- no translation found for permlab_getDetailedTasks (6229468674753529501) -->
+    <skip />
+    <!-- no translation found for permdesc_getDetailedTasks (153824741440717599) -->
+    <skip />
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"reordenar as aplicações em execução"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permite à aplicação mover tarefas para primeiro e segundo plano. As aplicações maliciosas podem impor-se em primeiro plano sem o controlo do utilizador."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"parar aplicações em execução"</string>
@@ -342,15 +344,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permite que uma aplicação envie difusões fixas, que permanecem após o fim da difusão. As aplicações maliciosas podem tornar o tablet lento ou instável, fazendo com que utilize demasiada memória."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permite que a aplicação envie difusões fixas, que permanecem após o fim da difusão. As aplicações maliciosas podem tornar o telemóvel lento ou instável, fazendo com que utilize demasiada memória."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"ler dados de contacto"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permite que a aplicação leia todos os dados sobre os seus contactos armazenados no seu tablet, incluindo a frequência com que ligou, enviou emails ou comunicou de outras formas com indivíduos específicos. Isto ajuda a preencher automaticamente os endereços de email e outras funcionalidades convenientes. As aplicações maliciosas podem utilizar esta permissão para enviar os seus dados de contacto a outras pessoas."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permite que a aplicação leia todos os dados sobre os seus contactos armazenados no seu telemóvel, incluindo a frequência com que ligou, enviou emails ou comunicou de outras formas com indivíduos específicos. Isto ajuda a preencher automaticamente os endereços de email e outras funcionalidades convenientes. As aplicações maliciosas podem utilizar esta permissão para enviar os seus dados de contacto a outras pessoas."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"escrever dados de contacto"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permite que a aplicação modifique os dados sobre os seus contactos armazenados no seu tablet, incluindo a frequência com que ligou, enviou emails ou comunicou de outras formas com indivíduos específicos. Isto ajuda a preencher automaticamente os endereços de email e outras funcionalidades convenientes. As aplicações maliciosas podem utilizar esta situação para apagar ou modificar os seus dados de contacto."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permite que a aplicação modifique os dados sobre os seus contactos armazenados no seu telemóvel, incluindo a frequência com que ligou, enviou emails ou comunicou de outras formas com indivíduos específicos. Isto ajuda a preencher automaticamente os endereços de email e outras funcionalidades convenientes. As aplicações maliciosas podem utilizar esta situação para apagar ou modificar os seus dados de contacto."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"ler registo de chamadas"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite à aplicação ler o registo de chamadas do tablet, incluindo os dados sobre as chamadas recebidas e efetuadas. As aplicações maliciosas podem utilizar esta funcionalidade para enviar os seus dados para outras pessoas."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que a aplicação leia o registo de chamadas do telemóvel, incluindo os dados sobre as chamadas recebidas e efetuadas. As aplicações maliciosas podem utilizar esta funcionalidade para enviar os seus dados para outras pessoas."</string>
@@ -746,14 +744,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"carácter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"palavra"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"linha"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"O teste de fábrica falhou"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f70370c..0304408 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Seu tablet será desligado."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone será desligado."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Deseja desligar?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar no modo de segurança"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Deseja reiniciar no modo de segurança? Isso desativará todos os aplicativos de terceiros instalados. Eles serão restaurados quando você reiniciar novamente."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nenhum aplicativo recente"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opções do tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permite que o aplicativo receba e processe mensagens WAP. Aplicativos maliciosos podem monitorar suas mensagens ou excluí-las sem mostrá-las para você."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicativos em execução"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permite que o aplicativo recupere informações sobre atualmente tarefas executadas recentemente e tarefas em execução. Aplicativos maliciosos podem descobrir informações particulares de outros aplicativos."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recuperar detalhes dos aplicativos em execução"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite que o aplicativo recupere informações detalhadas sobre tarefas executadas atual e recentemente. Aplicativos maliciosos podem descobrir informações privadas sobre outros aplicativos."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"reordenar os aplicativos em execução"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permite que o aplicativo mova tarefas para o primeiro plano e para o plano de fundo. Aplicativos maliciosos podem forçar-se para a primeiro plano sem que você tenha controle sobre a ação."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"parar os aplicativos em execução"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permite que o aplicativo envie transmissões fixas, que permaneçam depois que a transmissão terminar. Aplicativos maliciosos podem desacelerar ou desestabilizar o tablet, fazendo com que ele utilize muita memória."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permite que o aplicativo envie transmissões fixas, que permanecem depois que a transmissão termina. Aplicativos maliciosos podem deixar o telefone lento ou instável, fazendo com que ele use muita memória."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"ler dados do contato"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permite que o aplicativo leia todos os dados sobre os contatos armazenados em seu tablet, incluindo a frequência com que você ligou, enviou e-mails ou se comunicou de outras maneiras com cada um. Isso ajuda no preenchimento automático dos endereços de e-mail e em outros recursos práticos. Aplicativos maliciosos podem usar esta permissão para enviar seus dados de contato para outras pessoas."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permite que o aplicativo leia todos os dados sobre os contatos armazenados em seu telefone, incluindo a frequência com que você ligou, enviou e-mails ou se comunicou de outras maneiras com cada um. Isso ajuda no preenchimento automático dos endereços de e-mail e em outros recursos práticos. Aplicativos maliciosos podem usar esta permissão para enviar seus dados de contato para outras pessoas."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"gravar dados de contato"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permite que o aplicativo leia todos os dados sobre os contatos armazenados em seu tablet, incluindo a frequência com que você ligou, enviou e-mails ou se comunicou de outras maneiras com cada um. Isso ajuda no preenchimento automático dos endereços de e-mail e em outros recursos práticos. Aplicativos maliciosos podem usar esta permissão para apagar ou modificar seus dados de contato."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permite que o aplicativo modifique todos os dados sobre os contatos armazenados em seu telefone, incluindo a frequência com que você ligou, enviou e-mails ou se comunicou de outras maneiras com cada um. Isso ajuda no preenchimento automático dos endereços de e-mail e em outros recursos práticos. Aplicativos maliciosos podem usar esta permissão para apagar ou modificar seus dados de contato."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"ler registro de chamadas"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite que o aplicativo leia o registro de chamadas de seu tablet, incluindo dados sobre chamadas recebidas e efetuadas. Aplicativos maliciosos podem usar esta permissão para enviar seus dados para outras pessoas."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que o aplicativo leia o registro de chamadas de seu telefone, incluindo dados sobre chamadas recebidas e efetuadas. Aplicativos maliciosos podem usar esta permissão para enviar seus dados para outras pessoas."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"caractere"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"palavra"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"linha"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Falha no teste de fábrica"</string>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index a4ffc42..954fe5f 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -283,6 +283,10 @@
     <skip />
     <!-- no translation found for permdesc_getTasks (6608159250520381359) -->
     <skip />
+    <!-- no translation found for permlab_getDetailedTasks (6229468674753529501) -->
+    <skip />
+    <!-- no translation found for permdesc_getDetailedTasks (153824741440717599) -->
+    <skip />
     <!-- no translation found for permlab_reorderTasks (2018575526934422779) -->
     <skip />
     <!-- no translation found for permdesc_reorderTasks (4175137612205663399) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b41940e..1633437 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Computerul dvs. tablet PC se va închide."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonul dvs. se va închide."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Doriţi să închideţi?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reporniţi în modul sigur"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Doriţi să reporniţi în modul sigur? Astfel vor fi dezactivate toate aplicaţiile terţă parte pe care le-aţi instalat. Acestea vor fi restabilite când reporniţi din nou."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Nu există aplicaţii recente."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Opţiuni tablet PC"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Permite aplicaţiei să primească şi să proceseze mesaje WAP. Aplicaţiile rău intenţionate pot să monitorizeze mesajele sau să le şteargă fără să vi le arate."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"preluare aplicaţii care rulează"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Permite aplicaţiei să preia informaţii despre activităţile rulate curent şi recent. Aplicaţiile rău intenţionate pot să descopere informaţii private despre alte aplicaţii."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"preia detalii despre aplicaţiile care rulează"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite aplicaţiei să preia informaţii detaliate despre activităţile rulate curent şi recent. Aplicaţiile rău intenţionate pot să descopere informaţii private despre alte aplicaţii."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"reordonare aplicaţii care rulează"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Permite aplicaţiei să mute activităţile în prim-plan şi în fundal. Aplicaţiile rău intenţionate pot să apară forţat în prim-plan, fără ca dvs. să puteţi controla acest lucru."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"oprire aplicaţii care rulează"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Permite aplicaţiei să trimită mesaje difuzate persistente, care rămân după terminarea mesajului difuzat. Aplicaţiile rău intenţionate pot să încetinească sau să destabilizeze tableta, determinând-o să utilizeze prea multă memorie."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Permite aplicaţiei să trimită mesaje difuzate persistente, care rămân după terminarea mesajului difuzat. Aplicaţiile rău intenţionate pot să încetinească sau să destabilizeze telefonul, determinându-l să utilizeze prea multă memorie."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"citire date de contact"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Permite aplicaţiei să citească toate datele despre persoanele de contact stocate pe tabletă, inclusiv frecvenţa cu care aţi apelat, aţi trimis mesaje de e-mail către sau aţi comunicat în alte moduri cu anumite persoane. Acest lucru permite completarea automată a adreselor de e-mail, precum şi alte funcţii care vă uşurează utilizarea. Aplicaţiile rău intenţionate pot folosi această permisiune pentru a trimite datele dvs. de contact altor persoane."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Permite aplicaţiei să citească toate datele despre persoanele de contact stocate pe telefon, inclusiv frecvenţa cu care aţi apelat, aţi trimis mesaje de e-mail către sau aţi comunicat în alte moduri cu anumite persoane. Acest lucru permite completarea automată a adreselor de e-mail, precum şi alte funcţii care vă uşurează utilizarea. Aplicaţiile rău intenţionate pot folosi această permisiune pentru a trimite datele dvs. de contact altor persoane."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"scriere date de contact"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Permite aplicaţiei să modifice datele despre persoanele de contact stocate pe tabletă, inclusiv frecvenţa cu care aţi apelat, aţi trimis mesaje de e-mail către sau aţi comunicat în alte moduri cu anumite persoane. Acest lucru permite completarea automată a adreselor de e-mail, precum şi alte funcţii care vă uşurează utilizarea. Aplicaţiile rău intenţionate pot folosi această permisiune pentru a şterge sau pentru a modifica datele dvs. de contact."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Permite aplicaţiei să modifice datele despre persoanele de contact stocate pe telefon, inclusiv frecvenţa cu care aţi apelat, aţi trimis mesaje de e-mail către sau aţi comunicat în alte moduri cu anumite persoane. Acest lucru permite completarea automată a adreselor de e-mail, precum şi alte funcţii care vă uşurează utilizarea. Aplicaţiile rău intenţionate pot folosi această permisiune pentru a şterge sau pentru a modifica datele dvs. de contact."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"citeşte jurnalul de apeluri"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite aplicaţiei să citească jurnalul de apeluri al tabletei dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicaţiile rău intenţionate pot utiliza această permisiune pentru a trimite datele dvs. altor persoane."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite aplicaţiei să citească jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicaţiile rău intenţionate pot utiliza această permisiune pentru a trimite datele dvs. altor persoane."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"caracter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"cuvânt"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"rând"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Testarea de fabrică nu a reuşit"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 9f91693..057e9fc 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшетный ПК будет отключен."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефон будет выключен."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Завершить работу?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Переход в безопасный режим"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Перейти в безопасный режим? Все приложения сторонних поставщиков отключатся. Они будут включены по возвращении в обычный режим."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Недавние"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Список пуст"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Настройки планшетного ПК"</string>
@@ -203,8 +201,8 @@
     <string name="permdesc_receiveMms" msgid="1424805308566612086">"Приложение сможет получать и обрабатывать MMS. Вредоносные программы смогут отслеживать и удалять сообщения, не показывая их."</string>
     <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"принимать экстренные вызовы"</string>
     <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Приложение сможет получать и обрабатывать экстренные сообщения рассылок. Это разрешение доступно только для системных приложений."</string>
-    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Читать сообщения рассылки"</string>
-    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Приложение сможет считывать сообщения рассылки, полученные вашим устройством. В ряде стран вам будут приходить уведомления об экстренных ситуациях. В этом случае вредоносные программы могут помешать работе вашего устройства."</string>
+    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Читать сообщения массовой рассылки"</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Приложение получит доступ к сообщениям широковещательных SMS-служб, которые в некоторых странах используются для информирования населения об экстренных ситуациях. Вредоносные программы могут помешать работе устройства, на которое поступают такие сообщения."</string>
     <string name="permlab_sendSms" msgid="5600830612147671529">"отправлять SMS-сообщения"</string>
     <string name="permdesc_sendSms" msgid="906546667507626156">"Приложение сможет отправлять SMS. Вредоносные программы смогут отправлять SMS без вашего подтверждения, что приведет к непредвиденным расходам."</string>
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"отправка SMS без подтверждения"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Приложение сможет получать и обрабатывать WAP-сообщения. Вредоносные программы смогут отслеживать и удалять сообщения, не показывая их."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"получение запущенных приложений"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Приложение сможет получать информацию о недавно запущенных и выполняемых задачах. Вредоносные программы смогут получить личную информацию из других приложений."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"получение сведений о работающих приложениях"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Приложение сможет получать подробные сведения о недавно запущенных и выполняемых задачах. При этом конфиденциальная информация о других приложениях не будет защищена от вредоносных программ."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"изменение порядка запущенных приложений"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Приложение сможет перемещать задачи в режим активного или фонового выполнения. Вредоносные программы смогут переводить себя в активный режим без вашего ведома."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"остановка запущенных приложений"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Приложение сможет отправлять несрочные рассылки, которые не удаляются после их завершения. Вредоносные программы смогут замедлить работу планшетного ПК или сделать ее нестабильной из-за чрезмерного использования памяти."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Приложение сможет делать рассылки типа sticky broadcast. Вредоносные программы смогут замедлить работу телефона или сделать ее нестабильной из-за чрезмерного использования памяти."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"считывать данные контакта"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Приложение сможет читать все данные о контактах на вашем устройстве, включая то, как часто вы звоните, отправляете письма и другими способами связываетесь с определенными людьми. Это поможет автоматически вводить адреса эл. почты и использовать другие удобные функции. Вредоносные приложения могут использовать это разрешение для отправки ваших сведений о контактах другим людям."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Приложение сможет читать все данные о контактах на вашем устройстве, включая то, как часто вы звоните, отправляете письма и другими способами связываетесь с определенными людьми. Это поможет автоматически вводить адреса эл. почты и использовать другие удобные функции. Вредоносные приложения могут использовать это разрешение для отправки ваших сведений о контактах другим людям."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"перезаписывать данные контакта"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Приложение сможет изменять сведения о контактах на вашем устройстве, включая то, как часто вы звоните, отправляете письма и другими способами связываетесь с определенными людьми. Это помогает автоматически вводить адреса эл. почты и использовать другие удобные функции. Вредоносные приложения могут использовать это для удаления или изменения ваших сведений о контактах."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Приложение сможет изменять сведения о контактах на вашем устройстве, включая то, как часто вы звоните, отправляете письма и другими способами связываетесь с определенными людьми. Это помогает автоматически вводить адреса эл. почты и использовать другие удобные функции. Вредоносные приложения могут использовать это для удаления или изменения ваших сведений о контактах."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"чтение журнала вызовов"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Приложение получит доступ к списку вызовов планшетного ПК, включая данные о входящих и исходящих звонках. Вредоносные приложения могут использовать доступ для передачи ваших данных третьим лицам."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Приложение получит доступ к списку вызовов телефона, включая данные о входящих и исходящих звонках. Вредоносные приложения смогут воспользоваться этим, чтобы отправить ваши данные третьим лицам."</string>
@@ -698,7 +694,7 @@
     <string name="lockscreen_plugged_in" msgid="8057762828355572315">"Идет зарядка (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
     <string name="lockscreen_charged" msgid="4938930459620989972">"Батарея заряжена"</string>
     <string name="lockscreen_battery_short" msgid="4477264849386850266">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
-    <string name="lockscreen_low_battery" msgid="1482873981919249740">"Подключите зарядное устройство."</string>
+    <string name="lockscreen_low_battery" msgid="1482873981919249740">"Подключите зарядное устройство"</string>
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Нет SIM-карты"</string>
     <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"SIM-карта не установлена."</string>
     <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"SIM-карта не установлена."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"символ"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"слово"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"ссылка"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"строка"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Не удалось провести стандартный тест"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index d87cdf2..b52a8a7 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Váš tablet bude vypnutý."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Váš telefón bude vypnutý."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Chcete zariadenie vypnúť?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Reštartovať do núdzového režimu"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Chcete zariadenie reštartovať do núdzového režimu? Zakážu sa tým všetky aplikácie tretích strán, ktoré ste nainštalovali. Tieto aplikácie budú obnovené po ďalšom reštartovaní."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Najnovšie"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Žiadne nedávne aplikácie"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabletu"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Umožňuje aplikácii prijímať a spracovávať správy WAP. Škodlivé aplikácie môžu sledovať vaše správy alebo ich odstrániť bez toho, aby ich zobrazili."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"načítať spustené aplikácie"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Umožňuje aplikácii načítať informácie o aktuálnych a nedávno spustených úlohách. Škodlivé aplikácie môžu odhaliť súkromné informácie o iných aplikáciách."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"načítať podrobnosti o spustených aplikáciách"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Umožňuje aplikácii načítať podrobné informácie o aktuálnych a nedávno spustených úlohách. Škodlivé aplikácie môžu odhaliť súkromné informácie o iných aplikáciách."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"zmeniť poradie spustených aplikácií"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Umožňuje aplikácii presúvať úlohy do popredia a pozadia. Škodlivé aplikácie sa môžu pretlačiť do popredia bez vášho vedomia."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"zastaviť spustené aplikácie"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Umožňuje aplikácii odosielať trvalé vysielania, ktoré pretrvávajú aj po skončení vysielania. Škodlivé aplikácie môžu tablet spomaliť alebo spôsobiť jeho nestabilitu, pretože bude používať príliš veľa pamäte."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Umožňuje aplikácii odosielať trvalé vysielania, ktoré pretrvávajú aj po skončení vysielania. Škodlivé aplikácie môžu telefón spomaliť alebo spôsobiť jeho nestabilitu spotrebou príliš veľkého množstva pamäte."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"čítanie údajov kontaktov"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Umožňuje aplikácii čítať všetky údaje o kontaktoch uložených v tablete vrátane toho, ako často voláte, posielate e-maily alebo komunikujete inými spôsobmi s konkrétnymi osobami. Pomáha to pri automatickom dopĺňaní e-mailových adries a ďalších nápomocných funkciách. Škodlivé aplikácie môžu toto povolenie zneužiť na posielanie vašich kontaktných údajov iným ľuďom."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Umožňuje aplikácii čítať všetky údaje o kontaktoch uložených v telefóne vrátane toho, ako často voláte, posielate e-maily alebo komunikujete inými spôsobmi s konkrétnymi osobami. Pomáha to pri automatickom dopĺňaní e-mailových adries a ďalších nápomocných funkciách. Škodlivé aplikácie môžu toto povolenie zneužiť na posielanie vašich kontaktných údajov iným ľuďom."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"zápis údajov kontaktov"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Umožňuje aplikácii upravovať všetky údaje o kontaktoch uložených v tablete vrátane toho, ako často voláte, posielate e-maily alebo komunikujete inými spôsobmi s konkrétnymi osobami. Pomáha to pri automatickom dopĺňaní e-mailových adries a ďalších nápomocných funkciách. Škodlivé aplikácie môžu toto povolenie zneužiť na posielanie vašich kontaktných údajov iným ľuďom."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Umožňuje aplikácii upravovať všetky údaje o kontaktoch uložených v telefóne vrátane toho, ako často voláte, posielate e-maily alebo komunikujete inými spôsobmi s konkrétnymi osobami. Pomáha to pri automatickom dopĺňaní e-mailových adries a ďalších nápomocných funkciách. Škodlivé aplikácie môžu toto povolenie zneužiť na posielanie vašich kontaktných údajov iným ľuďom."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"čítať denník hovorov"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Umožňuje aplikácii čítať denník hovorov vo vašom tablete vrátane údajov o prichádzajúcich a odchádzajúcich hovoroch. Škodlivé aplikácie to môžu zneužiť na odosielanie vašich údajov iným osobám."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Umožňuje aplikácii čítať denník hovorov vo vašom telefóne vrátane údajov o prichádzajúcich a odchádzajúcich hovoroch. Škodlivé aplikácie to môžu zneužiť na odosielanie vašich údajov iným osobám."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"znak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"slovo"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"odkaz"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"riadok"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Továrenský test zlyhal"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 9630b02..5e38ce7 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tablični računalnik se bo zaustavil."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefon bo zaustavljen."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ali želite izklopiti telefon?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Vnovičen zagon v varnem načinu"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Ali želite znova zagnati v varnem načinu? S tem onemogočite vse nameščene aplikacije drugih ponudnikov. Obnovljene bodo pri naslednjem vnovičnem zagonu."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Ni nedavnih programov"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabličnega računalnika"</string>
@@ -203,10 +201,8 @@
     <string name="permdesc_receiveMms" msgid="1424805308566612086">"Programu omogoča prejemanje in obdelavo sporočil MMS. Zlonamerni programi lahko nadzirajo sporočila ali jih brišejo, ne da bi vam jih pokazali."</string>
     <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"prejemanje oddaj v sili"</string>
     <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Programu omogoča prejemanje in obdelavo sporočil za oddajanje v sili. To dovoljenje je na voljo samo sistemskim programom."</string>
-    <!-- no translation found for permlab_readCellBroadcasts (1598328843619646166) -->
-    <skip />
-    <!-- no translation found for permdesc_readCellBroadcasts (6361972776080458979) -->
-    <skip />
+    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"branje sporočil oddaje v celici"</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Omogoča aplikaciji branje sporočil oddaje v celici, ki jih prejme naprava. Opozorila oddaje v celici so dostavljena na nekaterih lokacijah, da vas opozorijo na izredne razmere. Zlonamerne aplikacije lahko vplivajo na delovanje naprave, ko dobi sporočilo oddaje v celici."</string>
     <string name="permlab_sendSms" msgid="5600830612147671529">"pošiljanje sporočil SMS"</string>
     <string name="permdesc_sendSms" msgid="906546667507626156">"Programu omogoča pošiljanje SMS-ov. Zlonamerni programi lahko pošiljajo sporočila brez vaše potrditve, kar vas lahko drago stane."</string>
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"pošiljanje SMS-ov brez potrditve"</string>
@@ -221,14 +217,14 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Programu omogoča prejemanje in obdelavo sporočil WAP. Zlonamerni programi lahko nadzirajo sporočila ali jih brišejo, ne da bi vam jih pokazali."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"dobivanje programov, ki se izvajajo"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Programu omogoča dobivanje informacij o trenutnih in nedavno izvajajočih se opravilih. Zlonamerni programi lahko odkrijejo zasebne podatke o drugih programih."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"prejemanje podrobnosti o aplikacijah, ki se izvajajo"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Aplikaciji omogoča, da dobi podatke o trenutnih in nedavno izvajajočih se opravilih. Zlonamerne aplikacije lahko odkrijejo zasebne podatke o drugih aplikacijah."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"preurejanje programov, ki se izvajajo"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Programu omogoča premikanje opravil v ospredje in ozadje. Zlonamerni programi se lahko brez vašega nadzora vsilijo v ospredje."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"ustavitev programov, ki se izvajajo"</string>
     <string name="permdesc_removeTasks" msgid="1394714352062635493">"Programu omogoča odstranjevanje opravil in zapiranje njihovih programov. Zlonamerni programi lahko motijo delovanje drugih programov."</string>
-    <!-- no translation found for permlab_startAnyActivity (2918768238045206456) -->
-    <skip />
-    <!-- no translation found for permdesc_startAnyActivity (997823695343584001) -->
-    <skip />
+    <string name="permlab_startAnyActivity" msgid="2918768238045206456">"zagon poljubne dejavnosti"</string>
+    <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Omogoča aplikaciji zagon poljubne dejavnosti, ne glede na zaščito dovoljenj ali izvoženo stanje."</string>
     <string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"nastavitev združljivosti zaslona"</string>
     <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Programu omogoča nadzor združljivostnega načina zaslona drugih programov. Zlonamerni programi lahko prekinejo delovanje drugih programov."</string>
     <string name="permlab_setDebugApp" msgid="3022107198686584052">"omogočanje iskanja in odpravljanja napak v programu"</string>
@@ -346,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Programu omogoča hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi zlonamernih programov je lahko delovanje tabličnega računalnika počasno ali nestabilno ali tablični računalnik zaradi njih porabi preveč pomnilnika."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Programu omogoča hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi zlonamernih programov je delovanje telefona lahko počasno ali nestabilno ali tablični računalnik zaradi njih porabi preveč pomnilnika."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"branje podatkov stika"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Aplikaciji omogoča branje vseh podatkov o stikih, shranjenih v tabličnem računalniku, vključno s podatki o pogostosti klicev, e-poštnih sporočil ali drugih komunikacij s posameznimi osebami. To izboljša samodokončanje e-poštnih naslovov in druge priročne funkcije. Zlonamerne aplikacije lahko izrabijo to dovoljenje za pošiljanje podatkov o stikih drugim ljudem."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Aplikaciji omogoča branje vseh podatkov o stikih, shranjenih v telefonu, vključno s podatki o pogostosti klicev, e-poštnih sporočil ali drugih komunikacij s posameznimi osebami. To izboljša samodokončanje e-poštnih naslovov in druge priročne funkcije. Zlonamerne aplikacije lahko izrabijo to dovoljenje za pošiljanje podatkov o stikih drugim ljudem."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"pisanje podatkov stika"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Aplikaciji omogoča spreminjanje podatkov o stikih, shranjenih v tabličnem računalniku, vključno s podatki o pogostosti klicev, e-poštnih sporočil ali drugih komunikacij s posameznimi osebami. To izboljša samodokončanje e-poštnih naslovov in druge priročne funkcije. Zlonamerne aplikacije lahko izrabijo to dovoljenje za brisanje ali spreminjanje podatkov o stikih."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Aplikaciji omogoča spreminjanje podatkov o stikih, shranjenih v telefonu, vključno s podatki o pogostosti klicev, e-poštnih sporočil ali drugih komunikacij s posameznimi osebami. To izboljša samodokončanje e-poštnih naslovov in druge priročne funkcije. Zlonamerne aplikacije lahko izrabijo to dovoljenje za brisanje ali spreminjanje podatkov o stikih."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"branje dnevnika klicev"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Aplikaciji dovoli branje dnevnika klicev v tabličnem računalniku, vključno s podatki o dohodnih in odhodnih klicih. Zlonamerne aplikacije lahko tako pošiljajo vaše podatke drugim."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Aplikaciji dovoli branje dnevnika klicev v telefonu, vključno s podatki o dohodnih in odhodnih klicih. Zlonamerne aplikacije lahko tako pošiljajo vaše podatke drugim."</string>
@@ -750,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"znak"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"beseda"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"povezava"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"vrstica"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Tovarniški preskus ni uspel"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 1fa2f3a..f124e60 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Таблет ће се искључити."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Телефон ће се искључити."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Да ли желите да искључите телефон?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Поново покрени систем у безбедном режиму"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Да ли желите да поново покренете систем у безбедном режиму? Ово ће онемогућити све инсталиране апликације независних произвођача. Оне ће бити враћене када поново покренете систем."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Недавно"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Нема недавних апликација."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Опције за таблет"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Дозвољава апликацији да прима и обрађује WAP поруке. Злонамерне апликације могу да надгледају поруке или да их бришу, а да вам их не прикажу."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"преузимање покренутих апликација"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Дозвољава апликацији да преузима информације о актуелним и недавно покренутим задацима. Злонамерне апликације могу да открију приватне информације о другим апликацијама."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"преузимање детаља о покренутим апликацијама"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Дозвољава апликацији да преузима детаљне информације о актуелним и недавно покренутим задацима. Злонамерне апликације могу да открију приватне информације о другим апликацијама."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"промена редоследа покренутих апликација"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Дозвољава апликацији да премешта задатке у први план и у позадину. Злонамерне апликације могу на тај начин да принудно пређу у први план без ваше контроле."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"заустављање покренутих апликација"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Дозвољава апликацији да шаље пријемчива емитовања, која остају по завршетку емитовања. Злонамерне апликације могу да успоре или дестабилизују таблет тиме што ће га приморати да троши превише меморије."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Дозвољава апликацији да шаље пријемчива емитовања, која остају по завршетку емитовања. Злонамерне апликације могу да успоре или дестабилизују телефон тиме што ће га приморати да троши превише меморије."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"читање података о контактима"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Дозвољава апликацији да чита све податке о контактима ускладиштене на таблету, укључујући податке о томе колико често зовете одређене особе, шаљете им поруке е-поште или на други начин комуницирате са њима. Ово помаже функцији аутоматског довршавања адреса е-поште и другим корисним функцијама. Злонамерне апликације могу да искористе ову дозволу за слање ваших података о контакту другим људима."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Дозвољава апликацији да чита све податке о контактима ускладиштене на телефону, укључујући податке о томе колико често зовете одређене особе, шаљете им поруке е-поште или на други начин комуницирате са њима. Ово помаже функцији аутоматског довршавања адреса е-поште и другим корисним функцијама. Злонамерне апликације могу да искористе ову дозволу за слање ваших података о контакту другим људима."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"уписивање података о контактима"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Дозвољава апликацији да мења податке о контактима ускладиштене на таблету, укључујући податке о томе колико често зовете одређене особе, шаљете им поруке е-поште или на други начин комуницирате са њима. Ово помаже функцији аутоматског довршавања адреса е-поште и другим корисним функцијама. Злонамерне апликације могу то да искористе да би избрисале или измениле ваше податке о контакту."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Дозвољава апликацији да мења податке о контактима ускладиштене на телефону, укључујући податке о томе колико често зовете одређене особе, шаљете им поруке е-поште или на други начин комуницирате са њима. Ово помаже функцији аутоматског довршавања адреса е-поште и другим корисним функцијама. Злонамерне апликације могу то да искористе да би избрисале или измениле ваше податке о контакту."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"читање евиденције позива"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Дозвољава апликацији да чита евиденцију позива на таблету, укључујући податке о долазним и одлазним позивима. Злонамерне апликације могу ово да користе да би слале податке другим људима."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Дозвољава апликацији да чита евиденцију позива на телефону, укључујући податке о долазним и одлазним позивима. Злонамерне апликације могу ово да користе да би слале податке другим људима."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"знак"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"реч"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"веза"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"ред"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Фабричко тестирање није успело"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 1a085ab..54f84c8 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Din pekdator stängs av."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Din telefon stängs av."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Vill du stänga av?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Starta om i felsäkert läge"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Vill du starta om datorn i felsäkert läge? Då inaktiveras alla appar från tredje part som du har installerat. Apparna återställs när du startar om datorn igen."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Senaste"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Inga nya appar."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Alternativ för pekdatorn"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Tillåter att appen tar emot och bearbetar WAP-meddelanden. Skadliga appar kan övervaka dina meddelanden eller ta bort dem innan du har sett dem."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"hämta appar som körs"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Tillåter att appen hämtar information om uppgifter som körs och har körts. Skadliga appar kan upptäcka privat information om andra appar."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"hämta information om aktiva appar"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Tillåter att appen hämtar detaljerad information om uppgifter som körs och har körts. Skadliga appar kan upptäcka personliga uppgifter om andra appar."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"byt ordning på appar som körs"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Tillåter att appen flyttar uppgifter till förgrunden eller bakgrunden. Skadliga appar kan tvinga sig till förgrunden utan att du kan styra det."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"avsluta appar som körs"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Tillåter att appen skickar sticky broadcasts, som finns kvar när sändningen är slut. Skadliga appar kan göra pekdatorn seg eller instabil genom att se till att den använder för mycket minne."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Tillåter att appen skickar sticky broadcasts, som finns kvar när sändningen är slut. Skadliga appar kan göra mobilen seg eller instabil genom att använda för mycket minne."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"läsa kontaktinformation"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Appen tillåts läsa alla data om dina kontakter som finns lagrade på pekdatorn, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. På så sätt kan autoslutförda e-postadresser och andra användbara funktioner förbättras. Behörigheten kan utnyttjas av skadliga appar för att skicka dina kontaktuppgifter till andra personer."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Appen tillåts läsa alla data om dina kontakter som finns lagrade i mobilen, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. På så sätt kan autoslutförda e-postadresser och andra användbara funktioner förbättras. Behörigheten kan utnyttjas av skadliga appar för att skicka dina kontaktuppgifter till andra personer."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"skriva kontaktuppgifter"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Appen tillåts läsa alla data om dina kontakter som finns lagrade i mobilen, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. På så sätt kan autoslutförda e-postadresser och andra användbara funktioner förbättras. Detta kan utnyttjas av skadliga appar för att skicka dina kontaktuppgifter till andra personer."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Appen tillåts läsa alla data om dina kontakter som finns lagrade i mobilen, inklusive information om hur ofta du har ringt, skickat e-post till eller på andra sätt kommunicerat med specifika personer. På så sätt kan autoslutförda e-postadresser och andra användbara funktioner förbättras. Detta kan utnyttjas av skadliga appar för att skicka dina kontaktuppgifter till andra personer."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"läs samtalslogg"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Tillåter att appen läser pekdatorns samtalslista, inklusive uppgifter om inkommande och utgående samtal. Skadliga appar kan använda informationen för att skicka dina data till andra personer."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Tillåter att appen läser mobilens samtalslista, inklusive uppgifter om inkommande och utgående samtal. Skadliga appar kan använda informationen för att skicka dina data till andra personer."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"tecken"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"ord"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"länk"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"rad"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Det gick fel vid fabrikstestet"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index b9be959..cef001f 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Kompyuta yako ndogo itazima."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Simu yako itazima."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Unataka kuzima?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Washa upya kwa hali salama"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Je, unataka kuwasha upya kwa hali salama? Hii italemaza programu zote za wahusika wengine ambazo umesakinisha. Zitarejeshwa wakati utawasha upya tena."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Za hivi karibuni"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Hakuna programu za hivi karibuni."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Chaguo za kompyuta ndogo"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Inaruhusu programu kupokea na kuchakata jumbe za WAP. Programu hasidi zinaweza kufuatilia jumbe zako au kuzifuta bila kukuonyesha."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"rudisha programu zinazoendeshwa"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Inaruhusu programu kupata taarifa kuhusu kazi zinazoendelea sasa na hivi karibuni. Programu hasidi zinaweza kugundua taarifa ya kibinafsi kuhusu programu zingine."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"epua maelezo ya programu zinazoendeshwa."</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Huruhusu programu kuepua maelezo tondoti kuhusu kazi za sasa na zinazoendelea hivi karibuni. Programu hasidi huenda zikagundua maelezo ya kibinafsi kuhusu programu zingine."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"Agiza tena programu za kuendeshwa"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Inaruhusu programu kusongesha kazi kwenye mandhari-mbele na mandhari-nyuma. Programu hasidi zinaweza kujilazimisha mbele bila udhibiti wako."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"Komesha programu zinazoendeshwa"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Inaruhusu programu kutuma matangazo nata, ambayo hubakia baada ya matangazo kuisha. Programu hasidi zinaweza fanya kompyuta kibao kufanya kazi polepole au kuifanya isiwe thabiti kwa kuifanya itumie kumbukumbu kubwa zaidi."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Inaruhusu programu kutuma matangazo nata, ambayo hubakia baada ya matangazo kuisha. Programu hasidi zinaweza fanya simu kufanya kazi polepole au kuifanya isiwe thabiti kwa kuifanya itumie kumbukumbu kubwa zaidi."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"soma data ya anwani"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Huruhusu programu kusoma data yote kuhusu anwani zako zilizohifadhiwa kwenye  simu yako, ikiwa ni pamoja na marudio ya wale uliowapigia simu, kuwatumia barua pepe, au kuwasiliana kwa njia zingine na watu maalum. Hii husaidia na ukamilishaji otomatiki wa anwani za barua pepe na vipengele vingine vinavyofaa. Programu hasidi zinaweza kutumia idhini hii ili kutuma data yako ya anwani kwa watu wengine."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Huruhusu programu kusoma data yote kuhusu anwani zako zilizohifadhiwa kwenye  simu yako, ikiwa ni pamoja na marudio ya wale uliowapigia simu, kuwatumia barua pepe, au kuwasiliana kwa njia zingine na watu maalum. Hii husaidia na ukamilishaji otomatiki wa anwani za barua pepe na vipengele vingine vinavyofaa. Programu hasidi zinaweza kutumia idhini hii ili kutuma data yako ya anwani kwa watu wengine."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"andika data ya anwani"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Huruhusu programu kurekebisha data kuhusu anwani zako zilizohifadhiwa kwenye  simu yako, ikiwa ni pamoja na marudio ya wale uliowapigia simu, kuwatumia barua pepe, au kuwasiliana kwa njia zingine na watu maalum. Hii husaidia na ukamilishaji otomatiki wa anwani za barua pepe na vipengele vingine vinavyofaa. Programu hasidi zinaweza kutumia hii kufuta au kurekebisha data yako ya anwani."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Huruhusu programu kurekebisha data kuhusu anwani zako zilizohifadhiwa kwenye  simu yako, ikiwa ni pamoja na marudio ya wale uliowapigia simu, kuwatumia barua pepe, au kuwasiliana kwa njia zingine na watu maalum. Hii husaidia na ukamilishaji otomatiki wa anwani za barua pepe na vipengele vingine vinavyofaa. Programu hasidi zinaweza kutumia hii kufuta au kurekebisha data yako ya anwani."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"soma rajisi ya simu"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Huruhusu programu kusoma rajisi ya simu ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Huruhusu programu kusoma rajisi ya simu yako, ikiwa ni pamoja na data kuhusu simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"kibambo"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"neno"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"kiungo"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"mstari"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Jaribio la kiwanda limeshindikana"</string>
diff --git a/core/res/res/values-sw600dp/config.xml b/core/res/res/values-sw600dp/config.xml
index 49c8893..7fa7658 100644
--- a/core/res/res/values-sw600dp/config.xml
+++ b/core/res/res/values-sw600dp/config.xml
@@ -21,7 +21,7 @@
      for different hardware and product builds. -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <!-- see comment in values/config.xml -->
-    <integer name="config_longPressOnPowerBehavior">1</integer>
+    <integer name="config_longPressOnPowerBehavior">2</integer>
 
     <!-- Enable lockscreen rotation -->
     <bool name="config_enableLockScreenRotation">true</bool>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 0b6fb91..89627b1 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"แท็บเล็ตของคุณจะปิดการทำงาน"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"โทรศัพท์ของคุณจะปิดเครื่อง"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"คุณต้องการปิดการทำงานหรือไม่"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"รีบูตเข้าสู่โหมดปลอดภัย"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"คุณต้องการรีบูตเข้าสู่โหมดปลอดภัยหรือไม่ การดำเนินการนี้จะปิดใช้งานแอปพลเคชันของบุคคลที่สามทั้งหมดที่คุณได้ติดตั้งไว้ โดยจะคืนค่าเมื่อคุณรีบูตอีกครั้ง"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"เมื่อเร็วๆ นี้"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"ไม่มีแอปพลิเคชันล่าสุด"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"ตัวเลือกของแท็บเล็ต"</string>
@@ -203,8 +201,8 @@
     <string name="permdesc_receiveMms" msgid="1424805308566612086">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ MMS แอปพลิเคชันที่เป็นอันตรายอาจตรวจสอบข้อความของคุณหรือลบออกโดยไม่แสดงให้คุณเห็น"</string>
     <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"ได้รับการกระจายข้อความฉุกเฉิน"</string>
     <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความที่เผยแพร่กรณีฉุกเฉิน การอนุญาตนี้ใช้ได้เฉพาะกับแอปพลิเคชันระบบเท่านั้น"</string>
-    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"อ่านข้อความกระจายข้อมูลทางมือถือ"</string>
-    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"อนุญาตให้แอปพลิเคชันอ่านข้อความกระจายข้อมูลทางมือถือที่อุปกรณ์ได้รับ การแจ้งเตือนทางมือถือมีให้บริการในบางตำแหน่งโดยจะแจ้งเตือนคุณเกี่ยวกับสถานการณ์ฉุกเฉิน แอปพลิเคชันที่เป็นอันตรายอาจเข้าแทรกแซงการทำงานของอุปกรณ์เมื่อได้รับข้อความแจ้งเตือน"</string>
+    <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"อ่านข้อความที่ได้รับจากสถานีมือถือ"</string>
+    <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"อนุญาตให้แอปอ่านข้อความจากสถานีมือถือที่อุปกรณ์ได้รับ การแจ้งเตือนทางมือถือมีให้บริการในบางพื้นที่ โดยจะแจ้งเตือนคุณเกี่ยวกับสถานการณ์ฉุกเฉิน แอปที่เป็นอันตรายอาจเข้าแทรกแซงการทำงานของอุปกรณ์เมื่อได้รับข้อความแจ้งเตือนฉุกเฉิน"</string>
     <string name="permlab_sendSms" msgid="5600830612147671529">"ส่งข้อความ SMS"</string>
     <string name="permdesc_sendSms" msgid="906546667507626156">"อนุญาตให้แอปพลิเคชันส่งข้อความ SMS แอปพลิเคชันที่เป็นอันตรายอาจทำให้คุณต้องเสียค่าใช้จ่ายด้วยการส่งข้อความโดยไม่มีการยืนยันจากคุณ"</string>
     <string name="permlab_sendSmsNoConfirmation" msgid="4781483105951730228">"ส่งข้อความ SMS โดยไม่มีการยืนยัน"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ WAP แอปพลิเคชันที่เป็นอันตรายอาจตรวจสอบข้อความของคุณหรือลบออกโดยไม่แสดงให้คุณเห็น"</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"เรียกแอปพลิเคชันที่ทำงานอยู่"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"อนุญาตให้แอปพลิเคชันดึงข้อมูลเกี่ยวกับงานที่กำลังเรียกใช้อยู่ในปัจจุบันและงานล่าสุด แอปพลิเคชันที่เป็นอันตรายอาจค้นพบข้อมูลเฉพาะตัวเกี่ยวกับแอปพลิเคชันอื่นๆ"</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"ดึงรายละเอียดของแอปพลิเคชันที่ทำงานอยู่"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"อนุญาตให้แอปพลิเคชันดึงข้อมูลเกี่ยวกับงานที่กำลังเรียกใช้อยู่ในปัจจุบันและงานล่าสุด แอปพลิเคชันที่เป็นอันตรายอาจค้นพบข้อมูลเฉพาะตัวเกี่ยวกับแอปพลิเคชันอื่นๆ"</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"จัดลำดับแอปพลิเคชันที่ทำงานอยู่ใหม่"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"อนุญาตให้แอปพลิเคชันย้ายงานไปยังส่วนหน้าและพื้นหลัง แอปพลิเคชันที่เป็นอันตรายอาจบังคับตัวเองให้ไปที่ส่วนหน้าโดยไม่มีการควบคุมจากคุณ"</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"หยุดแอปพลิเคชันที่ทำงานอยู่"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"อนุญาตให้แอปพลิเคชันส่งการกระจายข้อมูลที่ติดหนึบ ซึ่งจะยังคงอยู่หลังจากการกระจายข้อมูลจบไปแล้ว แอปพลิเคชันที่เป็นอันตรายอาจทำให้แท็บเล็ตทำงานช้าลงหรือไม่เสถียรโดยการใช้หน่วยความจำมากเกินไป"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"อนุญาตให้แอปพลิเคชันส่งการกระจายข้อมูลที่ติดหนึบ ซึ่งจะยังคงอยู่หลังจากการกระจายข้อมูลจบไปแล้ว แอปพลิเคชันที่เป็นอันตรายอาจทำให้โทรศัพท์ทำงานช้าลงหรือไม่เสถียรโดยการใช้หน่วยความจำมากเกินไป"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"อ่านข้อมูลที่อยู่ติดต่อแล้ว"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลทั้งหมดเกี่ยวกับผู้ติดต่อที่จัดเก็บไว้ในแท็บเล็ตของคุณ รวมถึงความถี่ที่คุณโทรหา ส่งอีเมล หรือสื่อสารในรูปแบบอื่นกับคนบางคน ซึ่งจะช่วยให้ระบบสามารถเติมที่อยู่อีเมลและให้คุณลักษณะเพื่ออำนวยความสะดวกสบายอื่นๆ โดยอัตโนมัติ แอปพลิเคชันที่เป็นอันตรายสามารถใช้การอนุญาตนี้ในการส่งข้อมูลผู้ติดต่อของคุณไปยังบุคคลอื่น"</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลทั้งหมดเกี่ยวกับผู้ติดต่อที่จัดเก็บไว้ในโทรศัพท์ของคุณ รวมถึงความถี่ที่คุณโทรหา ส่งอีเมล หรือสื่อสารในรูปแบบอื่นกับคนบางคน ซึ่งจะช่วยให้ระบบสามารถเติมที่อยู่อีเมลและให้คุณลักษณะเพื่ออำนวยความสะดวกสบายอื่นๆ โดยอัตโนมัติ แอปพลิเคชันที่เป็นอันตรายสามารถใช้การอนุญาตนี้ในการส่งข้อมูลผู้ติดต่อของคุณไปยังบุคคลอื่น"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"เขียนข้อมูลที่อยู่ติดต่อ"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลเกี่ยวกับผู้ติดต่อที่จัดเก็บไว้ในแท็บเล็ตของคุณ รวมถึงความถี่ที่คุณโทรหา ส่งอีเมล หรือสื่อสารในรูปแบบอื่นกับคนบางคน ซึ่งจะช่วยให้ระบบสามารถเติมที่อยู่อีเมลและให้คุณลักษณะเพื่ออำนวยความสะดวกสบายอื่นๆ โดยอัตโนมัติ แอปพลิเคชันที่เป็นอันตรายสามารถใช้คุณลักษณะนี้ในการลบหรือแก้ไขข้อมูลผู้ติดต่อของคุณ"</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลเกี่ยวกับผู้ติดต่อที่จัดเก็บไว้ในโทรศัพท์ของคุณ รวมถึงความถี่ที่คุณโทรหา ส่งอีเมล หรือสื่อสารในรูปแบบอื่นกับคนบางคน ซึ่งจะช่วยให้ระบบสามารถเติมที่อยู่อีเมลและให้คุณลักษณะเพื่ออำนวยความสะดวกสบายอื่นๆ โดยอัตโนมัติ แอปพลิเคชันที่เป็นอันตรายสามารถใช้คุณลักษณะนี้ในการลบหรือแก้ไขข้อมูลผู้ติดต่อของคุณ"</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"อ่านประวัติการโทร"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"อนุญาตให้แอปอ่านประวัติการโทรจากแท็บเล็ตของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"อนุญาตให้แอปอ่านประวัติการโทรจากโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"อักขระ"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"คำ"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"ลิงก์"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"บรรทัด"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"การทดสอบจากโรงงานล้มเหลว"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 5378ed9..f59b276 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Mag-shut down ang iyong tablet."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Magsa-shut down ang iyong telepono."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Nais mo bang mag-shut down?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Mag-reboot sa safe mode"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Nais mo bang mag-reboot sa safe mode? Hindi nito papaganahin ang lahat ng third party na application na na-install mo. Ibabalik ang mga ito kapag muli kang nag-reboot."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Kamakailan"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Walang kamakailang apps."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Mga pagpipilian sa tablet"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Pinapayagan ang app na tumanggap at magproseso ng mga mensaheng WAP. Maaaring subaybayan ng nakakahamak na apps ang iyong mga mensahe o tanggalin ang mga ito nang hindi ipinapakita ang mga ito sa iyo."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"bawiin ang tumatakbong apps"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Pinapayagan ang app na bawiin ang impormasyon tungkol sa kasalukuyan at kamakailang tumatakbong mga gawain. Maaaring makatuklas ang nakakahamak na apps ng pribadong impormasyon tungkol sa iba pang apps."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"bawiin ang mga detalye ng gumaganang apps"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Binibigyang-daan ang app na bawiin ang detalyadong impormasyon tungkol sa mga kasalukuyan at kamakailang gumaganang gawain. Maaaring makatuklas ang nakakahamak na apps ng pribadong impormasyon tungkol sa iba pang apps."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"muling isaayos ang tumatakbong apps"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Pinapayagan ang app na ilipat ang mga gawain sa foreground at background. Maaaring puwersahin ng nakakahamak na apps ang mga sarili nito sa harapan nang wala ang iyong pagkontrol."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"ihinto ang pagpapatakbo ng apps"</string>
@@ -746,14 +746,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"character"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"salita"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"link"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"linya"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Nabigo ang factory na pagsubok"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index b655346..975c3d9 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Tabletiniz kapanacak."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Telefonunuz kapanacak."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Kapatmak istiyor musunuz?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Güvenli modda yeniden aç"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Cihazı kapatıp güvenli modda tekrar açmak ister misiniz? Bu işlem, yüklediğiniz tüm üçüncü taraf uygulamaları devre dışı bırakacaktır. Daha sonra tekrar açtığınızda bu uygulamalar geri yüklenecektir."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"En Son Görevler"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Son uygulama yok"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tablet seçenekleri"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Uygulamaya, WAP mesajlarını alma ve işleme izni verir. Kötü amaçlı uygulamalar mesajlarınızı izleyebilir veya onları size göstermeden silebilir."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"çalışan uygulamaları al"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Uygulamaya, şu anda çalışmakta olan ve son çalışan işlemler hakkında bilgi alma izni verir. Kötü amaçlı uygulamalar diğer uygulamalar hakkında özel bilgileri ele geçirebilir."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"çalışan uygulamaların ayrıntılarını al"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Uygulamaya, şu anda çalışmakta olan ve son çalışan işlemler hakkında ayrıntılı bilgi alma izni verir. Kötü amaçlı uygulamalar diğer uygulamalar hakkında özel bilgileri ele geçirebilir."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"çalışan uygulamaları yeniden sırala"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Uygulamaya, görevleri ön plana ve arka plana taşıma izni verir. Kötü amaçlı uygulamalar kendilerini sizin denetiminiz dışında ön plana taşıyabilir."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"çalışan uygulamaları durdur"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Uygulamaya, yayın bittikten sonra da kalan sabit yayınlar gönderme izni verir. Kötü amaçlı uygulamalar tabletin çok fazla bellek kullanmasına neden olarak onu yavaşlatabilir veya kararsız hale getirebilirler."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Uygulamaya, yayın bittikten sonra da kalan sabit yayınlar gönderme izni verir. Kötü amaçlı uygulamalar telefonun çok fazla bellek kullanmasına neden olarak onu yavaşlatabilir veya dengesiz hale getirebilir."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"kişi verilerini oku"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Uygulamaya, belirli kişilerle ne sıklıkta sesli çağrı, e-posta ve diğer şekillerde iletişim kurduğunuz da dahil olmak üzere tabletinizde kayıtlı kişilerle ilgili tüm verileri okuma izni verir. Bu seçenek, e-posta adreslerinin otomatik tamamlanmasına ve diğer kullanışlı özelliklerin sağlanmasına yardımcı olur. Kötü amaçlı uygulamalar bu izni kullanarak kişi bilgilerinizi başkalarına gönderebilir."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Uygulamaya, belirli kişilerle ne sıklıkta sesli çağrı, e-posta ve diğer şekillerde iletişim kurduğunuz da dahil olmak üzere telefonunuzda kayıtlı kişilerle ilgili tüm verileri okuma izni verir. Bu seçenek, e-posta adreslerinin otomatik tamamlanmasına ve diğer kullanışlı özelliklerin sağlanmasına yardımcı olur. Kötü amaçlı uygulamalar bu izni kullanarak kişi bilgilerinizi başkalarına gönderebilir."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"kişi verileri yaz"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Uygulamaya, belirli kişilerle ne sıklıkta sesli çağrı, e-posta ve diğer şekillerde iletişim kurduğunuz da dahil olmak üzere tabletinizde kayıtlı kişilerle ilgili tüm verileri değiştirme izni verir. Bu seçenek, e-posta adreslerinin otomatik tamamlanmasına ve diğer kullanışlı özelliklerin sağlanmasına yardımcı olur. Kötü amaçlı uygulamalar bu izni kullanarak kişi bilgilerinizi silebilir veya değiştirebilir."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Uygulamaya, belirli kişilerle ne sıklıkta sesli çağrı, e-posta ve diğer şekillerde iletişim kurduğunuz da dahil olmak üzere telefonunuzda kayıtlı kişilerle ilgili tüm verileri değiştirme izni verir. Bu seçenek, e-posta adreslerinin otomatik tamamlanmasına ve diğer kullanışlı özelliklerin sağlanmasına yardımcı olur. Kötü amaçlı uygulamalar bu izni kullanarak kişi bilgilerinizi silebilir veya değiştirebilir."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"çağrı günlüğünü oku"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Uygulamaya tabletinizin çağrı günlüğünü (gelen ve giden çağrılarla ilgili veriler dahil olmak üzere) okuma izni verir. Kötü amaçlı uygulamalar bu izni kullanarak verilerinizi başka kişilere gönderebilir."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Uygulamaya telefonunuzun çağrı günlüğünü (gelen ve giden çağrılarla ilgili veriler dahil olmak üzere) okuma izni verir. Kötü amaçlı uygulamalar bu izni kullanarak verilerinizi başka kişilere gönderebilir."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"karakter"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"kelime"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"bağlantı"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"satır"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Fabrika testi yapılamadı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 32d2727..3b3f3a7 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ваш пристрій буде вимкнено."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ваш телефон буде вимкнено."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Вимкнути?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Перейти в безпечний режим"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Дійсно перейти в безпечний режим? Усі встановлені програми третіх сторін буде вимкнено. Вони відновляться після повторного перезавантаження."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Останні"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Жодних останніх програм"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Парам. пристрою"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Дозволяє програмі отримувати й обробляти WAP повідомлення. Шкідливі програми можуть відстежувати ваші повідомлення чи видаляти їх, навіть не показуючи вам."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"отримувати запущені програми"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Дозволяє програмі отримувати інформацію про поточні й останні запущені завдання. Шкідливі програми можуть виявляти особисту інформацію про інші програми."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"отримувати дані про запущені програми"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Дозволяє програмі отримувати інформацію про поточні й останні запущені завдання. Шкідливі програми можуть виявляти особисту інформацію про інші програми."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"змінювати порядок запущених програм"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Дозволяє програмі переміщувати завдання в активні чи фонові вікна. Шкідливі програми можуть примусово ставати активними без вашого відома."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"зупиняти запущені програми"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Дозволяє програмі надсилати закріплені широкомовні повідомлення, які залишаються після відтворення широкомовного повідомлення. Шкідливі програми можуть сповільнювати роботу планшетного ПК або порушувати її стабільність, спричиняючи завелике використання пам’яті."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Дозволяє програмі надсилати закріплені широкомовні повідомлення, які залишаються після відтворення широкомовного повідомлення. Шкідливі програми можуть сповільнювати роботу телефону або порушувати її стабільність, спричиняючи завелике використання пам’яті."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"читати контакт. дані"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Дозволяє програмі читати всі дані про контакти, які зберігаються на вашому планшетному ПК, зокрема частоту здійснення дзвінків, надсилання електронних листів або інших способів спілкування з окремими особами. Це допомагає автоматично завершувати написання електронних адрес і користуватися іншими зручними функціями. Шкідливі програми можуть використовувати цей дозвіл для надсилання ваших контактних даних іншим людям."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Дозволяє програмі читати всі дані про контакти, які зберігаються на вашому телефоні, зокрема частоту здійснення дзвінків, надсилання електронних листів або інших способів спілкування з окремими особами. Це допомагає автоматично завершувати написання електронних адрес і користуватися іншими зручними функціями. Шкідливі програми можуть використовувати цей дозвіл для надсилання ваших контактних даних іншим людям."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"запис. контактні дані"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Дозволяє програмі змінювати  всі дані про контакти, які зберігаються на вашому планшетному ПК, зокрема частоту здійснення дзвінків, надсилання електронних листів або інших способів спілкування з окремими особами. Це допомагає автоматично завершувати написання електронних адрес і користуватися іншими зручними функціями. Шкідливі програми можуть використовувати це для стирання чи зміни ваших контактних даних."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Дозволяє програмі змінювати  всі дані про контакти, які зберігаються на вашому телефоні, зокрема частоту здійснення дзвінків, надсилання електронних листів або інших способів спілкування з окремими особами. Це допомагає автоматично завершувати написання електронних адрес і користуватися іншими зручними функціями. Шкідливі програми можуть використовувати це для стирання чи зміни ваших контактних даних."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"читати журнал викликів"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Дозволяє програмі читати журнал викликів вашого планшетного ПК, включно з даними про вхідні та вихідні дзвінки. Шкідливі програми можуть використовувати це для надсилання ваших даних іншим людям."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Дозволяє програмі читати журнал викликів вашого телефону, включно з даними про вхідні та вихідні дзвінки. Шкідливі програми можуть використовувати це для надсилання ваших даних іншим людям."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"символ"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"слово"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"посилання"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"рядок"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Помилка завод. тесту"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 9e714ca..660be8c 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Máy tính bảng của bạn sẽ tắt."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Điện thoại của bạn sẽ tắt."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Bạn có muốn tắt không?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Khởi động lại ở chế độ an toàn"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Bạn có muốn khởi động lại ở chế độ an toàn không? Thao tác này sẽ tắt tất cả ứng dụng của bên thứ ba mà bạn đã cài đặt. Những ứng dụng này sẽ được khôi phục khi bạn khởi động lại một lần nữa."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Gần đây"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Không có ứng dụng nào gần đây."</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Tùy chọn máy tính bảng"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Cho phép ứng dụng nhận và xử lý tin nhắn WAP. Ứng dụng độc hại có thể giám sát tin nhắn của bạn hoặc xóa tin nhắn mà không hiển thị chúng cho bạn."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"truy xuất các ứng dụng đang chạy"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Cho phép ứng dụng truy xuất thông tin về các công việc đã và đang chạy gần đây. Ứng dụng độc hại có thể phát hiện thông tin riêng tư về các ứng dụng khác."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"truy xuất chi tiết về các ứng dụng đang chạy"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Cho phép ứng dụng truy xuất thông tin chi tiết về các tác vụ đã và đang chạy gần đây. Ứng dụng độc hại có thể phát hiện thông tin riêng tư về các ứng dụng khác."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"sắp xếp lại những ứng dụng đang chạy"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Cho phép ứng dụng di chuyển công việc sang nền trước và nền sau. Ứng dụng độc hại có thể tự hiển thị ở nền trước mà không chịu sự kiểm soát của bạn."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"dừng các ứng dụng đang chạy"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Cho phép ứng dụng gửi nội dung truyền phát hấp dẫn người xem. Nội dung này sẽ vẫn còn sau khi quá trình truyền phát kết thúc. Ứng dụng độc hại có thể làm cho máy tính bảng bị chậm hoặc không ổn định bằng cách khiến máy tính bảng sử dụng quá nhiều bộ nhớ."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Cho phép ứng dụng gửi nội dung truyền phát hấp dẫn người xem. Nội dung này sẽ vẫn còn sau khi quá trình truyền phát kết thúc. Ứng dụng độc hại có thể làm cho điện thoại bị chậm hoặc không ổn định bằng cách khiến điện thoại sử dụng quá nhiều bộ nhớ."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"đọc dữ liệu liên hệ"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Cho phép ứng dụng đọc tất cả dữ liệu về các liên hệ được lưu trữ trên máy tính bảng của bạn, bao gồm cả các liên hệ mà bạn thường xuyên gọi, gửi email hoặc liên lạc theo các cách khác với các cá nhân cụ thể. Việc này giúp ích cho tính năng tự động hoàn tất địa chỉ email và các tính năng tiện lợi khác. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu liên hệ của bạn cho những người khác."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Cho phép ứng dụng đọc tất cả dữ liệu về các liên hệ được lưu trữ trên điện thoại của bạn, bao gồm cả các liên hệ mà bạn thường xuyên gọi, gửi email hoặc liên lạc theo các cách khác với các cá nhân cụ thể. Việc này giúp ích cho tính năng tự động hoàn tất địa chỉ email và các tính năng tiện lợi khác. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu liên hệ của bạn cho những người khác."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"ghi dữ liệu liên hệ"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Cho phép ứng dụng sửa đổi dữ liệu về các liên hệ được lưu trữ trên máy tính bảng của bạn, bao gồm cả các liên hệ mà bạn thường xuyên gọi, gửi email hoặc liên lạc theo các cách khác với các cá nhân cụ thể. Việc này giúp ích cho tính năng tự động hoàn tất địa chỉ email và các tính năng tiện lợi khác. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi dữ liệu liên hệ của bạn."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Cho phép ứng dụng sửa đổi dữ liệu về các liên hệ được lưu trữ trên điện thoại của bạn, bao gồm cả các liên hệ mà bạn thường xuyên gọi, gửi email hoặc liên lạc theo các cách khác với các cá nhân cụ thể. Việc này giúp ích cho tính năng tự động hoàn tất địa chỉ email và các tính năng tiện lợi khác. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi dữ liệu liên hệ của bạn."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"đọc nhật ký cuộc gọi"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Cho phép ứng dụng đọc nhật ký cuộc gọi trên máy tính bảng của bạn, bao gồm dữ liệu về các cuộc gọi đến và gọi đi. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu của bạn cho những người khác."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Cho phép ứng dụng đọc nhật ký cuộc gọi trên điện thoại của bạn, bao gồm dữ liệu về các cuộc gọi đến và gọi đi. Các ứng dụng độc hại có thể sử dụng quyền này để gửi dữ liệu của bạn cho những người khác."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"ký tự"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"từ"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"liên kết"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"dòng"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Thử nghiệm ban đầu không thành công"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 244455d..0d0835c 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板电脑会关闭。"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"您的手机会关机。"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要关机吗?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"重新启动并进入安全模式"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"您要重新启动并进入安全模式吗?这样会停用您已安装的所有第三方应用。再次重新启动将恢复这些应用。"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"近期任务"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"最近没有运行任何应用"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"平板电脑选项"</string>
@@ -219,6 +217,10 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"允许应用接收和处理 WAP 短信。恶意应用可能会监视您的短信,或删除短信而不向您显示。"</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"检索正在运行的应用"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"允许应用针对近期运行的和当前正在运行的任务检索相关信息。恶意应用可能会发现有关其他应用的私密信息。"</string>
+    <!-- no translation found for permlab_getDetailedTasks (6229468674753529501) -->
+    <skip />
+    <!-- no translation found for permdesc_getDetailedTasks (153824741440717599) -->
+    <skip />
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"对正在运行的应用重新排序"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"允许应用将任务移动到前台和后台。恶意应用可能会不受您的控制,强行让自己处于前台。"</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"停止正在运行的应用"</string>
@@ -342,15 +344,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"允许应用发送持久广播,此类广播在结束后仍会保留。恶意应用可能会导致平板电脑使用过多内存,从而使速度变慢或变得不稳定。"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"允许应用发送持久广播,此类广播在结束后仍会保留。恶意应用可能会导致手机使用过多内存,从而使速度变慢或变得不稳定。"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"读取联系人数据"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"允许该应用读取与您平板电脑上存储的联系人相关的所有数据,包括您呼叫特定联系人、向其发送电子邮件或以其他方式通信的频率。这有助于自动填充电子邮件地址,以及实现其他某些便利功能。恶意应用可能会借此将您的联系人数据发送给他人。"</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"允许该应用读取与您手机上存储的联系人相关的所有数据,包括您呼叫特定联系人、向其发送电子邮件或以其他方式通信的频率。这有助于自动填充电子邮件地址,以及实现其他某些便利功能。恶意应用可能会借此将您的联系人数据发送给他人。"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"写入联系数据"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"允许该应用修改与您平板电脑上存储的联系人相关的数据,包括您呼叫特定联系人、向其发送电子邮件或以其他方式通信的频率。这有助于自动填充电子邮件地址,以及实现其他某些便利功能。恶意应用可能会借此删除或修改您的联系人数据。"</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"允许该应用修改与您手机上存储的联系人相关的数据,包括您呼叫特定联系人、向其发送电子邮件或以其他方式通信的频率。这有助于自动填充电子邮件地址,以及实现其他某些便利功能。恶意应用可能会借此删除或修改您的联系人数据。"</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"读取通话记录"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"允许该应用读取平板电脑的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此将您的数据发送给他人。"</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"允许该应用读取手机的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此将您的数据发送给他人。"</string>
@@ -746,14 +744,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"字符"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"字"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"链接"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"行"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="AMPM">%P</xliff:g> <xliff:g id="HOUR">%-l</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="AMPM">%p</xliff:g> <xliff:g id="HOUR">%-l</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"出厂测试失败"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d57a650..637d319 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"您的平板電腦將會關機。"</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"手機即將關機。"</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"您要關機嗎?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"重新啟動進入安全模式"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"您要重新啟動進入安全模式嗎?這會停用您所安裝的所有第三方應用程式。如要還原這些應用程式,只要再次重新啟動即可。"</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"最新的"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"沒有最近用過的應用程式。"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"平板電腦選項"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"允許應用程式接收及處理 WAP 訊息。請注意,惡意應用程式可能利用此功能監視訊息,或在您讀取訊息前擅自將其刪除。"</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"擷取執行中的應用程式"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"允許應用程式取得最近執行任務的資訊。請注意,惡意應用程式可能利用此功能找出其他應用程式的隱私資訊。"</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"擷取執行中應用程式的詳細資料"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"允許應用程式擷取目前及最近執行任務的詳細資訊。惡意應用程式可能會找出其他應用程式的私人資訊。"</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"重新排序正在執行的應用程式"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"允許應用程式將工作移至前景或背景。請注意,惡意應用程式可能利用此功能自行移動至前景。"</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"停止執行中的應用程式"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,惡意應用程式可能利用此功能讓平板電腦使用過多的記憶體,導致平板電腦的執行速度變慢或不穩定。"</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"允許應用程式傳送記憶廣播,這類廣播在廣播動作結束後仍繼續存在。請注意,惡意應用程式可能利用此功能讓手機使用過多的記憶體,導致手機的執行速度變慢或不穩定。"</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"讀取聯絡人資料"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"允許應用程式讀取儲存在平板電腦中的所有聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率,這樣您就可以在輸入電子郵件地址時使用自動完成功能和其他便利功能。不過,惡意應用程式也可藉此將您的聯絡人資料傳送給其他人。"</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"允許應用程式讀取儲存在手機中的所有聯絡人資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率,這樣您就可以在輸入電子郵件地址時使用自動完成功能和其他便利功能。不過,惡意應用程式也可藉此將您的聯絡人資料傳送給其他人。"</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"輸入聯絡人資料"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"允許應用程式修改儲存在平板電腦中的資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率,這樣您就可以在輸入電子郵件地址時使用自動完成功能和其他便利功能。不過,惡意應用程式也可藉此清除或修改您的聯絡人資料。"</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"允許應用程式修改儲存在手機中的資料,包括您與特定聯絡人通話、傳送電子郵件或使用其他通訊方式的互動頻率,這樣您就可以在輸入電子郵件地址時使用自動完成功能和其他便利功能。不過,惡意應用程式也可藉此清除或修改您的聯絡人資料。"</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"讀取通話紀錄"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"允許應用程式讀取平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能將您的資料傳送給他人。"</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"允許應用程式讀取手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能將您的資料傳送給他人。"</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"字元"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"字詞"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"連結"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"行"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"出廠測試失敗"</string>
@@ -1033,8 +1025,8 @@
     <string name="sms_control_no" msgid="625438561395534982">"拒絕"</string>
     <string name="sms_short_code_confirm_title" msgid="1666863092640877318">"傳送簡訊給短碼?"</string>
     <string name="sms_premium_short_code_confirm_title" msgid="3811263856304367838">"傳送付費簡訊?"</string>
-    <string name="sms_short_code_confirm_message" msgid="5616409294907295407">"&lt;b&gt;&lt;/b&gt;「<xliff:g id="APP_NAME">%1$s</xliff:g>」想要傳送簡訊給簡訊短碼 &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;。&lt;p&gt;傳送簡訊給簡訊短碼之後,系統即會從您的行動帳戶扣除付費服務的費用。&lt;p&gt;您要允許這個應用程式傳送簡訊嗎?"</string>
-    <string name="sms_premium_short_code_confirm_message" msgid="6214083016284738667">"&lt;b&gt;&lt;/b&gt;「<xliff:g id="APP_NAME">%1$s</xliff:g>」想要傳送簡訊給付費簡訊短碼 &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;。&lt;p&gt;&lt;b&gt;傳送簡訊給這個對象之後,系統即會從您的行動帳戶扣除付費服務的費用。&lt;/b&gt;&lt;p&gt;您要允許這個應用程式傳送簡訊嗎?"</string>
+    <string name="sms_short_code_confirm_message" msgid="5616409294907295407">"&lt;b&gt;&lt;/b&gt;「<xliff:g id="APP_NAME">%1$s</xliff:g>」想要傳送簡訊給簡訊短碼 &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;。&lt;p&gt;將簡訊傳送給對方之後,系統即會從您的行動帳戶收取付費服務的費用。&lt;p&gt;您要允許這個應用程式傳送簡訊嗎?"</string>
+    <string name="sms_premium_short_code_confirm_message" msgid="6214083016284738667">"&lt;b&gt;&lt;/b&gt;「<xliff:g id="APP_NAME">%1$s</xliff:g>」想要傳送簡訊給付費簡訊短碼 &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;。&lt;p&gt;&lt;b&gt;將簡訊傳送給對方之後,系統即會從您的行動帳戶收取付費服務的費用。&lt;/b&gt;&lt;p&gt;您要允許這個應用程式傳送簡訊嗎?"</string>
     <string name="sms_short_code_confirm_allow" msgid="8957573662645722940">"傳送簡訊"</string>
     <string name="sms_short_code_confirm_deny" msgid="6374609298084435887">"不要傳送"</string>
     <string name="sms_short_code_confirm_report" msgid="2588793956061677070">"檢舉惡意應用程式"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 0536fbe..05981cd 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -146,10 +146,8 @@
     <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Ithebhulethi yakho izocima."</string>
     <string name="shutdown_confirm" product="default" msgid="649792175242821353">"Ifoni yakho izocima."</string>
     <string name="shutdown_confirm_question" msgid="2906544768881136183">"Ingabe ufuna ukucisha?"</string>
-    <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
-    <skip />
-    <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
-    <skip />
+    <string name="reboot_safemode_title" msgid="7054509914500140361">"Qala kabusha emodini ephephile"</string>
+    <string name="reboot_safemode_confirm" msgid="55293944502784668">"Ingabe ufuna ukuqala kabusha kumodi ephephile? Lokhu kuzokhubaza zonke izinhlelo zokusebenza ezivela eceleni ozifakile. Zizobuyiswa uma uqala kabusha futhi."</string>
     <string name="recent_tasks_title" msgid="3691764623638127888">"Okwakamuva"</string>
     <string name="no_recent_tasks" msgid="8794906658732193473">"Azikho izinhlelo zokusebenza zakamuva"</string>
     <string name="global_actions" product="tablet" msgid="408477140088053665">"Okukhethwa konke kwethebhulethi"</string>
@@ -219,6 +217,8 @@
     <string name="permdesc_receiveWapPush" msgid="7983455145335316872">"Ivumela ukuthi insiza yamukele iphinde isebenze imiyalezo ye-WAP. Izinsiza ezinobungozi zingabheka imiyalezo yakho noma ziyisuse ngaphandle kokuthi zikukhombise."</string>
     <string name="permlab_getTasks" msgid="6466095396623933906">"thola izinsiza ezisebenzayo"</string>
     <string name="permdesc_getTasks" msgid="6608159250520381359">"Ivumela insiza uuthi ithole kabusha ulwazi mayelana nezinto ezenzeka manje nezisanda kwenzeka. Izinsiza ezinobungozi zingathola imininingwane eyimfihlo mayelana nezinye izinsiza."</string>
+    <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"thola kabusha imininingwane yezinhlelo zokusebenza ezisebenzayo"</string>
+    <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Ivumela uhlelo lokusebenza ukuthola kabusha ulwazi mayelana nezinto ezenzeka manje nezisanda kwenzeka. Izinhlelo zokusebenza ezingalungile zingathola imininingwane eyimfihlo mayelana nezinye izinhlelo zokusebenza."</string>
     <string name="permlab_reorderTasks" msgid="2018575526934422779">"misa kabusha izinsiza ezisebenzayo"</string>
     <string name="permdesc_reorderTasks" msgid="4175137612205663399">"Ivumela insiza ukuthi ihambise izenzo ziye ngaphambili kanye nasemumva. Izinsiza ezinobungozi zingaziphoqelela ukuth iziye phambili ngaphandle kokulawula kwakho."</string>
     <string name="permlab_removeTasks" msgid="6821513401870377403">"misa izinsiza ezisebenzayo"</string>
@@ -342,15 +342,11 @@
     <string name="permdesc_broadcastSticky" product="tablet" msgid="1181582512022829259">"Ivumela ukuthi insiza ithumele ukusakaza okunamathelayo, okusalayo emva kokuba ukusakazwa sekuphelile. Izinsiza ezinobungozi zingenzaa amakhompyutha epeni ukuthi ahambe kancane noma angasebenzi kahle ngokuthi asebenzise imemori enkulu kakhulu."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="3287869131621514325">"Ivumela ukuthi insiza ithumele ukusakaza okunamathelayo, okusalayo emva kokuba ukusakazwa sekuphelile. Izinsiza ezinobungozi zingenzaa amakhompyutha epeni ukuthi ahambe kancane noma angasebenzi kahle ngokuthi asebenzise imemori enkulu kakhulu."</string>
     <string name="permlab_readContacts" msgid="6219652189510218240">"funda idatha yothintana naye"</string>
-    <!-- no translation found for permdesc_readContacts (6370069055638209432) -->
-    <skip />
-    <!-- no translation found for permdesc_readContacts (4093353182535351501) -->
-    <skip />
+    <string name="permdesc_readContacts" product="tablet" msgid="6370069055638209432">"Ivumela uhlelo lokusebenza ukufunda othintana nabo abagcinwe kwithebhulethi yakho, kuhlanganise ukuvama ukushaya ucingo, uku-imeyla, noma ukuxhumana okuthize kwanoma iziphi ezinye izindlela nabantu abathize. Lokhu kusiza ngokuqedela okuzenzakalelayo kwamakheli e-imeyli kanye nezinye izici eziwusizo. Izinhlelo zokusebenza ezinonya zingase zisebenzise le mvume ukuthumela idatha yakho yothintana nabo kwabanye abantu."</string>
+    <string name="permdesc_readContacts" product="default" msgid="4093353182535351501">"Ivumela uhlelo lokusebenza ukufunda yonke idatha emayelana nabathintwayo bakho abagcinwe efonini yakho, kuhlanganise ukuvama ukushaya ucingo, uku-imeyla, noma ukuxhumana okuthize kwanoma iziphi ezinye izindlela nabantu abathize. Lokhu kusiza ngokuqedela okuzenzakalelayo kwamakheli e-imeyli kanye nezinye izici eziwusizo. Izinhlelo zokusebenza ezinonya zingase zisebenzise le mvume ukuthumela idatha yakho yothintana nabo kwabanye abantu."</string>
     <string name="permlab_writeContacts" msgid="644616215860933284">"bhala idatha yothintana naye"</string>
-    <!-- no translation found for permdesc_writeContacts (5495863352173533286) -->
-    <skip />
-    <!-- no translation found for permdesc_writeContacts (6108469962248865715) -->
-    <skip />
+    <string name="permdesc_writeContacts" product="tablet" msgid="5495863352173533286">"Ivumela uhlelo lokusebenza ukugugula idatha emayelana nabathintwayo bakho abagcinwe kwithebhulethi yakho, kuhlanganise ukuvama ukushaya ucingo, uku-imeyla, noma ukuxhumana okuthize kwanoma iziphi ezinye izindlela nabantu abathize. Lokhu kusiza ngokuqedela okuzenzakalelayo kwamakheli e-imeyli kanye nezinye izici eziwusizo. Izinhlelo zokusebenza ezinonya zingase zisebenzise le mvume ukusula noma ukuguqula idatha yakho yothintana nabo."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="6108469962248865715">"Ivumela uhlelo lokusebenza ukugugula idatha emayelana nabathintwayo bakho abagcinwe efonini yakho, kuhlanganise ukuvama ukushaya ucingo, uku-imeyla, noma ukuxhumana okuthize kwanoma iziphi ezinye izindlela nabantu abathize. Lokhu kusiza ngokuqedela okuzenzakalelayo kwamakheli e-imeyli kanye nezinye izici eziwusizo. Izinhlelo zokusebenza ezinonya zingase zisebenzise le mvume ukusula noma ukuguqula idatha yakho yothintana nabo."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"funda irekhodi lamakholi"</string>
     <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Ivumela uhlelo lokusebenza ukufunda irekhodi lamakholi lethubhulethi yakho, kufaka phakathi idatha mayelana namakholi angenayo naphumayo. Izinhlelo zikusebenza ezingalungile zingasebenzisa lokhu ukuthumela idatha kwabanye abantu."</string>
     <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Ivumela uhlelo lokusebenza ukufunda irekhodi lamakholi akho, kufaka phakathi idatha mayelana namakholi aphumayo nangenayo. Izinhlelo zokusebenza ezingalungile zingasebenzisa lokhu ukuthumela idatha kwabanye abantu."</string>
@@ -746,14 +742,10 @@
     <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
     <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
     <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
-    <!-- no translation found for granularity_label_character (7336470535385009523) -->
-    <skip />
-    <!-- no translation found for granularity_label_word (7075570328374918660) -->
-    <skip />
-    <!-- no translation found for granularity_label_link (5815508880782488267) -->
-    <skip />
-    <!-- no translation found for granularity_label_line (5764267235026120888) -->
-    <skip />
+    <string name="granularity_label_character" msgid="7336470535385009523">"uhlamvu"</string>
+    <string name="granularity_label_word" msgid="7075570328374918660">"igama"</string>
+    <string name="granularity_label_link" msgid="5815508880782488267">"isixhumanisi"</string>
+    <string name="granularity_label_line" msgid="5764267235026120888">"ulayini"</string>
     <string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="factorytest_failed" msgid="5410270329114212041">"Ukuhlola kwemboni kwehlulekile"</string>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 392116f..bda6266 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -34,8 +34,8 @@
     <dimen name="status_bar_height">25dip</dimen>
     <!-- Height of the bottom navigation / system bar. -->
     <dimen name="navigation_bar_height">48dp</dimen>
-    <!-- Height of the bottom navigation bar in portrait -->
-    <dimen name="navigation_bar_height_portrait">@dimen/navigation_bar_height</dimen>
+    <!-- Height of the bottom navigation bar in portrait; often the same as @dimen/navigation_bar_height -->
+    <dimen name="navigation_bar_height_landscape">48dp</dimen>
     <!-- Width of the navigation bar when it is placed vertically on the screen -->
     <dimen name="navigation_bar_width">42dp</dimen>
     <!-- Height of notification icons in the status bar -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 1a631ef..f851e62 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1184,6 +1184,7 @@
   <java-symbol type="bool" name="config_showNavigationBar" />
   <java-symbol type="bool" name="target_honeycomb_needs_options_menu" />
   <java-symbol type="dimen" name="navigation_bar_height" />
+  <java-symbol type="dimen" name="navigation_bar_height_landscape" />
   <java-symbol type="dimen" name="navigation_bar_width" />
   <java-symbol type="dimen" name="status_bar_height" />
   <java-symbol type="drawable" name="ic_jog_dial_sound_off" />
diff --git a/data/fonts/DroidNaskh-Regular-Shift.ttf b/data/fonts/DroidNaskh-Regular-Shift.ttf
index bb9c70c..de475ca 100644
--- a/data/fonts/DroidNaskh-Regular-Shift.ttf
+++ b/data/fonts/DroidNaskh-Regular-Shift.ttf
Binary files differ
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
index 768ee5e..225c11a 100644
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -300,7 +300,7 @@
 
 
 # key 352 "KEY_OK"
-# key 353 "KEY_SELECT"
+key 353   DPAD_CENTER
 # key 354 "KEY_GOTO"
 # key 355 "KEY_CLEAR"
 # key 356 "KEY_POWER2"
diff --git a/docs/html/guide/topics/fundamentals/processes-and-threads.jd b/docs/html/guide/topics/fundamentals/processes-and-threads.jd
index 3d7710c..814d34e 100644
--- a/docs/html/guide/topics/fundamentals/processes-and-threads.jd
+++ b/docs/html/guide/topics/fundamentals/processes-and-threads.jd
@@ -30,11 +30,12 @@
 </div>
 </div>
 
-<p>When an application component starts and the application does not have any other components
+<p>When an application component starts and the process that should host that thread is not already
 running, the Android system starts a new Linux process for the application with a single thread of
 execution. By default, all components of the same application run in the same process and thread
 (called the "main" thread). If an application component starts and there already exists a process
-for that application (because another component from the application exists), then the component is
+for that application (because another component from the application exists or Android has been
+able to retain its previous process cached in the background), then the component is
 started within that process and uses the same thread of execution. However, you can arrange for
 different components in your application to run in separate processes, and you can create additional
 threads for any process.</p>
@@ -86,7 +87,10 @@
 importance are eliminated first, then those with the next lowest importance, and so on, as necessary
 to recover system resources.</p>
 
-<p>There are five levels in the importance hierarchy. The following list presents the different
+<p>The exact mapping of processes to importance and the management of these processes is
+an implementation detail of the platform that changes over time.  Broadly speaking, there
+are five levels in the current implementation that are of most relevance to application
+developers.  The following list presents these different
 types of processes in order of importance (the first process is <em>most important</em> and is
 <em>killed last</em>):</p>
 
@@ -100,18 +104,15 @@
 android.app.Activity}'s {@link android.app.Activity#onResume onResume()} method has been
 called).</li>
 
-        <li>It hosts a {@link android.app.Service} that's bound to the activity that the user is
-interacting with.</li>
-
-        <li>It hosts a {@link android.app.Service} that's running "in the foreground"&mdash;the
-service has called {@link android.app.Service#startForeground startForeground()}.
-
         <li>It hosts a {@link android.app.Service} that's executing one of its lifecycle
 callbacks ({@link android.app.Service#onCreate onCreate()}, {@link android.app.Service#onStart
 onStart()}, or {@link android.app.Service#onDestroy onDestroy()}).</li>
 
         <li>It hosts a {@link android.content.BroadcastReceiver} that's executing its {@link
         android.content.BroadcastReceiver#onReceive onReceive()} method.</li>
+
+        <li>Another foreground process has a dependency on this one: either bound
+        to a Service in this process, or using a Content Provider of the process.</li>
     </ul>
 
     <p>Generally, only a few foreground processes exist at any given time.  They are killed only as
@@ -130,43 +131,79 @@
 This might occur, for example, if the foreground activity started a dialog, which allows the
 previous activity to be seen behind it.</li>
 
-        <li>It hosts a {@link android.app.Service} that's bound to a visible (or foreground)
-activity.</li>
+        <li>Another visible process has a dependency on this one: either bound
+        to a Service in this process, or using a Content Provider of the process.</li>
       </ul>
 
       <p>A visible process is considered extremely important and will not be killed unless doing so
 is required to keep all foreground processes running. </p>
     </li>
 
+  <li><b>Perceptible process</b>
+    <p>A process that doesn't have any foreground or visible components, but is still
+      doing something that is directly perceptible by the user.  A classic example of such
+      a process would be one doing background music playback.  The main way applications
+      get into this state is through {@link android.app.Service#startForeground} or because
+      another perceptible process has a dependency on one of its services or content
+      providers.  In addition, as of {@link android.os.Build.VERSION_CODES#HONEYCOMB},
+      processes can go into this state when {@link android.app.Activity#onStop
+      Activity.onStop()} is executing, allowing the process to continue executing
+      critical code after no longer being visible to the user but before going
+      fully into the background.</p>
+
+      <p>Like visible processes, a perceptible process is considered extremely important
+      and will not be killed unless doing so is required to keep all foreground and
+      visible processes running. </p>
+    </li>
+
   <li><b>Service process</b>
     <p>A process that is running a service that has been started with the {@link
-android.content.Context#startService startService()} method and does not fall into either of the two
+android.content.Context#startService startService()} method and does not fall into any of the
 higher categories. Although service processes are not directly tied to anything the user sees, they
-are generally doing things that the user cares about (such as playing music in the background or
-downloading  data on the network), so the system keeps them running unless there's not enough memory
-to retain them along with all foreground and visible processes. </p>
+are generally doing things that the user cares about (such as downloading a file the user has requested),
+so the system keeps them running unless there's not enough memory to retain them along with all
+foreground and visible processes. </p>
+
+    <p>Even though Android tries to keep these processes running, it is considered normal
+    operation for them to temporarily be killed to support the needs of more important
+    processes.  For example, if the user opens a very heavy-weight web page that needs
+    most of the device's RAM, background services may be temporarily killed to satisfy
+    those needs.  Services in these processes thus must be prepared to deal gracefully
+    with being killed while doing their work and later restarted.</p>
+
+    <p>In recent implementations of Android, there are actually a number of sub-divisions
+    in this area for processes that Android considers more important to the user and so
+    would like to try harder to keep around.  For example, the process hosting the current
+    home app is generally kept in this area so that the user will not see long delays in
+    returning home because that process has been killed.</p>
   </li>
 
-  <li><b>Background process</b>
-    <p>A process holding an activity that's not currently visible to the user  (the activity's
-{@link android.app.Activity#onStop onStop()} method has been called). These processes have no direct
-impact on the user experience, and the system can kill them at any time to reclaim memory for a
-foreground,
-visible, or service process. Usually there are many background processes running, so they are kept
-in an LRU (least recently used) list to ensure that the process with the activity that was most
-recently seen by the user is the last to be killed. If an activity implements its lifecycle methods
+  <li><b>Background (cached) process</b>
+    <p>The final importance level is for processes that are not of current significance.
+    This is basically any process that does not fall into one of the previous levels.
+    These processes have no direct impact on the user experience, and the system can kill
+    them at any time to reclaim memory for the other more important processes.
+    This includes everything from processes holding running activity objects that are not currently
+    visible to the user (the activity's {@link android.app.Activity#onStop onStop()}
+    method has been called) to processes that have no active code at all but may be
+    useful to keep around in case they are needed in the near future.</p>
+
+    <p>Usually there are many background processes being maintained, so they are kept
+    in an LRU list to allow older processes to be killed before more recent ones.  This
+    helps reduce the frequency that new processes need to be creating, facilitating things
+    like more rapid switching between the applications the user has recently visited.
+    However, processes in this state must deal correctly with being killed and later
+    restarted when needed.  For example, if an activity implements its lifecycle methods
 correctly, and saves its current state, killing its process will not have a visible effect on
 the user experience, because when the user navigates back to the activity, the activity restores
 all of its visible state. See the <a
 href="{@docRoot}guide/topics/fundamentals/activities.html#SavingActivityState">Activities</a>
 document for information about saving and restoring state.</p>
-  </li>
 
-  <li><b>Empty process</b>
-    <p>A process that doesn't hold any active application components.  The only reason to keep this
-kind of process alive is for caching purposes, to improve startup time the next time a component
-needs to run in it.  The system often kills these processes in order to balance overall system
-resources between process caches and the underlying kernel caches.</p>
+    <p>Android may also employ other additional policies for killing background processes.  For
+    example, there are typically restrictions on a maximum number of such processes to
+    keep around, and limits on the amount of time they can spend holding wake locks
+    or consuming CPU power until they will be removed.</p>
   </li>
 </ol>
 
@@ -176,23 +213,48 @@
 activity, the process is ranked as a visible process, not a service process.</p>
 
   <p>In addition, a process's ranking might be increased because other processes are dependent on
-it&mdash;a process that is serving another process can never be ranked lower than the process it is
+it&mdash;a process that is serving another process can not generally be ranked lower than the process it is
 serving. For example, if a content provider in process A is serving a client in process B, or if a
-service in process A is bound to a component in process B, process A is always considered at least
+service in process A has been bound to by a client in process B, process A is always considered at least
 as important as process B.</p>
 
   <p>Because a process running a service is ranked higher than a process with background activities,
-an activity that initiates a long-running operation might do well to start a <a
+an activity that initiates a long-running operation may sometimes start a <a
 href="{@docRoot}guide/topics/fundamentals/services.html">service</a> for that operation, rather than
-simply create a worker thread&mdash;particularly if the operation will likely outlast the activity.
+simply create a worker thread&mdash;but only when the operation is a specific task that needs
+to be accomplished regardless of whether the user returns to the application.
 For example, an activity that's uploading a picture to a web site should start a service to perform
 the upload so that the upload can continue in the background even if the user leaves the activity.
 Using a service guarantees that the operation will have at least "service process" priority,
-regardless of what happens to the activity. This is the same reason that broadcast receivers should
-employ services rather than simply put time-consuming operations in a thread.</p>
+regardless of what happens to the activity.  This is not however an approach that should always
+be used.  It would not be appropriate when simply downloading the data for a web page, since
+that can easily be restarted later if the user returns to the web browser.  Allowing
+such a process to be in the background (instead of running a service) gives Android better
+information about how to manage that process in relation to others.
 
+  <p>For a similar reason, broadcast receivers will often employ services rather than
+  simply put time-consuming operations in a thread.</p>
 
+  <p>Some command line tools are available to help you understand how Android is managing
+  its processes.  The most common command is <code>adb shell dumpsys activity</code>
+  which provides a summary of various key state, including at the end a list of the
+  process states, one per line (plus an optional second line for any key dependency
+  on that process), ordered from higher importance to lowest.  The exact
+  contents of these lines has changed across different versions of Android, but the
+  typical state for one process in the list would be:</p>
+  <pre>
+Proc # 2: adj=prcp /F  trm= 0 848:com.google.android.inputmethod.latin/u0a32 (service)
+    com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME<=Proc{417:system/1000}
+</pre>
 
+  <p>This is a perceptible process (adj=prcp) that is running with the foreground
+  scheduling class (/F), and has not recently been told to trim any memory
+  (trm= 0).  Its process id is 848; its name is com.google.android.inputmethod.latin;
+  its Linux uid is u0a32 (10032), and the key state contributing to its current
+  importance level is a service.</p>
+
+  <p>The second line provides the name of the service that is important, because another
+  process has a dependency on it (here the system process).</p>
 
 <h2 id="Threads">Threads</h2>
 
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index f8bb70a..da2192f 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -190,8 +190,17 @@
     while ((status = glGetError()) != GL_NO_ERROR) {
         ALOGD("GL error from OpenGLRenderer: 0x%x", status);
         switch (status) {
+            case GL_INVALID_ENUM:
+                ALOGE("  GL_INVALID_ENUM");
+                break;
+            case GL_INVALID_VALUE:
+                ALOGE("  GL_INVALID_VALUE");
+                break;
+            case GL_INVALID_OPERATION:
+                ALOGE("  GL_INVALID_OPERATION");
+                break;
             case GL_OUT_OF_MEMORY:
-                ALOGE("  OpenGLRenderer is out of memory!");
+                ALOGE("  Out of memory!");
                 break;
         }
     }
@@ -267,17 +276,24 @@
             Functor* f = functors.itemAt(i);
             result |= (*f)(DrawGlInfo::kModeProcess, &info);
 
-            if (result != DrawGlInfo::kStatusDone) {
+            if (result & DrawGlInfo::kStatusDraw) {
                 Rect localDirty(info.dirtyLeft, info.dirtyTop, info.dirtyRight, info.dirtyBottom);
                 dirty.unionWith(localDirty);
+            }
 
-                if (result & DrawGlInfo::kStatusInvoke) {
-                    mFunctors.add(f);
-                }
+            if (result & DrawGlInfo::kStatusInvoke) {
+                mFunctors.add(f);
             }
         }
     }
 
+    // Restore state possibly changed by the functors in process mode
+    GLboolean value;
+    glGetBooleanv(GL_BLEND, &value);
+    mCaches.blend = value;
+
+    mCaches.activeTexture(0);
+
     return result;
 }
 
@@ -2787,6 +2803,7 @@
 void OpenGLRenderer::chooseBlending(bool blend, SkXfermode::Mode mode,
         ProgramDescription& description, bool swapSrcDst) {
     blend = blend || mode != SkXfermode::kSrcOver_Mode;
+
     if (blend) {
         // These blend modes are not supported by OpenGL directly and have
         // to be implemented using shaders. Since the shader will perform
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 41d5c32..2a006c6 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -47,7 +47,6 @@
 
     private final Context mContext;
     private long mVolumeKeyUpTime;
-    private int  mVolumeControlStream = -1;
     private final boolean mUseMasterVolume;
     private static String TAG = "AudioManager";
 
@@ -304,13 +303,6 @@
     public static final int FLAG_VIBRATE = 1 << 4;
 
     /**
-     * forces use of specified stream
-     * @hide
-     */
-    public static final int FLAG_FORCE_STREAM = 1 << 5;
-
-
-    /**
      * Ringer mode that will be silent and will not vibrate. (This overrides the
      * vibrate setting.)
      *
@@ -458,10 +450,6 @@
                                     : ADJUST_LOWER,
                             flags);
                 } else {
-                    if (mVolumeControlStream != -1) {
-                        stream = mVolumeControlStream;
-                        flags |= FLAG_FORCE_STREAM;
-                    }
                     adjustSuggestedStreamVolume(
                             keyCode == KeyEvent.KEYCODE_VOLUME_UP
                                     ? ADJUST_RAISE
@@ -500,10 +488,6 @@
                     }
                 } else {
                     int flags = FLAG_PLAY_SOUND;
-                    if (mVolumeControlStream != -1) {
-                        stream = mVolumeControlStream;
-                        flags |= FLAG_FORCE_STREAM;
-                    }
                     adjustSuggestedStreamVolume(
                             ADJUST_SAME,
                             stream,
@@ -717,6 +701,21 @@
     }
 
     /**
+     * Get the stream type whose volume is driving the UI sounds volume.
+     * UI sounds are screen lock/unlock, camera shutter, key clicks...
+     * @hide
+     */
+    public int getMasterStreamType() {
+        IAudioService service = getService();
+        try {
+            return service.getMasterStreamType();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Dead object in getMasterStreamType", e);
+            return STREAM_RING;
+        }
+    }
+
+    /**
      * Sets the ringer mode.
      * <p>
      * Silent mode will mute the volume and will not vibrate. Vibrate mode will
@@ -943,7 +942,12 @@
      * @hide
      */
     public void forceVolumeControlStream(int streamType) {
-        mVolumeControlStream = streamType;
+        IAudioService service = getService();
+        try {
+            service.forceVolumeControlStream(streamType, mICallBack);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Dead object in forceVolumeControlStream", e);
+        }
     }
 
     /**
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 48d3712..3e958dc 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -149,6 +149,7 @@
     private int mMode;
     // protects mRingerMode
     private final Object mSettingsLock = new Object();
+
     private boolean mMediaServerOk;
 
     private SoundPool mSoundPool;
@@ -201,22 +202,39 @@
         15, // STREAM_DTMF
         15  // STREAM_TTS
     };
-    /* STREAM_VOLUME_ALIAS[] indicates for each stream if it uses the volume settings
+    /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings
      * of another stream: This avoids multiplying the volume settings for hidden
      * stream types that follow other stream behavior for volume settings
-     * NOTE: do not create loops in aliases! */
+     * NOTE: do not create loops in aliases!
+     * Some streams alias to different streams according to device category (phone or tablet) or
+     * use case (in call s off call...).See updateStreamVolumeAlias() for more details
+     *  mStreamVolumeAlias contains the default aliases for a voice capable device (phone) and
+     *  STREAM_VOLUME_ALIAS_NON_VOICE for a non voice capable device (tablet).*/
     private final int[] STREAM_VOLUME_ALIAS = new int[] {
-        AudioSystem.STREAM_VOICE_CALL,  // STREAM_VOICE_CALL
-        AudioSystem.STREAM_SYSTEM,  // STREAM_SYSTEM
-        AudioSystem.STREAM_RING,  // STREAM_RING
-        AudioSystem.STREAM_MUSIC, // STREAM_MUSIC
-        AudioSystem.STREAM_ALARM,  // STREAM_ALARM
-        AudioSystem.STREAM_RING,   // STREAM_NOTIFICATION
-        AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO
-        AudioSystem.STREAM_SYSTEM,  // STREAM_SYSTEM_ENFORCED
-        AudioSystem.STREAM_VOICE_CALL, // STREAM_DTMF
-        AudioSystem.STREAM_MUSIC  // STREAM_TTS
+        AudioSystem.STREAM_VOICE_CALL,      // STREAM_VOICE_CALL
+        AudioSystem.STREAM_RING,            // STREAM_SYSTEM
+        AudioSystem.STREAM_RING,            // STREAM_RING
+        AudioSystem.STREAM_MUSIC,           // STREAM_MUSIC
+        AudioSystem.STREAM_ALARM,           // STREAM_ALARM
+        AudioSystem.STREAM_RING,            // STREAM_NOTIFICATION
+        AudioSystem.STREAM_BLUETOOTH_SCO,   // STREAM_BLUETOOTH_SCO
+        AudioSystem.STREAM_RING,            // STREAM_SYSTEM_ENFORCED
+        AudioSystem.STREAM_RING,            // STREAM_DTMF
+        AudioSystem.STREAM_MUSIC            // STREAM_TTS
     };
+    private final int[] STREAM_VOLUME_ALIAS_NON_VOICE = new int[] {
+        AudioSystem.STREAM_VOICE_CALL,      // STREAM_VOICE_CALL
+        AudioSystem.STREAM_MUSIC,           // STREAM_SYSTEM
+        AudioSystem.STREAM_RING,            // STREAM_RING
+        AudioSystem.STREAM_MUSIC,           // STREAM_MUSIC
+        AudioSystem.STREAM_ALARM,           // STREAM_ALARM
+        AudioSystem.STREAM_RING,            // STREAM_NOTIFICATION
+        AudioSystem.STREAM_BLUETOOTH_SCO,   // STREAM_BLUETOOTH_SCO
+        AudioSystem.STREAM_MUSIC,           // STREAM_SYSTEM_ENFORCED
+        AudioSystem.STREAM_MUSIC,           // STREAM_DTMF
+        AudioSystem.STREAM_MUSIC            // STREAM_TTS
+    };
+    private int[] mStreamVolumeAlias;
 
     private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() {
         public void onError(int error) {
@@ -332,7 +350,7 @@
     // message looper for SoundPool listener
     private Looper mSoundPoolLooper = null;
     // default volume applied to sound played with playSoundEffect()
-    private static final int SOUND_EFFECT_DEFAULT_VOLUME_DB = -20;
+    private static final int SOUND_EFFECT_DEFAULT_VOLUME_DB = 0;
     // volume applied to sound played with playSoundEffect() read from ro.config.sound_fx_volume
     private int SOUND_EFFECT_VOLUME_DB;
     // getActiveStreamType() will return STREAM_NOTIFICATION during this period after a notification
@@ -343,6 +361,14 @@
     // Keyguard manager proxy
     private KeyguardManager mKeyguardManager;
 
+    // mVolumeControlStream is set by VolumePanel to temporarily force the stream type which volume
+    // is controlled by Vol keys.
+    private int  mVolumeControlStream = -1;
+    private final Object mForceControlStreamLock = new Object();
+    // VolumePanel is currently the only client of forceVolumeControlStream() and runs in system
+    // server process so in theory it is not necessary to monitor the client death.
+    // However it is good to be ready for future evolutions.
+    private ForceControlStreamClient mForceControlStreamClient = null;
 
     ///////////////////////////////////////////////////////////////////////////
     // Construction
@@ -365,13 +391,14 @@
                 SOUND_EFFECT_DEFAULT_VOLUME_DB);
 
         mVolumePanel = new VolumePanel(context, this);
+        mMode = AudioSystem.MODE_NORMAL;
         mForcedUseForComm = AudioSystem.FORCE_NONE;
         createAudioSystemThread();
         readPersistedSettings();
         mSettingsObserver = new SettingsObserver();
+        updateStreamVolumeAlias(false /*updateVolumes*/);
         createStreamStates();
 
-        mMode = AudioSystem.MODE_NORMAL;
         mMediaServerOk = true;
 
         // Call setRingerModeInt() to apply correct mute
@@ -450,26 +477,54 @@
         VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes];
 
         for (int i = 0; i < numStreamTypes; i++) {
-            streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[STREAM_VOLUME_ALIAS[i]], i);
+            streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i);
         }
 
         // Correct stream index values for streams with aliases
         for (int i = 0; i < numStreamTypes; i++) {
             int device = getDeviceForStream(i);
-            if (STREAM_VOLUME_ALIAS[i] != i) {
+            if (mStreamVolumeAlias[i] != i) {
                 int index = rescaleIndex(streams[i].getIndex(device, false  /* lastAudible */),
-                                STREAM_VOLUME_ALIAS[i],
+                                mStreamVolumeAlias[i],
                                 i);
                 streams[i].mIndex.put(device, streams[i].getValidIndex(index));
                 streams[i].applyDeviceVolume(device);
                 index = rescaleIndex(streams[i].getIndex(device, true  /* lastAudible */),
-                            STREAM_VOLUME_ALIAS[i],
+                            mStreamVolumeAlias[i],
                             i);
                 streams[i].mLastAudibleIndex.put(device, streams[i].getValidIndex(index));
             }
         }
     }
 
+
+    private void updateStreamVolumeAlias(boolean updateVolumes) {
+        int dtmfStreamAlias;
+        if (mVoiceCapable) {
+            mStreamVolumeAlias = STREAM_VOLUME_ALIAS;
+            dtmfStreamAlias = AudioSystem.STREAM_RING;
+        } else {
+            mStreamVolumeAlias = STREAM_VOLUME_ALIAS_NON_VOICE;
+            dtmfStreamAlias = AudioSystem.STREAM_MUSIC;
+        }
+        if (isInCommunication()) {
+            dtmfStreamAlias = AudioSystem.STREAM_VOICE_CALL;
+        }
+        mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias;
+        if (updateVolumes) {
+            mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias],
+                                                                 false /*lastAudible*/);
+            mStreamStates[AudioSystem.STREAM_DTMF].setAllIndexes(mStreamStates[dtmfStreamAlias],
+                                                                 true /*lastAudible*/);
+            sendMsg(mAudioHandler,
+                    MSG_SET_ALL_VOLUMES,
+                    SENDMSG_QUEUE,
+                    0,
+                    0,
+                    mStreamStates[AudioSystem.STREAM_DTMF], 0);
+        }
+    }
+
     private void readPersistedSettings() {
         final ContentResolver cr = mContentResolver;
 
@@ -538,15 +593,15 @@
     public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
 
         int streamType;
-        if ((flags & AudioManager.FLAG_FORCE_STREAM) != 0) {
-            streamType = suggestedStreamType;
+        if (mVolumeControlStream != -1) {
+            streamType = mVolumeControlStream;
         } else {
             streamType = getActiveStreamType(suggestedStreamType);
         }
 
         // Play sounds on STREAM_RING only and if lock screen is not on.
         if ((flags & AudioManager.FLAG_PLAY_SOUND) != 0 &&
-                ((STREAM_VOLUME_ALIAS[streamType] != AudioSystem.STREAM_RING)
+                ((mStreamVolumeAlias[streamType] != AudioSystem.STREAM_RING)
                  || (mKeyguardManager != null && mKeyguardManager.isKeyguardLocked()))) {
             flags &= ~AudioManager.FLAG_PLAY_SOUND;
         }
@@ -562,7 +617,7 @@
         // use stream type alias here so that streams with same alias have the same behavior,
         // including with regard to silent mode control (e.g the use of STREAM_RING below and in
         // checkForRingerModeChange() in place of STREAM_RING or STREAM_NOTIFICATION)
-        int streamTypeAlias = STREAM_VOLUME_ALIAS[streamType];
+        int streamTypeAlias = mStreamVolumeAlias[streamType];
         VolumeStreamState streamState = mStreamStates[streamTypeAlias];
 
         final int device = getDeviceForStream(streamTypeAlias);
@@ -594,7 +649,7 @@
                 // on last audible index for an alias would not give the correct value
                 int numStreamTypes = AudioSystem.getNumStreamTypes();
                 for (int i = numStreamTypes - 1; i >= 0; i--) {
-                    if (STREAM_VOLUME_ALIAS[i] == streamTypeAlias) {
+                    if (mStreamVolumeAlias[i] == streamTypeAlias) {
                         VolumeStreamState s = mStreamStates[i];
 
                         s.adjustLastAudibleIndex(direction, device);
@@ -647,7 +702,7 @@
     /** @see AudioManager#setStreamVolume(int, int, int) */
     public void setStreamVolume(int streamType, int index, int flags) {
         ensureValidStreamType(streamType);
-        VolumeStreamState streamState = mStreamStates[STREAM_VOLUME_ALIAS[streamType]];
+        VolumeStreamState streamState = mStreamStates[mStreamVolumeAlias[streamType]];
 
         final int device = getDeviceForStream(streamType);
         // get last audible index if stream is muted, current index otherwise
@@ -656,13 +711,13 @@
 
         // setting ring or notifications volume to 0 on voice capable devices enters silent mode
         if (mVoiceCapable && (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
-                (STREAM_VOLUME_ALIAS[streamType] == AudioSystem.STREAM_RING))) {
+                (mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING))) {
             int newRingerMode;
             if (index == 0) {
                 newRingerMode = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1
                     ? AudioManager.RINGER_MODE_VIBRATE
                     : AudioManager.RINGER_MODE_SILENT;
-                setStreamVolumeInt(STREAM_VOLUME_ALIAS[streamType],
+                setStreamVolumeInt(mStreamVolumeAlias[streamType],
                                    index,
                                    device,
                                    false,
@@ -673,8 +728,8 @@
             setRingerMode(newRingerMode);
         }
 
-        index = rescaleIndex(index * 10, streamType, STREAM_VOLUME_ALIAS[streamType]);
-        setStreamVolumeInt(STREAM_VOLUME_ALIAS[streamType], index, device, false, true);
+        index = rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]);
+        setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, false, true);
         // get last audible index if stream is muted, current index otherwise
         index = streamState.getIndex(device,
                                      (streamState.muteCount() != 0) /* lastAudible */);
@@ -682,6 +737,57 @@
         sendVolumeUpdate(streamType, oldIndex, index, flags);
     }
 
+    /** @see AudioManager#forceVolumeControlStream(int) */
+    public void forceVolumeControlStream(int streamType, IBinder cb) {
+        synchronized(mForceControlStreamLock) {
+            mVolumeControlStream = streamType;
+            if (mVolumeControlStream == -1) {
+                if (mForceControlStreamClient != null) {
+                    mForceControlStreamClient.release();
+                    mForceControlStreamClient = null;
+                }
+            } else {
+                mForceControlStreamClient = new ForceControlStreamClient(cb);
+            }
+        }
+    }
+
+    private class ForceControlStreamClient implements IBinder.DeathRecipient {
+        private IBinder mCb; // To be notified of client's death
+
+        ForceControlStreamClient(IBinder cb) {
+            if (cb != null) {
+                try {
+                    cb.linkToDeath(this, 0);
+                } catch (RemoteException e) {
+                    // Client has died!
+                    Log.w(TAG, "ForceControlStreamClient() could not link to "+cb+" binder death");
+                    cb = null;
+                }
+            }
+            mCb = cb;
+        }
+
+        public void binderDied() {
+            synchronized(mForceControlStreamLock) {
+                Log.w(TAG, "SCO client died");
+                if (mForceControlStreamClient != this) {
+                    Log.w(TAG, "unregistered control stream client died");
+                } else {
+                    mForceControlStreamClient = null;
+                    mVolumeControlStream = -1;
+                }
+            }
+        }
+
+        public void release() {
+            if (mCb != null) {
+                mCb.unlinkToDeath(this, 0);
+                mCb = null;
+            }
+        }
+    }
+
     private int findVolumeDelta(int direction, int volume) {
         int delta = 0;
         if (direction == AudioManager.ADJUST_RAISE) {
@@ -904,6 +1010,15 @@
         return Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME);
     }
 
+    /** @see AudioManager#getMasterStreamType(int) */
+    public int getMasterStreamType() {
+        if (mVoiceCapable) {
+            return AudioSystem.STREAM_RING;
+        } else {
+            return AudioSystem.STREAM_MUSIC;
+        }
+    }
+
     /** @see AudioManager#getRingerMode() */
     public int getRingerMode() {
         synchronized(mSettingsLock) {
@@ -944,7 +1059,7 @@
                     // ring and notifications volume should never be 0 when not silenced
                     // on voice capable devices
                     if (mVoiceCapable &&
-                            STREAM_VOLUME_ALIAS[streamType] == AudioSystem.STREAM_RING) {
+                            mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) {
 
                         Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet();
                         Iterator i = set.iterator();
@@ -1184,8 +1299,10 @@
             }
             int streamType = getActiveStreamType(AudioManager.USE_DEFAULT_STREAM_TYPE);
             int device = getDeviceForStream(streamType);
-            int index = mStreamStates[STREAM_VOLUME_ALIAS[streamType]].getIndex(device, false);
-            setStreamVolumeInt(STREAM_VOLUME_ALIAS[streamType], index, device, true, false);
+            int index = mStreamStates[mStreamVolumeAlias[streamType]].getIndex(device, false);
+            setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, true, false);
+
+            updateStreamVolumeAlias(true /*updateVolumes*/);
         }
         return newModeOwnerPid;
     }
@@ -1918,18 +2035,23 @@
         }
     }
 
-    private int getActiveStreamType(int suggestedStreamType) {
+    private boolean isInCommunication() {
+        boolean isOffhook = false;
 
         if (mVoiceCapable) {
-            boolean isOffhook = false;
             try {
                 ITelephony phone = ITelephony.Stub.asInterface(ServiceManager.checkService("phone"));
                 if (phone != null) isOffhook = phone.isOffhook();
             } catch (RemoteException e) {
                 Log.w(TAG, "Couldn't connect to phone service", e);
             }
+        }
+        return (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION);
+    }
 
-            if (isOffhook || getMode() == AudioManager.MODE_IN_COMMUNICATION) {
+    private int getActiveStreamType(int suggestedStreamType) {
+        if (mVoiceCapable) {
+            if (isInCommunication()) {
                 if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)
                         == AudioSystem.FORCE_BT_SCO) {
                     // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO...");
@@ -1950,7 +2072,7 @@
                 return suggestedStreamType;
             }
         } else {
-            if (getMode() == AudioManager.MODE_IN_COMMUNICATION) {
+            if (isInCommunication()) {
                 if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)
                         == AudioSystem.FORCE_BT_SCO) {
                     // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO...");
@@ -2121,7 +2243,7 @@
                 // 0 without the device being in silent mode
                 if ((lastAudibleIndex == 0) &&
                         (mVoiceCapable ||
-                         (STREAM_VOLUME_ALIAS[mStreamType] != AudioSystem.STREAM_MUSIC))) {
+                         (mStreamVolumeAlias[mStreamType] != AudioSystem.STREAM_MUSIC))) {
                     lastAudibleIndex = AudioManager.DEFAULT_STREAM_VOLUME[mStreamType];
                     // Correct the data base
                     sendMsg(mAudioHandler,
@@ -2138,7 +2260,7 @@
                 // this is permitted on tablets for music stream type.
                 if (checkSilentVolume && (index == 0) &&
                         (mVoiceCapable ||
-                         (STREAM_VOLUME_ALIAS[mStreamType] != AudioSystem.STREAM_MUSIC))) {
+                         (mStreamVolumeAlias[mStreamType] != AudioSystem.STREAM_MUSIC))) {
                     index = lastAudibleIndex;
                     // Correct the data base
                     sendMsg(mAudioHandler,
@@ -2198,11 +2320,11 @@
                 // Apply change to all streams using this one as alias
                 int numStreamTypes = AudioSystem.getNumStreamTypes();
                 for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
-                    if (streamType != mStreamType && STREAM_VOLUME_ALIAS[streamType] == mStreamType) {
+                    if (streamType != mStreamType && mStreamVolumeAlias[streamType] == mStreamType) {
                         mStreamStates[streamType].setIndex(rescaleIndex(index,
                                                                         mStreamType,
                                                                         streamType),
-                                                           device,
+                                                           getDeviceForStream(streamType),
                                                            lastAudible);
                     }
                 }
@@ -2241,6 +2363,27 @@
             return mIndexMax;
         }
 
+        public HashMap <Integer, Integer> getAllIndexes(boolean lastAudible) {
+            if (lastAudible) {
+                return mLastAudibleIndex;
+            } else {
+                return mIndex;
+            }
+        }
+
+        public void setAllIndexes(VolumeStreamState srcStream, boolean lastAudible) {
+            HashMap <Integer, Integer> indexes = srcStream.getAllIndexes(lastAudible);
+            Set set = indexes.entrySet();
+            Iterator i = set.iterator();
+            while (i.hasNext()) {
+                Map.Entry entry = (Map.Entry)i.next();
+                int device = ((Integer)entry.getKey()).intValue();
+                int index = ((Integer)entry.getValue()).intValue();
+                index = rescaleIndex(index, srcStream.getStreamType(), mStreamType);
+                setIndex(index, device, lastAudible);
+            }
+        }
+
         public void mute(IBinder cb, boolean state) {
             VolumeDeathHandler handler = getDeathHandler(cb, state);
             if (handler == null) {
@@ -2250,6 +2393,10 @@
             handler.mute(state);
         }
 
+        public int getStreamType() {
+            return mStreamType;
+        }
+
         private int getValidIndex(int index) {
             if (index < 0) {
                 return 0;
@@ -2424,8 +2571,8 @@
             int numStreamTypes = AudioSystem.getNumStreamTypes();
             for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
                 if (streamType != streamState.mStreamType &&
-                        STREAM_VOLUME_ALIAS[streamType] == streamState.mStreamType) {
-                    mStreamStates[streamType].applyDeviceVolume(device);
+                        mStreamVolumeAlias[streamType] == streamState.mStreamType) {
+                    mStreamStates[streamType].applyDeviceVolume(getDeviceForStream(streamType));
                 }
             }
 
@@ -2449,7 +2596,7 @@
             int numStreamTypes = AudioSystem.getNumStreamTypes();
             for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
                 if (streamType != streamState.mStreamType &&
-                        STREAM_VOLUME_ALIAS[streamType] == streamState.mStreamType) {
+                        mStreamVolumeAlias[streamType] == streamState.mStreamType) {
                     mStreamStates[streamType].applyAllVolumes();
                 }
             }
@@ -4085,6 +4232,8 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         // TODO probably a lot more to do here than just the audio focus and remote control stacks
         dumpFocusStack(pw);
         dumpRCStack(pw);
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index b775095..df21040 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -115,4 +115,8 @@
     void startBluetoothSco(IBinder cb);
 
     void stopBluetoothSco(IBinder cb);
+
+    void forceVolumeControlStream(int streamType, IBinder cb);
+
+    int getMasterStreamType();
 }
diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java
index 9fdb81f..5fe58a8 100644
--- a/media/java/android/media/MediaExtractor.java
+++ b/media/java/android/media/MediaExtractor.java
@@ -191,17 +191,33 @@
 
     /** Subsequent calls to {@link #readSampleData}, {@link #getSampleTrackIndex} and
      *  {@link #getSampleTime} only retrieve information for the subset of tracks
-     *  selected by the call below.
-     *  Selecting the same track multiple times has no effect, the track
+     *  selected.
+     *  Selecting the same track multiple times has no effect, the track is
      *  only selected once.
-     *  Media data will be returned in the order of their timestamps.
     */
     public native void selectTrack(int index);
 
-    /** All selected tracks seek near the requested time. The next sample
-     *  returned for each selected track will be a sync sample.
+    /** Subsequent calls to {@link #readSampleData}, {@link #getSampleTrackIndex} and
+     *  {@link #getSampleTime} only retrieve information for the subset of tracks
+     *  selected.
     */
-    public native void seekTo(long timeUs);
+    public native void unselectTrack(int index);
+
+    /** If possible, seek to a sync sample at or before the specified time */
+    public static final int SEEK_TO_PREVIOUS_SYNC       = 0;
+    /** If possible, seek to a sync sample at or after the specified time */
+    public static final int SEEK_TO_NEXT_SYNC           = 1;
+    /** If possible, seek to the sync sample closest to the specified time */
+    public static final int SEEK_TO_CLOSEST_SYNC        = 2;
+    /** If possible, seek to a sample closest to the specified time, which may
+      * NOT be a sync sample!
+      */
+    public static final int SEEK_TO_CLOSEST             = 3;
+
+    /** All selected tracks seek near the requested time according to the
+      * specified mode.
+      */
+    public native void seekTo(long timeUs, int mode);
 
     /** Advance to the next sample. Returns false if no more sample data
      *  is available (end of stream).
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 2175131..e0b33cd 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -257,6 +257,8 @@
         public static final int AAC_PLUS = 4;
         /** @hide enhanced AAC plus audio codec */
         public static final int EAAC_PLUS = 5;
+        /** AAC-ELD audio codec */
+        public static final int AAC_ELD = 6;
     }
 
     /**
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index c41901b..821a251b 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -31,17 +31,16 @@
 import android.mtp.MtpConstants;
 import android.net.Uri;
 import android.os.Environment;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.provider.MediaStore;
-import android.provider.MediaStore.Files.FileColumns;
-import android.provider.Settings;
 import android.provider.MediaStore.Audio;
+import android.provider.MediaStore.Audio.Playlists;
 import android.provider.MediaStore.Files;
+import android.provider.MediaStore.Files.FileColumns;
 import android.provider.MediaStore.Images;
 import android.provider.MediaStore.Video;
-import android.provider.MediaStore.Audio.Playlists;
+import android.provider.Settings;
 import android.sax.Element;
 import android.sax.ElementListener;
 import android.sax.RootElement;
@@ -56,10 +55,8 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.Locale;
 
 import libcore.io.ErrnoException;
@@ -372,6 +369,14 @@
         }
     }
 
+    private static class PlaylistEntry {
+        String path;
+        long bestmatchid;
+        int bestmatchlevel;
+    }
+
+    private ArrayList<PlaylistEntry> mPlaylistEntries = new ArrayList<PlaylistEntry>();
+
     private MediaInserter mMediaInserter;
 
     private ArrayList<FileEntry> mPlayLists;
@@ -1492,93 +1497,83 @@
         return result;
     }
 
-    private boolean addPlayListEntry(String entry, String playListDirectory,
-            Uri uri, ContentValues values, int index, Cursor fileList) {
+    private boolean matchEntries(long rowId, String data) {
 
+        int len = mPlaylistEntries.size();
+        boolean done = true;
+        for (int i = 0; i < len; i++) {
+            PlaylistEntry entry = mPlaylistEntries.get(i);
+            if (entry.bestmatchlevel == Integer.MAX_VALUE) {
+                continue; // this entry has been matched already
+            }
+            done = false;
+            if (data.equalsIgnoreCase(entry.path)) {
+                entry.bestmatchid = rowId;
+                entry.bestmatchlevel = Integer.MAX_VALUE;
+                continue; // no need for path matching
+            }
+
+            int matchLength = matchPaths(data, entry.path);
+            if (matchLength > entry.bestmatchlevel) {
+                entry.bestmatchid = rowId;
+                entry.bestmatchlevel = matchLength;
+            }
+        }
+        return done;
+    }
+
+    private void cachePlaylistEntry(String line, String playListDirectory) {
+        PlaylistEntry entry = new PlaylistEntry();
         // watch for trailing whitespace
-        int entryLength = entry.length();
-        while (entryLength > 0 && Character.isWhitespace(entry.charAt(entryLength - 1))) entryLength--;
+        int entryLength = line.length();
+        while (entryLength > 0 && Character.isWhitespace(line.charAt(entryLength - 1))) entryLength--;
         // path should be longer than 3 characters.
         // avoid index out of bounds errors below by returning here.
-        if (entryLength < 3) return false;
-        if (entryLength < entry.length()) entry = entry.substring(0, entryLength);
+        if (entryLength < 3) return;
+        if (entryLength < line.length()) line = line.substring(0, entryLength);
 
         // does entry appear to be an absolute path?
         // look for Unix or DOS absolute paths
-        char ch1 = entry.charAt(0);
+        char ch1 = line.charAt(0);
         boolean fullPath = (ch1 == '/' ||
-                (Character.isLetter(ch1) && entry.charAt(1) == ':' && entry.charAt(2) == '\\'));
+                (Character.isLetter(ch1) && line.charAt(1) == ':' && line.charAt(2) == '\\'));
         // if we have a relative path, combine entry with playListDirectory
         if (!fullPath)
-            entry = playListDirectory + entry;
-
+            line = playListDirectory + line;
+        entry.path = line;
         //FIXME - should we look for "../" within the path?
 
-        // best matching MediaFile for the play list entry
-        FileEntry bestMatch = null;
+        mPlaylistEntries.add(entry);
+    }
 
-        // number of rightmost file/directory names for bestMatch
-        int bestMatchLength = 0;
-
-        if (fileList != null) {
-            int count = fileList.getCount();
-            // Backing up a little in the cursor helps when the files in the
-            // playlist are not in the same order as they are in the database
-            // but are still close.
-            fileList.move(-1000);
-            while(--count >= 0) {
-                if (!fileList.moveToNext()) {
-                    fileList.moveToFirst();
-                }
-                long rowId = fileList.getLong(FILES_PRESCAN_ID_COLUMN_INDEX);
-                String path = fileList.getString(FILES_PRESCAN_PATH_COLUMN_INDEX);
-                int format = fileList.getInt(FILES_PRESCAN_FORMAT_COLUMN_INDEX);
-                long lastModified = fileList.getLong(FILES_PRESCAN_DATE_MODIFIED_COLUMN_INDEX);
-
-                if (path.equalsIgnoreCase(entry)) {
-                    bestMatch = new FileEntry(rowId, path, lastModified, format);
-                    break;    // don't bother continuing search
-                }
-
-                int matchLength = matchPaths(path, entry);
-                if (matchLength > bestMatchLength) {
-                    bestMatch = new FileEntry(rowId, path, lastModified, format);
-                    bestMatchLength = matchLength;
-                }
+    private void processCachedPlaylist(Cursor fileList, ContentValues values, Uri playlistUri) {
+        fileList.moveToPosition(-1);
+        while (fileList.moveToNext()) {
+            long rowId = fileList.getLong(FILES_PRESCAN_ID_COLUMN_INDEX);
+            String data = fileList.getString(FILES_PRESCAN_PATH_COLUMN_INDEX);
+            if (matchEntries(rowId, data)) {
+                break;
             }
         }
 
-        if (bestMatch == null) {
-            return false;
-        }
-
-        try {
-            // check rowid is set. Rowid may be missing if it is inserted by bulkInsert().
-            if (bestMatch.mRowId == 0) {
-                Cursor c = mMediaProvider.query(mAudioUri, ID_PROJECTION,
-                        MediaStore.Files.FileColumns.DATA + "=?",
-                        new String[] { bestMatch.mPath }, null, null);
-                if (c != null) {
-                    if (c.moveToNext()) {
-                        bestMatch.mRowId = c.getLong(0);
-                    }
-                    c.close();
-                }
-                if (bestMatch.mRowId == 0) {
-                    return false;
+        int len = mPlaylistEntries.size();
+        int index = 0;
+        for (int i = 0; i < len; i++) {
+            PlaylistEntry entry = mPlaylistEntries.get(i);
+            if (entry.bestmatchlevel > 0) {
+                try {
+                    values.clear();
+                    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(index));
+                    values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, Long.valueOf(entry.bestmatchid));
+                    mMediaProvider.insert(playlistUri, values);
+                    index++;
+                } catch (RemoteException e) {
+                    Log.e(TAG, "RemoteException in MediaScanner.processCachedPlaylist()", e);
+                    return;
                 }
             }
-            // OK, now we are ready to add this to the database
-            values.clear();
-            values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(index));
-            values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, Long.valueOf(bestMatch.mRowId));
-            mMediaProvider.insert(uri, values);
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException in MediaScanner.addPlayListEntry()", e);
-            return false;
         }
-
-        return true;
+        mPlaylistEntries.clear();
     }
 
     private void processM3uPlayList(String path, String playListDirectory, Uri uri,
@@ -1590,16 +1585,16 @@
                 reader = new BufferedReader(
                         new InputStreamReader(new FileInputStream(f)), 8192);
                 String line = reader.readLine();
-                int index = 0;
+                mPlaylistEntries.clear();
                 while (line != null) {
                     // ignore comment lines, which begin with '#'
                     if (line.length() > 0 && line.charAt(0) != '#') {
-                        values.clear();
-                        if (addPlayListEntry(line, playListDirectory, uri, values, index, fileList))
-                            index++;
+                        cachePlaylistEntry(line, playListDirectory);
                     }
                     line = reader.readLine();
                 }
+
+                processCachedPlaylist(fileList, values, uri);
             }
         } catch (IOException e) {
             Log.e(TAG, "IOException in MediaScanner.processM3uPlayList()", e);
@@ -1622,20 +1617,19 @@
                 reader = new BufferedReader(
                         new InputStreamReader(new FileInputStream(f)), 8192);
                 String line = reader.readLine();
-                int index = 0;
+                mPlaylistEntries.clear();
                 while (line != null) {
                     // ignore comment lines, which begin with '#'
                     if (line.startsWith("File")) {
                         int equals = line.indexOf('=');
                         if (equals > 0) {
-                            values.clear();
-                            if (addPlayListEntry(line.substring(equals + 1), playListDirectory,
-                                    uri, values, index, fileList))
-                                index++;
+                            cachePlaylistEntry(line, playListDirectory);
                         }
                     }
                     line = reader.readLine();
                 }
+
+                processCachedPlaylist(fileList, values, uri);
             }
         } catch (IOException e) {
             Log.e(TAG, "IOException in MediaScanner.processPlsPlayList()", e);
@@ -1653,15 +1647,9 @@
 
         final ContentHandler handler;
         String playListDirectory;
-        Uri uri;
-        Cursor fileList;
-        ContentValues values = new ContentValues();
-        int index = 0;
 
         public WplHandler(String playListDirectory, Uri uri, Cursor fileList) {
             this.playListDirectory = playListDirectory;
-            this.uri = uri;
-            this.fileList = fileList;
 
             RootElement root = new RootElement("smil");
             Element body = root.getChild("body");
@@ -1676,13 +1664,11 @@
         public void start(Attributes attributes) {
             String path = attributes.getValue("", "src");
             if (path != null) {
-                values.clear();
-                if (addPlayListEntry(path, playListDirectory, uri, values, index, fileList)) {
-                    index++;
-                }
+                cachePlaylistEntry(path, playListDirectory);
             }
         }
 
+       @Override
        public void end() {
        }
 
@@ -1692,15 +1678,18 @@
     }
 
     private void processWplPlayList(String path, String playListDirectory, Uri uri,
-            Cursor fileList) {
+            ContentValues values, Cursor fileList) {
         FileInputStream fis = null;
         try {
             File f = new File(path);
             if (f.exists()) {
                 fis = new FileInputStream(f);
 
+                mPlaylistEntries.clear();
                 Xml.parse(fis, Xml.findEncodingByName("UTF-8"),
                         new WplHandler(playListDirectory, uri, fileList).getContentHandler());
+
+                processCachedPlaylist(fileList, values, uri);
             }
         } catch (SAXException e) {
             e.printStackTrace();
@@ -1762,7 +1751,7 @@
         } else if (fileType == MediaFile.FILE_TYPE_PLS) {
             processPlsPlayList(path, playListDirectory, membersUri, values, fileList);
         } else if (fileType == MediaFile.FILE_TYPE_WPL) {
-            processWplPlayList(path, playListDirectory, membersUri, fileList);
+            processWplPlayList(path, playListDirectory, membersUri, values, fileList);
         }
     }
 
@@ -1800,7 +1789,7 @@
     private native final void native_finalize();
 
     /**
-     * Releases resouces associated with this MediaScanner object.
+     * Releases resources associated with this MediaScanner object.
      * It is considered good practice to call this method when
      * one is done using the MediaScanner object. After this method
      * is called, the MediaScanner object can no longer be used.
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index 0518331..9e1920c 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -96,8 +96,13 @@
     return mImpl->selectTrack(index);
 }
 
-status_t JMediaExtractor::seekTo(int64_t timeUs) {
-    return mImpl->seekTo(timeUs);
+status_t JMediaExtractor::unselectTrack(size_t index) {
+    return mImpl->unselectTrack(index);
+}
+
+status_t JMediaExtractor::seekTo(
+        int64_t timeUs, MediaSource::ReadOptions::SeekMode mode) {
+    return mImpl->seekTo(timeUs, mode);
 }
 
 status_t JMediaExtractor::advance() {
@@ -281,8 +286,8 @@
     }
 }
 
-static void android_media_MediaExtractor_seekTo(
-        JNIEnv *env, jobject thiz, jlong timeUs) {
+static void android_media_MediaExtractor_unselectTrack(
+        JNIEnv *env, jobject thiz, jint index) {
     sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
 
     if (extractor == NULL) {
@@ -290,7 +295,30 @@
         return;
     }
 
-    extractor->seekTo(timeUs);
+    status_t err = extractor->unselectTrack(index);
+
+    if (err != OK) {
+        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+        return;
+    }
+}
+
+static void android_media_MediaExtractor_seekTo(
+        JNIEnv *env, jobject thiz, jlong timeUs, jint mode) {
+    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
+
+    if (extractor == NULL) {
+        jniThrowException(env, "java/lang/IllegalStateException", NULL);
+        return;
+    }
+
+    if (mode < MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC
+            || mode > MediaSource::ReadOptions::SEEK_CLOSEST) {
+        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
+        return;
+    }
+
+    extractor->seekTo(timeUs, (MediaSource::ReadOptions::SeekMode)mode);
 }
 
 static jboolean android_media_MediaExtractor_advance(
@@ -648,7 +676,10 @@
 
     { "selectTrack", "(I)V", (void *)android_media_MediaExtractor_selectTrack },
 
-    { "seekTo", "(J)V", (void *)android_media_MediaExtractor_seekTo },
+    { "unselectTrack", "(I)V",
+        (void *)android_media_MediaExtractor_unselectTrack },
+
+    { "seekTo", "(JI)V", (void *)android_media_MediaExtractor_seekTo },
 
     { "advance", "()Z", (void *)android_media_MediaExtractor_advance },
 
diff --git a/media/jni/android_media_MediaExtractor.h b/media/jni/android_media_MediaExtractor.h
index ef0c48b..2d4627e 100644
--- a/media/jni/android_media_MediaExtractor.h
+++ b/media/jni/android_media_MediaExtractor.h
@@ -18,6 +18,7 @@
 #define _ANDROID_MEDIA_MEDIAEXTRACTOR_H_
 
 #include <media/stagefright/foundation/ABase.h>
+#include <media/stagefright/MediaSource.h>
 #include <utils/Errors.h>
 #include <utils/KeyedVector.h>
 #include <utils/RefBase.h>
@@ -43,8 +44,9 @@
     status_t getTrackFormat(size_t index, jobject *format) const;
 
     status_t selectTrack(size_t index);
+    status_t unselectTrack(size_t index);
 
-    status_t seekTo(int64_t timeUs);
+    status_t seekTo(int64_t timeUs, MediaSource::ReadOptions::SeekMode mode);
 
     status_t advance();
     status_t readSampleData(jobject byteBuf, size_t offset, size_t *sampleSize);
diff --git a/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java b/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
index 436caab..20e4b32 100644
--- a/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
+++ b/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
@@ -160,9 +160,22 @@
     @Override
     public void open(FilterContext context) {
         // Set up SurfaceTexture internals
-        mSurfaceId = context.getGLEnvironment().registerSurfaceTexture(mSurfaceTexture, mScreenWidth, mScreenHeight);
+        mSurfaceId = context.getGLEnvironment().registerSurfaceTexture(
+            mSurfaceTexture, mScreenWidth, mScreenHeight);
+        if (mSurfaceId <= 0) {
+            throw new RuntimeException("Could not register SurfaceTexture: " + mSurfaceTexture);
+        }
     }
 
+
+    @Override
+    public void close(FilterContext context) {
+        if (mSurfaceId > 0) {
+            context.getGLEnvironment().unregisterSurfaceId(mSurfaceId);
+        }
+    }
+
+
     @Override
     public void process(FilterContext context) {
         if (mLogVerbose) Log.v(TAG, "Starting frame processing");
@@ -173,9 +186,11 @@
         Frame input = pullInput("frame");
         boolean createdFrame = false;
 
-        float currentAspectRatio = (float)input.getFormat().getWidth() / input.getFormat().getHeight();
+        float currentAspectRatio =
+          (float)input.getFormat().getWidth() / input.getFormat().getHeight();
         if (currentAspectRatio != mAspectRatio) {
-            if (mLogVerbose) Log.v(TAG, "New aspect ratio: " + currentAspectRatio +", previously: " + mAspectRatio);
+            if (mLogVerbose) Log.v(TAG, "New aspect ratio: " + currentAspectRatio +
+                ", previously: " + mAspectRatio);
             mAspectRatio = currentAspectRatio;
             updateTargetRect();
         }
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
index bbd6bea..2f864d7 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/CameraTest.java
@@ -47,6 +47,7 @@
     private boolean jpegPictureCallbackResult = false;
     
     private static int WAIT_FOR_COMMAND_TO_COMPLETE = 10000;  // Milliseconds.
+    private static final int CAMERA_ID = 0;
     
     private RawPreviewCallback mRawPreviewCallback = new RawPreviewCallback();
     private TestShutterCallback mShutterCallback = new TestShutterCallback();
@@ -85,7 +86,7 @@
                 // Save the looper so that we can terminate this thread 
                 // after we are done with it.
                 mLooper = Looper.myLooper();
-                mCamera = Camera.open();
+                mCamera = Camera.open(CAMERA_ID);
                 startDone.open();
                 Looper.loop();  // Blocks forever until Looper.quit() is called.
                 Log.v(TAG, "initializeMessageLooper: quit.");
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
index 0684946..8e6d5cb 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/mediarecorder/MediaRecorderTest.java
@@ -54,6 +54,8 @@
 
     private int MIN_VIDEO_FPS = 5;
 
+    private static final int CAMERA_ID = 0;
+
     Context mContext;
     Camera mCamera;
   
@@ -247,7 +249,7 @@
     public void testPortraitH263() throws Exception {
         boolean videoRecordedResult = false;
         try {
-            mCamera = Camera.open();
+            mCamera = Camera.open(CAMERA_ID);
             Camera.Parameters parameters = mCamera.getParameters();
             parameters.setPreviewSize(352, 288);
             parameters.set("orientation", "portrait");
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
index db64b94..ccb0638 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -72,6 +72,7 @@
         "/sdcard/mediaMemOutput.txt";
     private static final String MEDIA_PROCMEM_OUTPUT =
         "/sdcard/mediaProcmemOutput.txt";
+    private static final int CAMERA_ID = 0;
 
     private static int mStartMemory = 0;
     private static int mEndMemory = 0;
@@ -132,7 +133,7 @@
                 Looper.prepare();
                 Log.v(TAG, "start loopRun");
                 mLooper = Looper.myLooper();
-                mCamera = Camera.open();
+                mCamera = Camera.open(CAMERA_ID);
                 startDone.open();
                 Looper.loop();
                 Log.v(TAG, "initializeMessageLooper: quit.");
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
index a9c6119..ab9e36c3 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/CameraStressTest.java
@@ -60,6 +60,7 @@
     private static final long WAIT_ZOOM_ANIMATION = 5 * 1000; // 5 seconds
     private static final String CAMERA_STRESS_OUTPUT =
             "/sdcard/cameraStressOutput.txt";
+    private static final int CAMERA_ID = 0;
     private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
 
     private Thread mLooperThread;
@@ -213,7 +214,7 @@
             Log.v(TAG, "Start preview");
             output.write("No of loop: ");
 
-            mCamera = Camera.open();
+            mCamera = Camera.open(CAMERA_ID);
             Camera.Parameters params = mCamera.getParameters();
             mCamera.release();
 
@@ -230,7 +231,7 @@
                     runOnLooper(new Runnable() {
                         @Override
                         public void run() {
-                            mCamera = Camera.open();
+                            mCamera = Camera.open(CAMERA_ID);
                         }
                     });
 
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
index e9bc6f0..62462bd 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
@@ -60,6 +60,8 @@
     private static final String OUTPUT_FILE_EXT = ".3gp";
     private static final String MEDIA_STRESS_OUTPUT =
         "/sdcard/mediaStressOutput.txt";
+    private static final int CAMERA_ID = 0;
+
     private final CameraErrorCallback mCameraErrorCallback = new CameraErrorCallback();
     private final RecorderErrorCallback mRecorderErrorCallback = new RecorderErrorCallback();
 
@@ -162,7 +164,7 @@
                 runOnLooper(new Runnable() {
                     @Override
                     public void run() {
-                        mCamera = Camera.open();
+                        mCamera = Camera.open(CAMERA_ID);
                     }
                 });
                 mCamera.setErrorCallback(mCameraErrorCallback);
@@ -250,7 +252,7 @@
                 runOnLooper(new Runnable() {
                     @Override
                     public void run() {
-                        mCamera = Camera.open();
+                        mCamera = Camera.open(CAMERA_ID);
                     }
                 });
                 mCamera.setErrorCallback(mCameraErrorCallback);
diff --git a/packages/InputDevices/res/raw/keyboard_layout_croatian_and_slovenian.kcm b/packages/InputDevices/res/raw/keyboard_layout_croatian_and_slovenian.kcm
new file mode 100644
index 0000000..eec9d27
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_croatian_and_slovenian.kcm
@@ -0,0 +1,352 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Croatian and Slovenian keyboard layout, QWERTZ style.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 21 Z
+map key 44 Y
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u00b8'
+    base:                               '\u0327'
+    shift:                              '\u0308'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+    ralt:                               '\u0303'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '\u030c'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u0302'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+    ralt:                               '\u0306'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u030a'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+    ralt:                               '\u0328'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '\u0300'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '\u0307'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               '\u0301'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '\u030b'
+}
+
+key SLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '?'
+    ralt:                               '\u0308'
+}
+
+key EQUALS {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '*'
+    ralt:                               '\u0327'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    ralt:                               '\\'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+    ralt:                               '|'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u0160'
+    base:                               '\u0161'
+    shift, capslock:                    '\u0160'
+    ralt:                               '\u00f7'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u0110'
+    base:                               '\u0111'
+    shift, capslock:                    '\u0110'
+    ralt:                               '\u00d7'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+    ralt:                               '['
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+    ralt:                               ']'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+    ralt:                               '\u0268'
+    ralt+shift, ralt+capslock:          '\u0197'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+    ralt:                               '\u0142'
+    ralt+shift, ralt+capslock:          '\u0141'
+}
+
+key SEMICOLON {
+    label:                              '\u010d'
+    base:                               '\u010c'
+    shift, capslock:                    '\u010d'
+}
+
+key APOSTROPHE {
+    label:                              '\u0106'
+    base:                               '\u0107'
+    shift, capslock:                    '\u0106'
+    ralt:                               '\u00df'
+}
+
+key BACKSLASH {
+    label:                              '\u017d'
+    base:                               '\u017e'
+    shift, capslock:                    '\u017d'
+    ralt:                               '\u00a4'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+    ralt:                               '@'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+    ralt:                               '{'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+    ralt:                               '}'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00a7'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+    ralt:                               '<'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+    ralt:                               '>'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_czech.kcm b/packages/InputDevices/res/raw/keyboard_layout_czech.kcm
new file mode 100644
index 0000000..f710a8e
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_czech.kcm
@@ -0,0 +1,348 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Czech keyboard layout.
+#
+
+type OVERLAY
+
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              ';'
+    base:                               ';'
+    shift:                              '\u00b0'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '+'
+    shift:                              '1'
+    ralt:                               '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '\u011b'
+    shift:                              '2'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '\u0161'
+    shift:                              '3'
+    ralt:                               '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '\u010d'
+    shift:                              '4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '\u0159'
+    shift:                              '5'
+    ralt:                               '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '\u017e'
+    shift:                              '6'
+    ralt:                               '^'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '\u00fd'
+    shift:                              '7'
+    ralt:                               '&'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '\u00e1'
+    shift:                              '8'
+    ralt:                               '*'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '\u00ed'
+    shift:                              '9'
+    ralt:                               '('
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '\u00e9'
+    shift:                              '0'
+    ralt:                               ')'
+}
+
+key MINUS {
+    label:                              '='
+    base:                               '='
+    shift:                              '%'
+    ralt:                               '-'
+    ralt+shift:                         '_'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u030c'
+    ralt:                               '='
+    ralt+shift:                         '+'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00fa'
+    base:                               '\u00fa'
+    shift:                              '/'
+    ralt:                               '['
+    ralt+shift:                         '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              ')'
+    base:                               ')'
+    shift:                              '('
+    ralt:                               ']'
+    ralt+shift:                         '}'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u016f'
+    base:                               '\u016f'
+    shift:                              '"'
+    ralt:                               ';'
+    ralt+shift:                         ':'
+}
+
+key APOSTROPHE {
+    label:                              '\u00a7'
+    base:                               '\u00a7'
+    shift:                              '!'
+    ralt:                               '\''
+    ralt+shift:                         '"'
+}
+
+key BACKSLASH {
+    label:                              '\u0308'
+    base:                               '\u0308'
+    shift:                              '\''
+    ralt:                               '\\'
+    ralt+shift:                         '|'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+    ralt:                               '@'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              '?'
+    ralt:                               '<'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+    ralt:                               '>'
+}
+
+key SLASH {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '/'
+    ralt+shift:                         '?'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_danish.kcm b/packages/InputDevices/res/raw/keyboard_layout_danish.kcm
new file mode 100644
index 0000000..9386a45
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_danish.kcm
@@ -0,0 +1,331 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Danish keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u00bd'
+    base:                               '\u00bd'
+    shift:                              '\u00a7'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '\u00a4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '?'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u0300'
+    ralt:                               '|'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00c5'
+    base:                               '\u00e5'
+    shift, capslock:                    '\u00c5'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00a8'
+    base:                               '\u0308'
+    shift:                              '\u0302'
+    ralt:                               '\u0303'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00c6'
+    base:                               '\u00e6'
+    shift, capslock:                    '\u00c6'
+}
+
+key APOSTROPHE {
+    label:                              '\u00d8'
+    base:                               '\u00f8'
+    shift, capslock:                    '\u00d8'
+}
+
+key BACKSLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '*'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '\\'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_estonian.kcm b/packages/InputDevices/res/raw/keyboard_layout_estonian.kcm
new file mode 100644
index 0000000..ef545b8
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_estonian.kcm
@@ -0,0 +1,336 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Estonian keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u02c7'
+    base:                               '\u030c'
+    shift:                              '\u0303'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '\u00a4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '?'
+    ralt:                               '\\'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u0300'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00dc'
+    base:                               '\u00fc'
+    shift, capslock:                    '\u00dc'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00d5'
+    base:                               '\u00f5'
+    shift, capslock:                    '\u00d5'
+    ralt:                               '\u00a7'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u0161'
+    ralt+shift, ralt+capslock:          '\u0160'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+}
+
+key APOSTROPHE {
+    label:                              '\u00c4'
+    base:                               '\u00e4'
+    shift, capslock:                    '\u00c4'
+    ralt:                               '\u0302'
+}
+
+key BACKSLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '*'
+    ralt:                               '\u00bd'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+    ralt:                               '\u017e'
+    ralt+shift, ralt+capslock:          '\u017d'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_finnish.kcm b/packages/InputDevices/res/raw/keyboard_layout_finnish.kcm
new file mode 100644
index 0000000..c6e5ac4
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_finnish.kcm
@@ -0,0 +1,380 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Finnish multilingual keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u00a7'
+    base:                               '\u00a7'
+    shift:                              '\u00bd'
+    ralt:                               '\u0335'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+    ralt+shift:                         '\u00a1'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+    ralt+shift:                         '\u201d'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+    ralt+shift:                         '\u00bb'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '\u00a4'
+    ralt:                               '$'
+    ralt+shift:                         '\u00ab'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u2030'
+    ralt+shift:                         '\u201c'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+    ralt:                               '\u201a'
+    ralt+shift:                         '\u201e'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+    ralt+shift:                         '\u00b0'
+}
+
+key SLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '?'
+    ralt:                               '\\'
+    ralt+shift:                         '\u00bf'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u0300'
+    ralt:                               '\u0327'
+    ralt+shift:                         '\u0328'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+    ralt:                               '\u00fe'
+    ralt+shift, ralt+capslock:          '\u00de'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+    ralt:                               '\u0131'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+    ralt:                               '\u0153'
+    ralt+shift, ralt+capslock:          '\u0152'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+    ralt:                               '\u031b'
+    ralt+shift:                         '\u0309'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00c5'
+    base:                               '\u00e5'
+    shift, capslock:                    '\u00c5'
+    ralt:                               '\u030b'
+    ralt+shift:                         '\u030a'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00a8'
+    base:                               '\u0308'
+    shift:                              '\u0302'
+    ralt:                               '\u0303'
+    ralt+shift:                         '\u0304'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+    ralt:                               '\u0259'
+    ralt+shift, ralt+capslock:          '\u018f'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u00df'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+    ralt:                               '\u00f0'
+    ralt+shift, ralt+capslock:          '\u00d0'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+    ralt:                               '\u0138'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+    ralt:                               '\u0335'
+}
+
+key SEMICOLON {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+    ralt:                               '\u00f8'
+    ralt+shift, ralt+capslock:          '\u00d8'
+}
+
+key APOSTROPHE {
+    label:                              '\u00c4'
+    base:                               '\u00e4'
+    shift, capslock:                    '\u00c4'
+    ralt:                               '\u00e6'
+    ralt+shift, ralt+capslock:          '\u00c6'
+}
+
+key BACKSLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '*'
+    ralt:                               '\u030c'
+    ralt+shift:                         '\u0306'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+    ralt:                               '\u0292'
+    ralt+shift, ralt+capslock:          '\u01b7'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+    ralt:                               '\u00d7'
+    ralt+shift:                         '\u00b7'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+    ralt:                               '\u014b'
+    ralt+shift, ralt+capslock:          '\u014a'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+    ralt+shift:                         '\u2014'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+    ralt:                               '\u2019'
+    ralt+shift:                         '\u2018'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+    ralt:                               '\u0323'
+    ralt+shift:                         '\u0307'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '\u2013'
+    ralt+shift:                         '\u0307'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_hungarian.kcm b/packages/InputDevices/res/raw/keyboard_layout_hungarian.kcm
new file mode 100644
index 0000000..dafb50b
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_hungarian.kcm
@@ -0,0 +1,362 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Hungarian keyboard layout, QWERTZ style.
+#
+
+type OVERLAY
+
+map key 41 0
+map key 11 GRAVE
+map key 12 SLASH
+map key 21 Z
+map key 44 Y
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '\u00a7'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+    ralt:                               '\u0303'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '\u030c'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '+'
+    ralt:                               '\u0302'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '!'
+    ralt:                               '\u0306'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u030a'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '/'
+    ralt:                               '\u0328'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '='
+    ralt:                               '\u0300'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '\u0307'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               '\u0301'
+}
+
+key GRAVE {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+    ralt:                               '\u030b'
+}
+
+key SLASH {
+    label:                              '\u00dc'
+    base:                               '\u00fc'
+    shift, capslock:                    '\u00dc'
+    ralt:                               '\u0308'
+}
+
+key EQUALS {
+    label:                              '\u00d3'
+    base:                               '\u00f3'
+    shift, capslock:                    '\u00d3'
+    ralt:                               '\u0327'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    ralt:                               '\\'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+    ralt:                               '|'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u00c4'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+    ralt:                               '\u20ac'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+    ralt:                               '\u00cd'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u0150'
+    base:                               '\u0151'
+    shift, capslock:                    '\u0150'
+    ralt:                               '\u00f7'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00da'
+    base:                               '\u00fa'
+    shift, capslock:                    '\u00da'
+    ralt:                               '\u00d7'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+    ralt:                               '\u00e4'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u0111'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+    ralt:                               '\u0110'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+    ralt:                               '['
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+    ralt:                               ']'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+    ralt:                               '\u00ed'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+    ralt:                               '\u0197'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+    ralt:                               '\u0141'
+}
+
+key SEMICOLON {
+    label:                              '\u00c9'
+    base:                               '\u00e9'
+    shift, capslock:                    '\u00c9'
+    ralt:                               '$'
+}
+
+key APOSTROPHE {
+    label:                              '\u00c1'
+    base:                               '\u00e1'
+    shift, capslock:                    '\u00c1'
+    ralt:                               '\u00df'
+}
+
+key BACKSLASH {
+    label:                              '\u0170'
+    base:                               '\u0171'
+    shift, capslock:                    '\u0170'
+    ralt:                               '\u00a4'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '\u00cd'
+    base:                               '\u00ed'
+    shift, capslock:                    '\u00cd'
+    ralt:                               '<'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+    ralt:                               '>'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+    ralt:                               '#'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+    ralt:                               '&'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+    ralt:                               '@'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+    ralt:                               '{'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+    ralt:                               '}'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              '?'
+    ralt:                               ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '*'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_icelandic.kcm b/packages/InputDevices/res/raw/keyboard_layout_icelandic.kcm
new file mode 100644
index 0000000..117f58b
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_icelandic.kcm
@@ -0,0 +1,332 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Icelandic keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 EQUALS
+map key 13 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u02da'
+    base:                               '\u030a'
+    shift:                              '\u0308'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u20ac'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key EQUALS {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+    ralt:                               '\\'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    ralt:                               '@'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u0110'
+    base:                               '\u0111'
+    shift, capslock:                    '\u0110'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '?'
+    ralt:                               '~'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00c6'
+    base:                               '\u00e6'
+    shift, capslock:                    '\u00c6'
+}
+
+key APOSTROPHE {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\''
+    ralt:                               '^'
+}
+
+key BACKSLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '*'
+    ralt:                               '`'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key SLASH {
+    label:                              '\u00de'
+    base:                               '\u00fe'
+    shift, capslock:                    '\u00de'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_italian.kcm b/packages/InputDevices/res/raw/keyboard_layout_italian.kcm
new file mode 100644
index 0000000..bd2d25a
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_italian.kcm
@@ -0,0 +1,327 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Italian keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u20ac'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+}
+
+key SLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '?'
+}
+
+key EQUALS {
+    label:                              '\u00ec'
+    base:                               '\u00ec'
+    shift:                              '^'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00e8'
+    base:                               '\u00e8'
+    shift:                              '\u00e9'
+    ralt:                               '['
+    ralt+shift:                         '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '*'
+    ralt:                               ']'
+    ralt+shift:                         '}'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00f2'
+    base:                               '\u00f2'
+    shift:                              '\u00e7'
+    ralt:                               '@'
+}
+
+key APOSTROPHE {
+    label:                              '\u00e0'
+    base:                               '\u00e0'
+    shift:                              '\u00b0'
+    ralt:                               '#'
+}
+
+key BACKSLASH {
+    label:                              '\u00f9'
+    base:                               '\u00f9'
+    shift:                              '\u00a7'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_norwegian.kcm b/packages/InputDevices/res/raw/keyboard_layout_norwegian.kcm
new file mode 100644
index 0000000..d1be485
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_norwegian.kcm
@@ -0,0 +1,330 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Norwegian keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '|'
+    base:                               '|'
+    shift:                              '\u00a7'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '\u00a4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '?'
+}
+
+key EQUALS {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '\u0300'
+    ralt:                               '\u0301'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00c5'
+    base:                               '\u00e5'
+    shift, capslock:                    '\u00c5'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00a8'
+    base:                               '\u0308'
+    shift:                              '\u0302'
+    ralt:                               '\u0303'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00d8'
+    base:                               '\u00f8'
+    shift, capslock:                    '\u00d8'
+}
+
+key APOSTROPHE {
+    label:                              '\u00c6'
+    base:                               '\u00e6'
+    shift, capslock:                    '\u00c6'
+}
+
+key BACKSLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '*'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_portuguese.kcm b/packages/InputDevices/res/raw/keyboard_layout_portuguese.kcm
new file mode 100644
index 0000000..47ee867
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_portuguese.kcm
@@ -0,0 +1,329 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Portuguese keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+    ralt:                               '\u00a7'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '?'
+}
+
+key EQUALS {
+    label:                              '\u00ab'
+    base:                               '\u00ab'
+    shift:                              '\u00bb'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '*'
+    ralt:                               '\u0308'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u0300'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00c7'
+    base:                               '\u00e7'
+    shift, capslock:                    '\u00c7'
+}
+
+key APOSTROPHE {
+    label:                              '\u00ba'
+    base:                               '\u00ba'
+    shift:                              '\u00aa'
+}
+
+key BACKSLASH {
+    label:                              '\u02dc'
+    base:                               '\u0303'
+    shift:                              '\u0302'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '\\'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm b/packages/InputDevices/res/raw/keyboard_layout_russian_mac.kcm
similarity index 98%
rename from packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm
rename to packages/InputDevices/res/raw/keyboard_layout_russian_mac.kcm
index 8c1d596..11c2ad4 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_russian_mac.kcm
@@ -15,7 +15,7 @@
 #
 # Russian keyboard layout.
 # This is a variant of the typical Russian PC keyboard layout that is presented
-# on Apple keyboards.  In contrast with the standard layout, some of the symbols and
+# on Mac keyboards.  In contrast with the standard layout, some of the symbols and
 # punctuation characters have been rearranged.
 # As an added convenience, English characters are accessible using ralt (Alt Gr).
 #
diff --git a/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm b/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm
new file mode 100644
index 0000000..70c1fa4
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_slovak.kcm
@@ -0,0 +1,353 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Slovak keyboard layout.
+#
+
+type OVERLAY
+
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              ';'
+    base:                               ';'
+    shift:                              '\u00b0'
+    ralt:                               '`'
+    ralt+shift:                         '~'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '+'
+    shift:                              '1'
+    ralt:                               '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '\u013e'
+    shift:                              '2'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '\u0161'
+    shift:                              '3'
+    ralt:                               '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '\u010d'
+    shift:                              '4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '\u0165'
+    shift:                              '5'
+    ralt:                               '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '\u017e'
+    shift:                              '6'
+    ralt:                               '^'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '\u00fd'
+    shift:                              '7'
+    ralt:                               '&'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '\u00e1'
+    shift:                              '8'
+    ralt:                               '*'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '\u00ed'
+    shift:                              '9'
+    ralt:                               '('
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '\u00e9'
+    shift:                              '0'
+    ralt:                               ')'
+}
+
+key MINUS {
+    label:                              '='
+    base:                               '='
+    shift:                              '%'
+    ralt:                               '-'
+    ralt+shift:                         '_'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u030c'
+    ralt:                               '='
+    ralt+shift:                         '+'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    ralt:                               '\\'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+    ralt:                               '|'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00fa'
+    base:                               '\u00fa'
+    shift:                              '/'
+    ralt:                               '['
+    ralt+shift:                         '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00e4'
+    base:                               '\u00e4'
+    shift:                              '('
+    ralt:                               ']'
+    ralt+shift:                         '}'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00f4'
+    base:                               '\u00f4'
+    shift:                              '"'
+    ralt:                               ';'
+    ralt+shift:                         ':'
+}
+
+key APOSTROPHE {
+    label:                              '\u00a7'
+    base:                               '\u00a7'
+    shift:                              '!'
+    ralt:                               '\''
+    ralt+shift:                         '"'
+}
+
+key BACKSLASH {
+    label:                              '\u0148'
+    base:                               '\u0148'
+    shift:                              ')'
+    ralt:                               '\\'
+    ralt+shift:                         '|'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+    ralt:                               '&'
+    ralt+shift:                         '*'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+    ralt:                               '@'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              '?'
+    ralt:                               '<'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+    ralt:                               '>'
+}
+
+key SLASH {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '/'
+    ralt+shift:                         '?'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_swedish.kcm b/packages/InputDevices/res/raw/keyboard_layout_swedish.kcm
new file mode 100644
index 0000000..e42bd6c
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_swedish.kcm
@@ -0,0 +1,331 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Swedish keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 53 MINUS
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '\u00a7'
+    base:                               '\u00a7'
+    shift:                              '\u00bd'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '"'
+    ralt:                               '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+    ralt:                               '\u00a3'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '\u00a4'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '+'
+    base:                               '+'
+    shift:                              '?'
+    ralt:                               '\\'
+}
+
+key EQUALS {
+    label:                              '\u00b4'
+    base:                               '\u0301'
+    shift:                              '\u0300'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u00c5'
+    base:                               '\u00e5'
+    shift, capslock:                    '\u00c5'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00a8'
+    base:                               '\u0308'
+    shift:                              '\u0302'
+    ralt:                               '\u0303'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+}
+
+key APOSTROPHE {
+    label:                              '\u00c4'
+    base:                               '\u00e4'
+    shift, capslock:                    '\u00c4'
+}
+
+key BACKSLASH {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '*'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '|'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+    ralt:                               '\u00b5'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_turkish.kcm b/packages/InputDevices/res/raw/keyboard_layout_turkish.kcm
new file mode 100644
index 0000000..e193d34
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_turkish.kcm
@@ -0,0 +1,347 @@
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Turkish keyboard layout.
+#
+
+type OVERLAY
+
+map key 12 SLASH
+map key 13 MINUS
+map key 43 COMMA
+map key 51 EQUALS
+map key 52 BACKSLASH
+map key 53 PERIOD
+map key 86 PLUS
+
+### ROW 1
+
+key GRAVE {
+    label:                              '"'
+    base:                               '"'
+    shift:                              '\u00e9'
+    ralt:                               '<'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+    ralt:                               '>'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '\''
+    ralt:                               '\u00a3'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '\u0302'
+    ralt:                               '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '+'
+    ralt:                               '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+    ralt:                               '\u00bd'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '&'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '/'
+    ralt:                               '{'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '('
+    ralt:                               '['
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              ')'
+    ralt:                               ']'
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              '='
+    ralt:                               '}'
+}
+
+key SLASH {
+    label:                              '*'
+    base:                               '*'
+    shift:                              '?'
+    ralt:                               '\\'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+    ralt:                               '|'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+    ralt:                               '@'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u20ac'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               '\u0131'
+    shift, capslock:                    'I'
+    ralt:                               'i'
+    ralt+shift, ralt+capslock:          '\u0130'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '\u011e'
+    base:                               '\u011f'
+    shift, capslock:                    '\u011e'
+    ralt:                               '\u0308'
+}
+
+key RIGHT_BRACKET {
+    label:                              '\u00dc'
+    base:                               '\u00fc'
+    shift, capslock:                    '\u00dc'
+    ralt:                               '\u0303'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+    ralt:                               '\u00e6'
+    ralt+shift, ralt+capslock:          '\u00c6'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u00df'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+}
+
+key SEMICOLON {
+    label:                              '\u015e'
+    base:                               '\u015f'
+    shift, capslock:                    '\u015e'
+    ralt:                               '\u0301'
+}
+
+key APOSTROPHE {
+    label:                              '\u0130'
+    base:                               'i'
+    shift, capslock:                    '\u0130'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              ';'
+    ralt:                               '\u0300'
+}
+
+### ROW 4
+
+key PLUS {
+    label:                              '<'
+    base:                               '<'
+    shift:                              '>'
+    ralt:                               '\\'
+}
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key EQUALS {
+    label:                              '\u00d6'
+    base:                               '\u00f6'
+    shift, capslock:                    '\u00d6'
+}
+
+key BACKSLASH {
+    label:                              '\u00c7'
+    base:                               '\u00e7'
+    shift, capslock:                    '\u00c7'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              ':'
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
similarity index 90%
copy from packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm
copy to packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
index 8c1d596..a802460 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_russian_apple.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
@@ -13,10 +13,8 @@
 # limitations under the License.
 
 #
-# Russian keyboard layout.
-# This is a variant of the typical Russian PC keyboard layout that is presented
-# on Apple keyboards.  In contrast with the standard layout, some of the symbols and
-# punctuation characters have been rearranged.
+# Ukrainian keyboard layout.
+# This is a typical Ukrainian PC keyboard layout.
 # As an added convenience, English characters are accessible using ralt (Alt Gr).
 #
 
@@ -27,11 +25,11 @@
 ### ROW 1
 
 key GRAVE {
-    label:                              '>'
-    base:                               '>'
-    shift:                              '<'
-    ralt:                               '\u00a7'
-    ralt+shift:                         '\u00b1'
+    label:                              '\u0401'
+    base:                               '\u0451'
+    shift, capslock:                    '\u0401'
+    ralt:                               '`'
+    ralt+shift:                         '~'
 }
 
 key 1 {
@@ -58,35 +56,35 @@
 key 4 {
     label:                              '4'
     base:                               '4'
-    shift:                              '%'
+    shift:                              ';'
     ralt:                               '$'
 }
 
 key 5 {
     label:                              '5'
     base:                               '5'
-    shift:                              ':'
+    shift:                              '%'
     ralt:                               '%'
 }
 
 key 6 {
     label:                              '6'
     base:                               '6'
-    shift:                              ','
+    shift:                              ':'
     ralt:                               '^'
 }
 
 key 7 {
     label:                              '7'
     base:                               '7'
-    shift:                              '.'
+    shift:                              '?'
     ralt:                               '&'
 }
 
 key 8 {
     label:                              '8'
     base:                               '8'
-    shift:                              ';'
+    shift:                              '*'
     ralt:                               '*'
 }
 
@@ -211,9 +209,9 @@
 }
 
 key RIGHT_BRACKET {
-    label:                              '\u042a'
-    base:                               '\u044a'
-    shift, capslock:                    '\u042a'
+    label:                              '\u0407'
+    base:                               '\u0457'
+    shift, capslock:                    '\u0407'
     ralt:                               ']'
     ralt+shift:                         '}'
 }
@@ -229,9 +227,9 @@
 }
 
 key S {
-    label:                              '\u042b'
-    base:                               '\u044b'
-    shift, capslock:                    '\u042b'
+    label:                              '\u0406'
+    base:                               '\u0456'
+    shift, capslock:                    '\u0406'
     ralt:                               's'
     ralt+shift, ralt+capslock:          'S'
 }
@@ -301,29 +299,28 @@
 }
 
 key APOSTROPHE {
-    label:                              '\u042d'
-    base:                               '\u044d'
-    shift, capslock:                    '\u042d'
+    label:                              '\u0404'
+    base:                               '\u0454'
+    shift, capslock:                    '\u0404'
     ralt:                               '\''
     ralt+shift:                         '"'
 }
 
 key BACKSLASH {
-    label:                              '\u0401'
-    base:                               '\u0451'
-    shift, capslock:                    '\u0401'
-    ralt:                               '\\'
-    ralt+shift:                         '|'
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '/'
+    ralt:                               '|'
 }
 
 ### ROW 4
 
 key PLUS {
-    label:                              '['
-    base:                               '['
-    shift:                              ']'
-    ralt:                               '`'
-    ralt+shift:                         '~'
+    label:                              '\u0490'
+    base:                               '\u0491'
+    shift, capslock:                    '\u0490'
+    ralt:                               '\\'
+    ralt+shift:                         '|'
 }
 
 key Z {
@@ -399,9 +396,9 @@
 }
 
 key SLASH {
-    label:                              '/'
-    base:                               '/'
-    shift:                              '?'
+    label:                              '.'
+    base:                               '.'
+    shift:                              ','
     ralt:                               '/'
     ralt+shift:                         '?'
 }
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index 95e7401..140c7d4 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -7,7 +7,7 @@
     <string name="keyboard_layout_english_us_label">English (US)</string>
 
     <!-- US English (Dvorak style) keyboard layout label. [CHAR LIMIT=35] -->
-    <string name="keyboard_layout_english_us_dvorak_label">English (US), Dvorak</string>
+    <string name="keyboard_layout_english_us_dvorak_label">English (US), Dvorak style</string>
 
     <!-- German keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_german_label">German</string>
@@ -21,8 +21,8 @@
     <!-- Russian keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_russian_label">Russian</string>
 
-    <!-- Russian (Apple style) keyboard layout label. [CHAR LIMIT=35] -->
-    <string name="keyboard_layout_russian_apple_label">Russian, Apple</string>
+    <!-- Russian (Mac style) keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_russian_mac_label">Russian, Mac style</string>
 
     <!-- Spanish keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_spanish_label">Spanish</string>
@@ -38,4 +38,49 @@
 
     <!-- Bulgarian keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_bulgarian">Bulgarian</string>
+
+    <!-- Italian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_italian">Italian</string>
+
+    <!-- Danish keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_danish">Danish</string>
+
+    <!-- Norwegian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_norwegian">Norwegian</string>
+
+    <!-- Swedish keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_swedish">Swedish</string>
+
+    <!-- Finnish keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_finnish">Finnish</string>
+
+    <!-- Croatian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_croatian">Croatian</string>
+
+    <!-- Czech keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_czech">Czech</string>
+
+    <!-- Estonian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_estonian">Estonian</string>
+
+    <!-- Hungarian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_hungarian">Hungarian</string>
+
+    <!-- Icelandic keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_icelandic">Icelandic</string>
+
+    <!-- Portuguese keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_portuguese">Portuguese</string>
+
+    <!-- Slovak keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_slovak">Slovak</string>
+
+    <!-- Slovenian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_slovenian">Slovenian</string>
+
+    <!-- Turkish keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_turkish">Turkish</string>
+
+    <!-- Ukrainian keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_ukrainian">Ukrainian</string>
 </resources>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 50672a1..23f6bcb 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -24,9 +24,9 @@
             android:label="@string/keyboard_layout_russian_label"
             android:kcm="@raw/keyboard_layout_russian" />
 
-    <keyboard-layout android:name="keyboard_layout_russian_apple"
-            android:label="@string/keyboard_layout_russian_apple_label"
-            android:kcm="@raw/keyboard_layout_russian_apple" />
+    <keyboard-layout android:name="keyboard_layout_russian_mac"
+            android:label="@string/keyboard_layout_russian_mac_label"
+            android:kcm="@raw/keyboard_layout_russian_mac" />
 
     <keyboard-layout android:name="keyboard_layout_spanish"
             android:label="@string/keyboard_layout_spanish_label"
@@ -47,4 +47,64 @@
     <keyboard-layout android:name="keyboard_layout_bulgarian"
             android:label="@string/keyboard_layout_bulgarian"
             android:kcm="@raw/keyboard_layout_bulgarian" />
+
+    <keyboard-layout android:name="keyboard_layout_italian"
+            android:label="@string/keyboard_layout_italian"
+            android:kcm="@raw/keyboard_layout_italian" />
+
+    <keyboard-layout android:name="keyboard_layout_danish"
+            android:label="@string/keyboard_layout_danish"
+            android:kcm="@raw/keyboard_layout_danish" />
+
+    <keyboard-layout android:name="keyboard_layout_norwegian"
+            android:label="@string/keyboard_layout_norwegian"
+            android:kcm="@raw/keyboard_layout_norwegian" />
+
+    <keyboard-layout android:name="keyboard_layout_swedish"
+            android:label="@string/keyboard_layout_swedish"
+            android:kcm="@raw/keyboard_layout_swedish" />
+
+    <keyboard-layout android:name="keyboard_layout_finnish"
+            android:label="@string/keyboard_layout_finnish"
+            android:kcm="@raw/keyboard_layout_finnish" />
+
+    <keyboard-layout android:name="keyboard_layout_croatian"
+            android:label="@string/keyboard_layout_croatian"
+            android:kcm="@raw/keyboard_layout_croatian_and_slovenian" />
+
+    <keyboard-layout android:name="keyboard_layout_czech"
+            android:label="@string/keyboard_layout_czech"
+            android:kcm="@raw/keyboard_layout_czech" />
+
+    <keyboard-layout android:name="keyboard_layout_estonian"
+            android:label="@string/keyboard_layout_estonian"
+            android:kcm="@raw/keyboard_layout_estonian" />
+
+    <keyboard-layout android:name="keyboard_layout_hungarian"
+            android:label="@string/keyboard_layout_hungarian"
+            android:kcm="@raw/keyboard_layout_hungarian" />
+
+    <keyboard-layout android:name="keyboard_layout_icelandic"
+            android:label="@string/keyboard_layout_icelandic"
+            android:kcm="@raw/keyboard_layout_icelandic" />
+
+    <keyboard-layout android:name="keyboard_layout_portuguese"
+            android:label="@string/keyboard_layout_portuguese"
+            android:kcm="@raw/keyboard_layout_portuguese" />
+
+    <keyboard-layout android:name="keyboard_layout_slovak"
+            android:label="@string/keyboard_layout_slovak"
+            android:kcm="@raw/keyboard_layout_slovak" />
+
+    <keyboard-layout android:name="keyboard_layout_slovenian"
+            android:label="@string/keyboard_layout_slovenian"
+            android:kcm="@raw/keyboard_layout_croatian_and_slovenian" />
+
+    <keyboard-layout android:name="keyboard_layout_turkish"
+            android:label="@string/keyboard_layout_turkish"
+            android:kcm="@raw/keyboard_layout_turkish" />
+
+    <keyboard-layout android:name="keyboard_layout_ukrainian"
+            android:label="@string/keyboard_layout_ukrainian"
+            android:kcm="@raw/keyboard_layout_ukrainian" />
 </keyboard-layouts>
diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml
index 8fbab74..b905db3 100644
--- a/packages/SystemUI/res/layout/navigation_bar.xml
+++ b/packages/SystemUI/res/layout/navigation_bar.xml
@@ -54,6 +54,7 @@
                 android:src="@drawable/ic_sysbar_back"
                 systemui:keyCode="4"
                 android:layout_weight="0"
+                android:scaleType="center"
                 systemui:glowBackground="@drawable/ic_sysbar_highlight"
                 android:contentDescription="@string/accessibility_back"
                 />
@@ -214,6 +215,7 @@
                 android:layout_height="80dp"
                 android:layout_width="match_parent"
                 android:src="@drawable/ic_sysbar_back_land"
+                android:scaleType="center"
                 systemui:keyCode="4"
                 android:layout_weight="0"
                 android:contentDescription="@string/accessibility_back"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 0ba8cce..f565e75 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -29,6 +29,17 @@
     android:fitsSystemWindows="true"
     >
 
+    <ImageView
+        android:id="@+id/notification_lights_out"
+        android:layout_width="@dimen/status_bar_icon_size"
+        android:layout_height="match_parent"
+        android:paddingLeft="6dip"
+		android:paddingBottom="2dip"
+        android:src="@drawable/ic_sysbar_lights_out_dot_small"
+        android:scaleType="center"
+        android:visibility="gone"
+        />
+
     <LinearLayout android:id="@+id/icons"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
@@ -38,6 +49,7 @@
         >
 
         <LinearLayout
+			android:id="@+id/notification_icon_area"
             android:layout_width="0dip"
             android:layout_height="match_parent"
             android:layout_weight="1"
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 3981701..9fd8d35 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -114,7 +114,7 @@
     <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
     <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
     <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
-    <string name="accessibility_no_sim" msgid="8274017118472455155">"Žádná karta SIM."</string>
+    <string name="accessibility_no_sim" msgid="8274017118472455155">"Žádná SIM karta."</string>
     <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Tethering přes Bluetooth."</string>
     <string name="accessibility_airplane_mode" msgid="834748999790763092">"Režim V letadle."</string>
     <!-- String.format failed for translation -->
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 39832fc..ac07e9b 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -141,5 +141,5 @@
     <string name="gps_notification_found_text" msgid="4619274244146446464">"Standort durch GPS festgelegt"</string>
     <string name="accessibility_clear_all" msgid="5235938559247164925">"Alle Benachrichtigungen löschen"</string>
     <string name="dreams_dock_launcher" msgid="3541196417659166245">"Bildschirmschoner aktivieren"</string>
-    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-Info"</string>
+    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-Details"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index f5ac4d4..6ad380a 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -139,5 +139,5 @@
     <string name="gps_notification_found_text" msgid="4619274244146446464">"ตำแหน่งที่กำหนดโดย GPS"</string>
     <string name="accessibility_clear_all" msgid="5235938559247164925">"ล้างการแจ้งเตือนทั้งหมด"</string>
     <string name="dreams_dock_launcher" msgid="3541196417659166245">"เปิดโปรแกรมรักษาหน้าจอ"</string>
-    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลแอปพลิเคชัน"</string>
+    <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลแอป"</string>
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
index 1ae15be..ae568f8 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java
@@ -111,14 +111,6 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
-                != PackageManager.PERMISSION_GRANTED) {
-            pw.println("Permission Denial: can't dump StatusBar from from pid="
-                    + Binder.getCallingPid()
-                    + ", uid=" + Binder.getCallingUid());
-            return;
-        }
-
         if (args == null || args.length == 0) {
             for (SystemUI ui: mServices) {
                 pw.println("dumping service: " + ui.getClass().getName());
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index fe7d5aa..3c30f5d 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -241,7 +241,7 @@
                 if (soundUri != null) {
                     final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
                     if (sfx != null) {
-                        sfx.setStreamType(AudioManager.STREAM_NOTIFICATION);
+                        sfx.setStreamType(AudioManager.STREAM_SYSTEM);
                         sfx.play();
                     }
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 73c5d3a..4bb2d1d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -23,6 +23,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.Message;
 import android.os.ServiceManager;
@@ -35,6 +36,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Surface;
+import android.view.Window;
 import android.view.WindowManager;
 import android.view.WindowManagerImpl;
 import android.widget.ImageView;
@@ -71,6 +73,8 @@
     int mDisabledFlags = 0;
     int mNavigationIconHints = 0;
 
+    private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon;
+    
     private DelegateViewHelper mDelegateHelper;
 
     // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288)
@@ -146,6 +150,11 @@
         mVertical = false;
         mShowMenu = false;
         mDelegateHelper = new DelegateViewHelper(this);
+
+        mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
+        mBackLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_land);
+        mBackAltIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime);
+        mBackAltLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime);
     }
 
     View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
@@ -188,10 +197,10 @@
         getRecentsButton().setAlpha(
             (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f);
 
-        ((ImageView)getBackButton()).setImageResource(
+        ((ImageView)getBackButton()).setImageDrawable(
             (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT))
-                ? R.drawable.ic_sysbar_back_ime
-                : R.drawable.ic_sysbar_back);
+                ? (mVertical ? mBackAltLandIcon : mBackAltIcon)
+                : (mVertical ? mBackLandIcon : mBackIcon));
     }
 
     public void setDisabledFlags(int disabledFlags) {
@@ -250,7 +259,7 @@
         } else {
             navButtons.animate()
                 .alpha(lightsOut ? 0f : 1f)
-                .setDuration(lightsOut ? 600 : 200)
+                .setDuration(lightsOut ? 750 : 250)
                 .start();
 
             lowLights.setOnTouchListener(mLightsOutListener);
@@ -260,8 +269,7 @@
             }
             lowLights.animate()
                 .alpha(lightsOut ? 1f : 0f)
-                .setStartDelay(lightsOut ? 500 : 0)
-                .setDuration(lightsOut ? 1000 : 300)
+                .setDuration(lightsOut ? 750 : 250)
                 .setInterpolator(new AccelerateInterpolator(2.0f))
                 .setListener(lightsOut ? null : new AnimatorListenerAdapter() {
                     @Override
@@ -304,7 +312,6 @@
         }
         mCurrentView = mRotatedViews[rot];
         mCurrentView.setVisibility(View.VISIBLE);
-        mVertical = (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270);
 
         // force the low profile & disabled states into compliance
         setLowProfile(mLowProfile, false, true /* force */);
@@ -326,6 +333,14 @@
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         if (DEBUG) Slog.d(TAG, String.format(
                     "onSizeChanged: (%dx%d) old: (%dx%d)", w, h, oldw, oldh));
+
+        final boolean newVertical = w > 0 && h > w;
+        if (newVertical != mVertical) {
+            mVertical = newVertical;
+            //Slog.v(TAG, String.format("onSizeChanged: h=%d, w=%d, vert=%s", h, w, mVertical?"y":"n"));
+            reorient();
+        }
+
         postCheckForInvalidLayout("sizeChanged");
         super.onSizeChanged(w, h, oldw, oldh);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 80ee64f..8586185 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -16,6 +16,9 @@
 
 package com.android.systemui.statusbar.phone;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.app.ActivityManager;
 import android.app.ActivityManagerNative;
@@ -55,6 +58,7 @@
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.WindowManagerImpl;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.widget.ImageView;
@@ -207,6 +211,8 @@
     int[] mAbsPos = new int[2];
     Runnable mPostCollapseCleanup = null;
 
+    private AnimatorSet mLightsOutAnimation;
+    private AnimatorSet mLightsOnAnimation;
 
     // for disabling the status bar
     int mDisabled = 0;
@@ -935,7 +941,26 @@
             mClearButton.setAlpha(clearable ? 1.0f : 0.0f);
         }
         mClearButton.setEnabled(clearable);
-
+        
+        final View nlo = mStatusBarView.findViewById(R.id.notification_lights_out);
+        final boolean showDot = (any&&!areLightsOn());
+        if (showDot != (nlo.getAlpha() == 1.0f)) {
+            if (showDot) {
+                nlo.setAlpha(0f);
+                nlo.setVisibility(View.VISIBLE);
+            }
+            nlo.animate()
+                .alpha(showDot?1:0)
+                .setDuration(showDot?750:250)
+                .setInterpolator(new AccelerateInterpolator(2.0f))
+                .setListener(showDot ? null : new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator _a) {
+                        nlo.setVisibility(View.GONE);
+                    }
+                })
+                .start();
+        }
     }
 
     public void showClock(boolean show) {
@@ -1372,6 +1397,10 @@
         final int hitSize = statusBarSize*2;
         final int y = (int)event.getRawY();
         if (action == MotionEvent.ACTION_DOWN) {
+            if (!areLightsOn()) {
+                setLightsOn(true);
+            }
+
             if (!mExpanded) {
                 mViewDelta = statusBarSize - y;
             } else {
@@ -1470,16 +1499,64 @@
                 final boolean lightsOut = (0 != (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE));
                 if (lightsOut) {
                     animateCollapse();
+                    if (mTicking) {
+                        mTicker.halt();
+                    }
                 }
+                
                 if (mNavigationBarView != null) {
                     mNavigationBarView.setLowProfile(lightsOut);
                 }
+                
+                setStatusBarLowProfile(lightsOut);
             }
 
             notifyUiVisibilityChanged();
         }
     }
 
+    private void setStatusBarLowProfile(boolean lightsOut) {
+        if (mLightsOutAnimation == null) {
+            final View notifications = mStatusBarView.findViewById(R.id.notification_icon_area);
+            final View systemIcons = mStatusBarView.findViewById(R.id.statusIcons);
+            final View signal = mStatusBarView.findViewById(R.id.signal_cluster);
+            final View battery = mStatusBarView.findViewById(R.id.battery);
+            final View clock = mStatusBarView.findViewById(R.id.clock);
+
+            mLightsOutAnimation = new AnimatorSet();
+            mLightsOutAnimation.playTogether(
+                    ObjectAnimator.ofFloat(notifications, View.ALPHA, 0),
+                    ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 0),
+                    ObjectAnimator.ofFloat(signal, View.ALPHA, 0),
+                    ObjectAnimator.ofFloat(battery, View.ALPHA, 0.5f),
+                    ObjectAnimator.ofFloat(clock, View.ALPHA, 0.5f)
+                );
+            mLightsOutAnimation.setDuration(750);
+            
+            mLightsOnAnimation = new AnimatorSet();
+            mLightsOnAnimation.playTogether(
+                    ObjectAnimator.ofFloat(notifications, View.ALPHA, 1),
+                    ObjectAnimator.ofFloat(systemIcons, View.ALPHA, 1),
+                    ObjectAnimator.ofFloat(signal, View.ALPHA, 1),
+                    ObjectAnimator.ofFloat(battery, View.ALPHA, 1),
+                    ObjectAnimator.ofFloat(clock, View.ALPHA, 1)
+                );
+            mLightsOnAnimation.setDuration(250);
+        }
+        
+        mLightsOutAnimation.cancel();
+        mLightsOnAnimation.cancel();
+
+        final Animator a = lightsOut ? mLightsOutAnimation : mLightsOnAnimation;
+        a.start();
+
+        setAreThereNotifications();
+    }
+
+    private boolean areLightsOn() {
+        return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
+    }
+    
     public void setLightsOn(boolean on) {
         Log.v(TAG, "setLightsOn(" + on + ")");
         if (on) {
@@ -1580,6 +1657,9 @@
     }
 
     private void tick(StatusBarNotification n) {
+        // no ticking in lights-out mode
+        if (!areLightsOn()) return;
+        
         // Show the ticker if one is requested. Also don't do this
         // until status bar window is attached to the window manager,
         // because...  well, what's the point otherwise?  And trying to
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index 3bdefcb..f3a10e9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -589,9 +589,9 @@
             });
 
         // tuning parameters
-        final int LIGHTS_GOING_OUT_SYSBAR_DURATION = 600;
-        final int LIGHTS_GOING_OUT_SHADOW_DURATION = 1000;
-        final int LIGHTS_GOING_OUT_SHADOW_DELAY    = 500;
+        final int LIGHTS_GOING_OUT_SYSBAR_DURATION = 750;
+        final int LIGHTS_GOING_OUT_SHADOW_DURATION = 750;
+        final int LIGHTS_GOING_OUT_SHADOW_DELAY    = 0;
 
         final int LIGHTS_COMING_UP_SYSBAR_DURATION = 200;
 //        final int LIGHTS_COMING_UP_SYSBAR_DELAY    = 50;
diff --git a/policy/src/com/android/internal/policy/impl/BiometricSensorUnlock.java b/policy/src/com/android/internal/policy/impl/BiometricSensorUnlock.java
index c36e148..ad26845 100644
--- a/policy/src/com/android/internal/policy/impl/BiometricSensorUnlock.java
+++ b/policy/src/com/android/internal/policy/impl/BiometricSensorUnlock.java
@@ -19,33 +19,63 @@
 import android.view.View;
 
 interface BiometricSensorUnlock {
-    // Returns 'true' if the biometric sensor has started its unlock procedure but has not yet
-    // accepted or rejected the user.
+    /**
+     * Initializes the view provided for the biometric unlock UI to work within.  The provided area
+     * completely covers the backup unlock mechanism.  The view is then displayed in the same manner
+     * as if {@link BiometricSensorUnlock#show(long)} was called with a timeout of 0.
+     * @param biometricUnlockView View provided for the biometric unlock UI.
+     */
+    public void initializeView(View biometricUnlockView);
+
+    /**
+     * Indicates whether the biometric unlock is running.  Before
+     * {@link BiometricSensorUnlock#start} is called, isRunning() returns false.  After a successful
+     * call to {@link BiometricSensorUnlock#start}, isRunning() returns true until the biometric
+     * unlock completes, {@link BiometricSensorUnlock#stop} has been called, or an error has
+     * forced the biometric unlock to stop.
+     * @return whether the biometric unlock is currently running.
+     */
     public boolean isRunning();
 
-    // Show the interface, but don't start the unlock procedure.  The interface should disappear
-    // after the specified timeout.  If the timeout is 0, the interface shows until another event,
-    // such as calling hide(), causes it to disappear.
-    // Called on the UI Thread
+    /**
+     * Covers the backup unlock mechanism by showing the contents of the view initialized in
+     * {@link BiometricSensorUnlock#initializeView(View)}.  The view should disappear after the
+     * specified timeout.  If the timeout is 0, the interface shows until another event, such as
+     * calling {@link BiometricSensorUnlock#hide()}, causes it to disappear.  Called on the UI
+     * thread.
+     * @param timeoutMilliseconds Amount of time in milliseconds to display the view before
+     * disappearing.  A value of 0 means the view should remain visible.
+     */
     public void show(long timeoutMilliseconds);
 
-    // Hide the interface, if any, exposing the lockscreen.
+    /**
+     * Uncovers the backup unlock mechanism by hiding the contents of the view initialized in
+     * {@link BiometricSensorUnlock#initializeView(View)}.
+     */
     public void hide();
 
-    // Stop the unlock procedure if running.  Returns 'true' if it was in fact running.
+    /**
+     * Binds to the biometric unlock service and starts the unlock procedure.  Called on the UI
+     * thread.
+     * @return false if it can't be started or the backup should be used.
+     */
+    public boolean start();
+
+    /**
+     * Stops the biometric unlock procedure and unbinds from the service.
+     * @return whether the biometric unlock was running when called.
+     */
     public boolean stop();
 
-    // Start the unlock procedure.  Returns ‘false’ if it can’t be started or if the backup should
-    // be used.
-    // Called on the UI thread.
-    public boolean start(boolean suppressBiometricUnlock);
-
-    // Provide a view to work within.
-    public void initializeAreaView(View topView);
-
-    // Clean up any resources used by the biometric unlock.
+    /**
+     * Cleans up any resources used by the biometric unlock.
+     */
     public void cleanUp();
 
-    // Returns the Device Policy Manager quality (e.g. PASSWORD_QUALITY_BIOMETRIC_WEAK).
+    /**
+     * Gets the Device Policy Manager quality of the biometric unlock sensor
+     * (e.g., PASSWORD_QUALITY_BIOMETRIC_WEAK).
+     * @return biometric unlock sensor quality, as defined by Device Policy Manager.
+     */
     public int getQuality();
 }
diff --git a/policy/src/com/android/internal/policy/impl/FaceUnlock.java b/policy/src/com/android/internal/policy/impl/FaceUnlock.java
index ac86141..16d4003 100644
--- a/policy/src/com/android/internal/policy/impl/FaceUnlock.java
+++ b/policy/src/com/android/internal/policy/impl/FaceUnlock.java
@@ -40,31 +40,34 @@
     private static final String TAG = "FULLockscreen";
 
     private final Context mContext;
+    private final LockPatternUtils mLockPatternUtils;
     private final KeyguardUpdateMonitor mUpdateMonitor;
 
+    // TODO: is mServiceRunning needed or can we just use mIsRunning or check if mService is null?
+    private boolean mServiceRunning = false;
+    private final Object mServiceRunningLock = new Object();
     private IFaceLockInterface mService;
     private boolean mBoundToService = false;
-    private View mAreaView;
+    private View mFaceUnlockView;
 
     private Handler mHandler;
     private final int MSG_SHOW_AREA_VIEW = 0;
     private final int MSG_HIDE_AREA_VIEW = 1;
 
-    private boolean mServiceRunning = false;
-    private final Object mServiceRunningLock = new Object();
+    // TODO: This was added for the purpose of adhering to what the biometric interface expects
+    // the isRunning() function to return.  However, it is probably not necessary to have both
+    // mRunning and mServiceRunning.  I'd just rather wait to change that logic.
+    private boolean mIsRunning = false;
 
     // Long enough to stay visible while the service starts
     // Short enough to not have to wait long for backup if service fails to start or crashes
     // The service can take a couple of seconds to start on the first try after boot
     private final int VIEW_AREA_SERVICE_TIMEOUT = 3000;
 
-    // So the user has a consistent amount of time when brought to the backup method from FaceLock
+    // So the user has a consistent amount of time when brought to the backup method from Face
+    // Unlock
     private final int BACKUP_LOCK_TIMEOUT = 5000;
 
-    /**
-     * Used to lookup the state of the lock pattern
-     */
-    private final LockPatternUtils mLockPatternUtils;
 
     KeyguardScreenCallback mKeyguardScreenCallback;
 
@@ -77,102 +80,116 @@
         mHandler = new Handler(this);
     }
 
-    public boolean isRunning() {
-        return mServiceRunning;
+    /**
+     * Stores and displays the view that Face Unlock is allowed to draw within.
+     * TODO: since the layout object will eventually be shared by multiple biometric unlock
+     * methods, we will have to add our other views (background, cancel button) here.
+     */
+    public void initializeView(View biometricUnlockView) {
+        mFaceUnlockView = biometricUnlockView;
+        show(0);
     }
 
-    // Shows the FaceLock area for a period of time
-    // Called on the UI thread
+    /**
+     * Indicates whether Face Unlock is currently running.
+     */
+    public boolean isRunning() {
+        return mIsRunning;
+    }
+
+    /**
+     * Sets the Face Unlock view to visible, hiding it after the specified amount of time.  If
+     * timeoutMillis is 0, no hide is performed.
+     */
     public void show(long timeoutMillis) {
         removeAreaDisplayMessages();
-        showArea();
-        if (timeoutMillis > 0)
+        if (mFaceUnlockView != null) {
+            mFaceUnlockView.setVisibility(View.VISIBLE);
+        }
+        if (timeoutMillis > 0) {
             mHandler.sendEmptyMessageDelayed(MSG_HIDE_AREA_VIEW, timeoutMillis);
+        }
     }
 
-    // Hides the FaceLock area immediately
+    /**
+     * Hides the Face Unlock view.
+     */
     public void hide() {
         // Remove messages to prevent a delayed show message from undo-ing the hide
         removeAreaDisplayMessages();
         mHandler.sendEmptyMessage(MSG_HIDE_AREA_VIEW);
     }
 
-    // Tells FaceLock to stop and then unbinds from the FaceLock service
+    /**
+     * Binds to the Face Unlock service.  Face Unlock will be started when the bind completes.  The
+     * Face Unlock area is displayed to hide the backup while the service is starting up.
+     */
+    public boolean start() {
+        if (mIsRunning) {
+            Log.w(TAG, "start() called when already running");
+        }
+
+        // Show Face Unlock view, but only for a little bit so lockpattern will become visible if
+        // Face Unlock fails to start or crashes
+        // This must show before bind to guarantee that Face Unlock has a place to display
+        show(VIEW_AREA_SERVICE_TIMEOUT);
+        if (!mBoundToService) {
+            if (DEBUG) Log.d(TAG, "before bind to Face Unlock service");
+            mContext.bindService(new Intent(IFaceLockInterface.class.getName()),
+                    mConnection,
+                    Context.BIND_AUTO_CREATE,
+                    mLockPatternUtils.getCurrentUser());
+            if (DEBUG) Log.d(TAG, "after bind to Face Unlock service");
+            mBoundToService = true;
+        } else {
+            Log.w(TAG, "Attempt to bind to Face Unlock when already bound");
+        }
+
+        // When switching between portrait and landscape view while Face Unlock is running, the
+        // screen will eventually go dark unless we poke the wakelock when Face Unlock is
+        // restarted
+        mKeyguardScreenCallback.pokeWakelock();
+
+        mIsRunning = true;
+        return true;
+    }
+
+    /**
+     * Stops Face Unlock and unbinds from the service.
+     */
     public boolean stop() {
-        boolean wasRunning = false;
+        boolean mWasRunning = mIsRunning;
         stopUi();
 
         if (mBoundToService) {
-            wasRunning = true;
-            if (DEBUG) Log.d(TAG, "before unbind from FaceLock service");
+            if (DEBUG) Log.d(TAG, "before unbind from Face Unlock service");
             if (mService != null) {
                 try {
-                    mService.unregisterCallback(mFaceLockCallback);
+                    mService.unregisterCallback(mFaceUnlockCallback);
                 } catch (RemoteException e) {
                     // Not much we can do
                 }
             }
             mContext.unbindService(mConnection);
-            if (DEBUG) Log.d(TAG, "after unbind from FaceLock service");
+            if (DEBUG) Log.d(TAG, "after unbind from Face Unlock service");
             mBoundToService = false;
         } else {
             // This is usually not an error when this happens.  Sometimes we will tell it to
             // unbind multiple times because it's called from both onWindowFocusChanged and
             // onDetachedFromWindow.
-            if (DEBUG) Log.d(TAG, "Attempt to unbind from FaceLock when not bound");
+            if (DEBUG) Log.d(TAG, "Attempt to unbind from Face Unlock when not bound");
         }
-
-        return wasRunning;
+        mIsRunning = false;
+        return mWasRunning;
     }
 
     /**
-     * When screen is turned on and focused, need to bind to FaceLock service if we are using
-     * FaceLock, but only if we're not dealing with a call
-     * Called on the UI thread
+     * Frees up resources used by Face Unlock and stops it if it is still running.
      */
-    public boolean start(boolean suppressBiometricUnlock) {
-        final boolean tooManyFaceUnlockTries = mUpdateMonitor.getMaxFaceUnlockAttemptsReached();
-        final int failedBackupAttempts = mUpdateMonitor.getFailedAttempts();
-        final boolean backupIsTimedOut =
-                (failedBackupAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT);
-        if (tooManyFaceUnlockTries) Log.i(TAG, "tooManyFaceUnlockTries: " + tooManyFaceUnlockTries);
-        if (mUpdateMonitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE
-                && !suppressBiometricUnlock
-                && !tooManyFaceUnlockTries
-                && !backupIsTimedOut) {
-            // Show FaceLock area, but only for a little bit so lockpattern will become visible if
-            // FaceLock fails to start or crashes
-            // This must show before bind to guarantee that Face Unlock has a place to display
-            show(VIEW_AREA_SERVICE_TIMEOUT);
-
-            bind();
-
-            // When switching between portrait and landscape view while FaceLock is running, the
-            // screen will eventually go dark unless we poke the wakelock when FaceLock is
-            // restarted
-            mKeyguardScreenCallback.pokeWakelock();
-        } else {
-            hide();
-            return false;
-        }
-
-        return true;
-    }
-
-    // Takes care of FaceLock area when layout is created
-    public void initializeAreaView(View topView) {
-        mAreaView = topView.findViewById(R.id.faceLockAreaView);
-        if (mAreaView == null) {
-            Log.e(TAG, "Layout does not have areaView and FaceLock is enabled");
-        } else {
-            show(0);
-        }
-    }
-
     public void cleanUp() {
         if (mService != null) {
             try {
-                mService.unregisterCallback(mFaceLockCallback);
+                mService.unregisterCallback(mFaceUnlockCallback);
             } catch (RemoteException e) {
                 // Not much we can do
             }
@@ -181,30 +198,31 @@
         }
     }
 
+    /**
+     * Returns the Device Policy Manager quality for Face Unlock, which is BIOMETRIC_WEAK.
+     */
     public int getQuality() {
         return DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK;
     }
 
-    // Shows the FaceLock area
-    // Called on the UI thread
-    private void showArea() {
-        if (mAreaView != null) {
-            mAreaView.setVisibility(View.VISIBLE);
-        }
-    }
-
-    // Handles covering or exposing FaceLock area on the client side when FaceLock starts or stops
-    // This needs to be done in a handler because the call could be coming from a callback from the
-    // FaceLock service that is in a thread that can't modify the UI
+    /**
+     * Handles showing the Face Unlock view (hiding the backup lock) and hiding the Face Unlock view
+     * (exposing the backup lock).  In cases where 'show' needs to happen immediately,
+     * setVisibility() is called directly (without using this handler).  This handler is used when
+     * 'show' needs to happen from a non-UI thread.  It also handles hide() messages since they
+     * often require a delay.
+     */
     @Override
     public boolean handleMessage(Message msg) {
         switch (msg.what) {
         case MSG_SHOW_AREA_VIEW:
-            showArea();
+            if (mFaceUnlockView != null) {
+                mFaceUnlockView.setVisibility(View.VISIBLE);
+            }
             break;
         case MSG_HIDE_AREA_VIEW:
-            if (mAreaView != null) {
-                mAreaView.setVisibility(View.INVISIBLE);
+            if (mFaceUnlockView != null) {
+                mFaceUnlockView.setVisibility(View.INVISIBLE);
             }
             break;
         default:
@@ -214,53 +232,44 @@
         return true;
     }
 
-    // Removes show and hide messages from the message queue
+    /**
+     * Removes show and hide messages from the message queue
+     */
     private void removeAreaDisplayMessages() {
         mHandler.removeMessages(MSG_SHOW_AREA_VIEW);
         mHandler.removeMessages(MSG_HIDE_AREA_VIEW);
     }
 
-    // Binds to FaceLock service.  This call does not tell it to start, but it causes the service
-    // to call the onServiceConnected callback, which then starts FaceLock.
-    private void bind() {
-        if (!mBoundToService) {
-            if (DEBUG) Log.d(TAG, "before bind to FaceLock service");
-            mContext.bindService(new Intent(IFaceLockInterface.class.getName()),
-                    mConnection,
-                    Context.BIND_AUTO_CREATE,
-                    mLockPatternUtils.getCurrentUser());
-            if (DEBUG) Log.d(TAG, "after bind to FaceLock service");
-            mBoundToService = true;
-        } else {
-            Log.w(TAG, "Attempt to bind to FaceLock when already bound");
-        }
-    }
-
     private ServiceConnection mConnection = new ServiceConnection() {
-        // Completes connection, registers callback and starts FaceLock when service is bound
+        /**
+         * Completes connection, registers callback, and starts Face Unlock when service is bound
+         */
         @Override
         public void onServiceConnected(ComponentName className, IBinder iservice) {
             mService = IFaceLockInterface.Stub.asInterface(iservice);
-            if (DEBUG) Log.d(TAG, "Connected to FaceLock service");
+            if (DEBUG) Log.d(TAG, "Connected to Face Unlock service");
             try {
-                mService.registerCallback(mFaceLockCallback);
+                mService.registerCallback(mFaceUnlockCallback);
             } catch (RemoteException e) {
-                Log.e(TAG, "Caught exception connecting to FaceLock: " + e.toString());
+                Log.e(TAG, "Caught exception connecting to Face Unlock: " + e.toString());
                 mService = null;
                 mBoundToService = false;
+                mIsRunning = false;
                 return;
             }
 
-            if (mAreaView != null) {
+            if (mFaceUnlockView != null) {
                 int[] position;
                 position = new int[2];
-                mAreaView.getLocationInWindow(position);
-                startUi(mAreaView.getWindowToken(), position[0], position[1],
-                        mAreaView.getWidth(), mAreaView.getHeight());
+                mFaceUnlockView.getLocationInWindow(position);
+                startUi(mFaceUnlockView.getWindowToken(), position[0], position[1],
+                        mFaceUnlockView.getWidth(), mFaceUnlockView.getHeight());
             }
         }
 
-        // Cleans up if FaceLock service unexpectedly disconnects
+        /**
+         * Cleans up if Face Unlock service unexpectedly disconnects
+         */
         @Override
         public void onServiceDisconnected(ComponentName className) {
             synchronized(mServiceRunningLock) {
@@ -268,20 +277,23 @@
                 mServiceRunning = false;
             }
             mBoundToService = false;
-            Log.w(TAG, "Unexpected disconnect from FaceLock service");
+            mIsRunning = false;
+            Log.w(TAG, "Unexpected disconnect from Face Unlock service");
         }
     };
 
-    // Tells the FaceLock service to start displaying its UI and perform recognition
+    /**
+     * Tells the Face Unlock service to start displaying its UI and perform recognition
+     */
     private void startUi(IBinder windowToken, int x, int y, int w, int h) {
         synchronized (mServiceRunningLock) {
             if (!mServiceRunning) {
-                if (DEBUG) Log.d(TAG, "Starting FaceLock");
+                if (DEBUG) Log.d(TAG, "Starting Face Unlock");
                 try {
                     mService.startUi(windowToken, x, y, w, h,
                             mLockPatternUtils.isBiometricWeakLivelinessEnabled());
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Caught exception starting FaceLock: " + e.toString());
+                    Log.e(TAG, "Caught exception starting Face Unlock: " + e.toString());
                     return;
                 }
                 mServiceRunning = true;
@@ -291,30 +303,36 @@
         }
     }
 
-    // Tells the FaceLock service to stop displaying its UI and stop recognition
+    /**
+     * Tells the Face Unlock service to stop displaying its UI and stop recognition
+     */
     private void stopUi() {
-        // Note that attempting to stop FaceLock when it's not running is not an issue.
-        // FaceLock can return, which stops it and then we try to stop it when the
+        // Note that attempting to stop Face Unlock when it's not running is not an issue.
+        // Face Unlock can return, which stops it and then we try to stop it when the
         // screen is turned off.  That's why we check.
         synchronized (mServiceRunningLock) {
             if (mServiceRunning) {
                 try {
-                    if (DEBUG) Log.d(TAG, "Stopping FaceLock");
+                    if (DEBUG) Log.d(TAG, "Stopping Face Unlock");
                     mService.stopUi();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Caught exception stopping FaceLock: " + e.toString());
+                    Log.e(TAG, "Caught exception stopping Face Unlock: " + e.toString());
                 }
                 mServiceRunning = false;
             }
         }
     }
 
-    // Implements the FaceLock service callback interface defined in AIDL
-    private final IFaceLockCallback mFaceLockCallback = new IFaceLockCallback.Stub() {
-        // Stops the FaceLock UI and indicates that the phone should be unlocked
+    /**
+     * Implements the biometric unlock service callback interface defined in AIDL
+     */
+    private final IFaceLockCallback mFaceUnlockCallback = new IFaceLockCallback.Stub() {
+        /**
+         * Stops the Face Unlock UI and indicates that the phone should be unlocked
+         */
         @Override
         public void unlock() {
-            if (DEBUG) Log.d(TAG, "FaceLock unlock()");
+            if (DEBUG) Log.d(TAG, "unlock()");
 
             // Keep fallback covered
             removeAreaDisplayMessages();
@@ -326,38 +344,46 @@
             mKeyguardScreenCallback.reportSuccessfulUnlockAttempt();
         }
 
-        // Stops the FaceLock UI and exposes the backup method without unlocking
-        // This means the user has cancelled out
+        /**
+         * Stops the Face Unlock UI and exposes the backup method without unlocking
+         * This means the user has cancelled out
+         */
         @Override
         public void cancel() {
-            if (DEBUG) Log.d(TAG, "FaceLock cancel()");
+            if (DEBUG) Log.d(TAG, "cancel()");
             hide(); // Expose fallback
             stop();
             mKeyguardScreenCallback.pokeWakelock(BACKUP_LOCK_TIMEOUT);
         }
 
-        // Stops the FaceLock UI and exposes the backup method without unlocking
-        // This means FaceLock failed to recognize them
+        /**
+         * Stops the Face Unlock UI and exposes the backup method without unlocking
+         * This means Face Unlock failed to recognize them
+         */
         @Override
         public void reportFailedAttempt() {
-            if (DEBUG) Log.d(TAG, "FaceLock reportFailedAttempt()");
-            mUpdateMonitor.reportFailedFaceUnlockAttempt();
+            if (DEBUG) Log.d(TAG, "reportFailedAttempt()");
+            mUpdateMonitor.reportFailedBiometricUnlockAttempt();
             hide(); // Expose fallback
             stop();
             mKeyguardScreenCallback.pokeWakelock(BACKUP_LOCK_TIMEOUT);
         }
 
-        // Removes the black area that covers the backup unlock method
+        /**
+         * Removes the black area that covers the backup unlock method
+         **/
         @Override
         public void exposeFallback() {
-            if (DEBUG) Log.d(TAG, "FaceLock exposeFallback()");
+            if (DEBUG) Log.d(TAG, "exposeFallback()");
             hide(); // Expose fallback
         }
 
-        // Allows the Face Unlock service to poke the wake lock to keep the lockscreen alive
+        /**
+         * Allows the Face Unlock service to poke the wake lock to keep the lockscreen alive
+         */
         @Override
         public void pokeWakelock() {
-            if (DEBUG) Log.d(TAG, "FaceLock pokeWakelock()");
+            if (DEBUG) Log.d(TAG, "pokeWakelock()");
             mKeyguardScreenCallback.pokeWakelock();
         }
     };
diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java
index cd6da85..3fa79b6 100644
--- a/policy/src/com/android/internal/policy/impl/GlobalActions.java
+++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java
@@ -114,14 +114,21 @@
         mDeviceProvisioned = isDeviceProvisioned;
         if (mDialog != null) {
             mDialog.dismiss();
+            mDialog = null;
+            // Show delayed, so that the dismiss of the previous dialog completes
+            mHandler.sendEmptyMessage(MESSAGE_SHOW);
+        } else {
+            handleShow();
         }
+    }
+
+    private void handleShow() {
         mDialog = createDialog();
         prepareDialog();
 
         mDialog.show();
         mDialog.getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_EXPAND);
     }
-
     /**
      * Create the global actions dialog.
      * @return A new dialog.
@@ -280,7 +287,6 @@
         }
     }
 
-
     /** {@inheritDoc} */
     public void onDismiss(DialogInterface dialog) {
         if (SHOW_SILENT_TOGGLE) {
@@ -694,16 +700,23 @@
 
     private static final int MESSAGE_DISMISS = 0;
     private static final int MESSAGE_REFRESH = 1;
+    private static final int MESSAGE_SHOW = 2;
     private static final int DIALOG_DISMISS_DELAY = 300; // ms
 
     private Handler mHandler = new Handler() {
         public void handleMessage(Message msg) {
-            if (msg.what == MESSAGE_DISMISS) {
+            switch (msg.what) {
+            case MESSAGE_DISMISS:
                 if (mDialog != null) {
                     mDialog.dismiss();
                 }
-            } else if (msg.what == MESSAGE_REFRESH) {
+                break;
+            case MESSAGE_REFRESH:
                 mAdapter.notifyDataSetChanged();
+                break;
+            case MESSAGE_SHOW:
+                handleShow();
+                break;
             }
         }
     };
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
index 25af2e6..a6986de 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardStatusViewManager.java
@@ -303,8 +303,10 @@
         mUpdateMonitor.registerInfoCallback(mInfoCallback);
         mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
         resetStatusInfo();
-        //Issue the faceunlock failure message in a centralized place
-        if (mUpdateMonitor.getMaxFaceUnlockAttemptsReached()) {
+        // Issue the biometric unlock failure message in a centralized place
+        // TODO: we either need to make the Face Unlock multiple failures string a more general
+        // 'biometric unlock' or have each biometric unlock handle this on their own.
+        if (mUpdateMonitor.getMaxBiometricUnlockAttemptsReached()) {
             setInstructionText(getContext().getString(R.string.faceunlock_multiple_failures));
         }
     }
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
index a472375..d340516 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardUpdateMonitor.java
@@ -82,8 +82,8 @@
     private CharSequence mTelephonySpn;
 
     private int mFailedAttempts = 0;
-    private int mFailedFaceUnlockAttempts = 0;
-    private static final int FAILED_FACE_UNLOCK_ATTEMPTS_BEFORE_BACKUP = 15;
+    private int mFailedBiometricUnlockAttempts = 0;
+    private static final int FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP = 15;
 
     private boolean mClockVisible;
 
@@ -703,7 +703,7 @@
 
     public void clearFailedAttempts() {
         mFailedAttempts = 0;
-        mFailedFaceUnlockAttempts = 0;
+        mFailedBiometricUnlockAttempts = 0;
     }
 
     public void reportFailedAttempt() {
@@ -718,12 +718,12 @@
         return mPhoneState;
     }
 
-    public void reportFailedFaceUnlockAttempt() {
-        mFailedFaceUnlockAttempts++;
+    public void reportFailedBiometricUnlockAttempt() {
+        mFailedBiometricUnlockAttempts++;
     }
 
-    public boolean getMaxFaceUnlockAttemptsReached() {
-        return mFailedFaceUnlockAttempts >= FAILED_FACE_UNLOCK_ATTEMPTS_BEFORE_BACKUP;
+    public boolean getMaxBiometricUnlockAttemptsReached() {
+        return mFailedBiometricUnlockAttempts >= FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP;
     }
 
     public boolean isSimLocked() {
diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
index 5b9160d..fec9530 100644
--- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java
@@ -149,11 +149,7 @@
     private static final boolean ENABLE_INSECURE_STATUS_BAR_EXPAND = true;
 
     /** The stream type that the lock sounds are tied to. */
-    private static final int MASTER_STREAM_TYPE = AudioManager.STREAM_RING;
-    /** Minimum volume for lock sounds, as a ratio of max MASTER_STREAM_TYPE */
-    final float MIN_LOCK_VOLUME = 0.05f;
-    /** Maximum volume for lock sounds, as a ratio of max MASTER_STREAM_TYPE */
-    final float MAX_LOCK_VOLUME = 0.4f;
+    private int mMasterStreamType;
 
     private Context mContext;
     private AlarmManager mAlarmManager;
@@ -1142,24 +1138,12 @@
             if (mAudioManager == null) {
                 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
                 if (mAudioManager == null) return;
-                mMasterStreamMaxVolume = mAudioManager.getStreamMaxVolume(MASTER_STREAM_TYPE);
+                mMasterStreamType = mAudioManager.getMasterStreamType();
             }
             // If the stream is muted, don't play the sound
-            if (mAudioManager.isStreamMute(MASTER_STREAM_TYPE)) return;
+            if (mAudioManager.isStreamMute(mMasterStreamType)) return;
 
-            // Adjust the lock sound volume from a minimum of MIN_LOCK_VOLUME to a maximum
-            // of MAX_LOCK_VOLUME, relative to the maximum level of the MASTER_STREAM_TYPE volume.
-            float lockSoundVolume;
-            int masterStreamVolume = mAudioManager.getStreamVolume(MASTER_STREAM_TYPE);
-            if (masterStreamVolume == 0) {
-                return;
-            } else {
-                lockSoundVolume = MIN_LOCK_VOLUME + (MAX_LOCK_VOLUME - MIN_LOCK_VOLUME)
-                        * ((float) masterStreamVolume / mMasterStreamMaxVolume);
-            }
-
-            mLockSoundStreamId = mLockSounds.play(whichSound, lockSoundVolume, lockSoundVolume, 1,
-                    0, 1.0f);
+            mLockSoundStreamId = mLockSounds.play(whichSound, 1.0f, 1.0f, 1, 0, 1.0f);
         }
     }
 
diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
index 7e2985d..010c8d6 100644
--- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
+++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java
@@ -580,7 +580,7 @@
         restoreWidgetState();
 
         if (mBiometricUnlock != null && startBiometricUnlock) {
-            mBiometricUnlock.start(mSuppressBiometricUnlock);
+            maybeStartBiometricUnlock();
         }
     }
 
@@ -623,7 +623,7 @@
         } else {
             mHasDialog = false;
             if (mBiometricUnlock != null && startBiometricUnlock) {
-                mBiometricUnlock.start(mSuppressBiometricUnlock);
+                maybeStartBiometricUnlock();
             }
         }
     }
@@ -855,7 +855,7 @@
                 }
                 recreateUnlockScreen(unlockMode);
                 if (mBiometricUnlock != null && restartBiometricUnlock) {
-                    mBiometricUnlock.start(mSuppressBiometricUnlock);
+                    maybeStartBiometricUnlock();
                 }
             }
         }
@@ -971,7 +971,10 @@
         initializeTransportControlView(unlockView);
 
         if (mBiometricUnlock != null) {
-            mBiometricUnlock.initializeAreaView(unlockView);
+            // TODO: make faceLockAreaView a more general biometricUnlockView
+            // We will need to add our Face Unlock specific child views programmatically in
+            // initializeView rather than having them in the XML files.
+            mBiometricUnlock.initializeView(unlockView.findViewById(R.id.faceLockAreaView));
         }
 
         mUnlockScreenMode = unlockMode;
@@ -1154,4 +1157,24 @@
             return mBitmap.getHeight();
         }
     }
+
+    /**
+     * Starts the biometric unlock if it should be started based on a number of factors including
+     * the mSuppressBiometricUnlock flag.  If it should not be started, it hides the biometric
+     * unlock area.
+     */
+    private void maybeStartBiometricUnlock() {
+        if (mBiometricUnlock != null) {
+            final boolean backupIsTimedOut = (mUpdateMonitor.getFailedAttempts() >=
+                    LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT);
+            if (!mSuppressBiometricUnlock
+                    && mUpdateMonitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE
+                    && !mUpdateMonitor.getMaxBiometricUnlockAttemptsReached()
+                    && !backupIsTimedOut) {
+                mBiometricUnlock.start();
+            } else {
+                mBiometricUnlock.hide();
+            }
+        }
+    }
 }
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 96eaa28..d2053ff 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -977,16 +977,21 @@
         mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
                 com.android.internal.R.dimen.status_bar_height);
 
-        mNavigationBarHeightForRotation[Surface.ROTATION_0] =
-        mNavigationBarHeightForRotation[Surface.ROTATION_90] =
-        mNavigationBarHeightForRotation[Surface.ROTATION_180] =
-        mNavigationBarHeightForRotation[Surface.ROTATION_270] =
+        // Height of the navigation bar when presented horizontally at bottom
+        mNavigationBarHeightForRotation[mPortraitRotation] =
+        mNavigationBarHeightForRotation[mUpsideDownRotation] =
                 mContext.getResources().getDimensionPixelSize(
                         com.android.internal.R.dimen.navigation_bar_height);
-        mNavigationBarWidthForRotation[Surface.ROTATION_0] =
-        mNavigationBarWidthForRotation[Surface.ROTATION_90] =
-        mNavigationBarWidthForRotation[Surface.ROTATION_180] =
-        mNavigationBarWidthForRotation[Surface.ROTATION_270] =
+        mNavigationBarHeightForRotation[mLandscapeRotation] =
+        mNavigationBarHeightForRotation[mSeascapeRotation] =
+                mContext.getResources().getDimensionPixelSize(
+                        com.android.internal.R.dimen.navigation_bar_height_landscape);
+
+        // Width of the navigation bar when presented vertically along one side
+        mNavigationBarWidthForRotation[mPortraitRotation] =
+        mNavigationBarWidthForRotation[mUpsideDownRotation] =
+        mNavigationBarWidthForRotation[mLandscapeRotation] =
+        mNavigationBarWidthForRotation[mSeascapeRotation] =
                 mContext.getResources().getDimensionPixelSize(
                         com.android.internal.R.dimen.navigation_bar_width);
 
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index a0d5beb..a3768c6 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -5714,6 +5714,8 @@
 
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         long identityToken = Binder.clearCallingIdentity();
         try {
             dumpInternal(pw);
@@ -5723,16 +5725,6 @@
     }
 
     private void dumpInternal(PrintWriter pw) {
-        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
-                != PackageManager.PERMISSION_GRANTED) {
-            pw.println("Permission Denial: can't dump Backup Manager service from from pid="
-                    + Binder.getCallingPid()
-                    + ", uid=" + Binder.getCallingUid()
-                    + " without permission "
-                    + android.Manifest.permission.DUMP);
-            return;
-        }
-
         synchronized (mQueueLock) {
             pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled")
                     + " / " + (!mProvisioned ? "not " : "") + "provisioned / "
diff --git a/services/java/com/android/server/CountryDetectorService.java b/services/java/com/android/server/CountryDetectorService.java
index 3112b50..fc76277 100644
--- a/services/java/com/android/server/CountryDetectorService.java
+++ b/services/java/com/android/server/CountryDetectorService.java
@@ -212,6 +212,8 @@
     @SuppressWarnings("unused")
     @Override
     protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         if (!DEBUG) return;
         try {
             final Printer p = new PrintWriterPrinter(fout);
diff --git a/services/java/com/android/server/DiskStatsService.java b/services/java/com/android/server/DiskStatsService.java
index 8ef974a..ac25dc5 100644
--- a/services/java/com/android/server/DiskStatsService.java
+++ b/services/java/com/android/server/DiskStatsService.java
@@ -34,6 +34,8 @@
  * statistics about the status of the disk.
  */
 public class DiskStatsService extends Binder {
+    private static final String TAG = "DiskStatsService";
+
     private final Context mContext;
 
     public DiskStatsService(Context context) {
@@ -42,7 +44,7 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        // This data is accessible to any app -- no permission check needed.
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
 
         // Run a quick-and-dirty performance test: write 512 bytes
         byte[] junk = new byte[512];
diff --git a/services/java/com/android/server/SamplingProfilerService.java b/services/java/com/android/server/SamplingProfilerService.java
index 61267d0..0034d2c 100644
--- a/services/java/com/android/server/SamplingProfilerService.java
+++ b/services/java/com/android/server/SamplingProfilerService.java
@@ -39,9 +39,11 @@
     private static final boolean LOCAL_LOGV = false;
     public static final String SNAPSHOT_DIR = SamplingProfilerIntegration.SNAPSHOT_DIR;
 
+    private final Context mContext;
     private FileObserver snapshotObserver;
 
     public SamplingProfilerService(Context context) {
+        mContext = context;
         registerSettingObserver(context);
         startWorking(context);
     }
@@ -94,6 +96,8 @@
 
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
+
         pw.println("SamplingProfilerService:");
         pw.println("Watching directory: " + SNAPSHOT_DIR);
     }
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 6c99cdb..429c3c4 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -2697,29 +2697,21 @@
     public final void finishSubActivity(IBinder token, String resultWho,
             int requestCode) {
         synchronized(this) {
-            ActivityRecord self = mMainStack.isInStackLocked(token);
-            if (self == null) {
-                return;
-            }
-
             final long origId = Binder.clearCallingIdentity();
-
-            int i;
-            for (i=mMainStack.mHistory.size()-1; i>=0; i--) {
-                ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i);
-                if (r.resultTo == self && r.requestCode == requestCode) {
-                    if ((r.resultWho == null && resultWho == null) ||
-                        (r.resultWho != null && r.resultWho.equals(resultWho))) {
-                        mMainStack.finishActivityLocked(r, i,
-                                Activity.RESULT_CANCELED, null, "request-sub");
-                    }
-                }
-            }
-
+            mMainStack.finishSubActivityLocked(token, resultWho, requestCode);
             Binder.restoreCallingIdentity(origId);
         }
     }
 
+    public boolean finishActivityAffinity(IBinder token) {
+        synchronized(this) {
+            final long origId = Binder.clearCallingIdentity();
+            boolean res = mMainStack.finishActivityAffinityLocked(token);
+            Binder.restoreCallingIdentity(origId);
+            return res;
+        }
+    }
+
     public boolean willActivityBeVisible(IBinder token) {
         synchronized(this) {
             int i;
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index c8e015b..25fae83 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -3497,6 +3497,51 @@
         return true;
     }
 
+    final void finishSubActivityLocked(IBinder token, String resultWho, int requestCode) {
+        ActivityRecord self = isInStackLocked(token);
+        if (self == null) {
+            return;
+        }
+
+        int i;
+        for (i=mHistory.size()-1; i>=0; i--) {
+            ActivityRecord r = (ActivityRecord)mHistory.get(i);
+            if (r.resultTo == self && r.requestCode == requestCode) {
+                if ((r.resultWho == null && resultWho == null) ||
+                    (r.resultWho != null && r.resultWho.equals(resultWho))) {
+                    finishActivityLocked(r, i,
+                            Activity.RESULT_CANCELED, null, "request-sub");
+                }
+            }
+        }
+    }
+
+    final boolean finishActivityAffinityLocked(IBinder token) {
+        int index = indexOfTokenLocked(token);
+        if (DEBUG_RESULTS) Slog.v(
+                TAG, "Finishing activity affinity @" + index + ": token=" + token);
+        if (index < 0) {
+            return false;
+        }
+        ActivityRecord r = mHistory.get(index);
+
+        while (index > 0) {
+            ActivityRecord cur = mHistory.get(index);
+            if (cur.task != r.task) {
+                break;
+            }
+            if (cur.taskAffinity == null && r.taskAffinity != null) {
+                break;
+            }
+            if (cur.taskAffinity != null && !cur.taskAffinity.equals(r.taskAffinity)) {
+                break;
+            }
+            finishActivityLocked(cur, index, Activity.RESULT_CANCELED, null, "request-affinity");
+            index--;
+        }
+        return true;
+    }
+
     final void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
         // send the result
         ActivityRecord resultTo = r.resultTo;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 32700cb..b270cee 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -91,6 +91,7 @@
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.TokenWatcher;
+import android.os.Trace;
 import android.provider.Settings;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
@@ -631,6 +632,7 @@
                 // Update animations of all applications, including those
                 // associated with exiting/removed apps
                 synchronized (mAnimator) {
+                    Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmAnimate");
                     final ArrayList<WindowStateAnimator> winAnimators = mAnimator.mWinAnimators;
                     winAnimators.clear();
                     final int N = mWindows.size();
@@ -641,6 +643,7 @@
                         }
                     }
                     mAnimator.animate();
+                    Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
                 }
             }
         }
@@ -7518,6 +7521,7 @@
             return;
         }
 
+        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
         mInLayout = true;
         boolean recoveringMemory = false;
         
@@ -7562,7 +7566,10 @@
                 mInLayout = false;
                 assignLayersLocked();
                 mLayoutNeeded = true;
+                // XXX this recursion seems broken!
+                Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
                 performLayoutAndPlaceSurfacesLocked();
+                Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
 
             } else {
                 mInLayout = false;
@@ -7587,6 +7594,8 @@
             mInLayout = false;
             Log.wtf(TAG, "Unhandled exception while laying out windows", e);
         }
+
+        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
     }
 
     private final void performLayoutLockedInner(boolean initial, boolean updateInputWindows) {
@@ -8814,6 +8823,7 @@
     private boolean updateFocusedWindowLocked(int mode, boolean updateInputWindows) {
         WindowState newFocus = computeFocusedWindowLocked();
         if (mCurrentFocus != newFocus) {
+            Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmUpdateFocus");
             // This check makes sure that we don't already have the focus
             // change message pending.
             mH.removeMessages(H.REPORT_FOCUS_CHANGE);
@@ -8856,6 +8866,8 @@
                 // doing this part.
                 finishUpdateFocusedWindowAfterAssignLayersLocked(updateInputWindows);
             }
+
+            Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
             return true;
         }
         return false;
diff --git a/tests/SmokeTest/tests/src/com/android/smoketest/ProcessErrorsTest.java b/tests/SmokeTest/tests/src/com/android/smoketest/ProcessErrorsTest.java
index b3a2600..03c2923 100644
--- a/tests/SmokeTest/tests/src/com/android/smoketest/ProcessErrorsTest.java
+++ b/tests/SmokeTest/tests/src/com/android/smoketest/ProcessErrorsTest.java
@@ -28,17 +28,18 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
 /**
- * This smoke test is designed to quickly sniff for any error conditions
- * encountered after initial startup.
+ * This smoke test is designed to check for crashes and ANRs in an attempt to quickly determine if
+ * all minimal functionality in the build is working properly.
  */
 public class ProcessErrorsTest extends AndroidTestCase {
-    
+
     private static final String TAG = "ProcessErrorsTest";
 
     private final Intent mHomeIntent;
@@ -46,15 +47,28 @@
     protected ActivityManager mActivityManager;
     protected PackageManager mPackageManager;
 
+    /**
+     * Used to buffer asynchronously-caused crashes and ANRs so that we can have a big fail-party
+     * in the catch-all testCase.
+     */
+    private static final Collection<ProcessError> mAsyncErrors =
+            Collections.synchronizedSet(new LinkedHashSet<ProcessError>());
+
     public ProcessErrorsTest() {
         mHomeIntent = new Intent(Intent.ACTION_MAIN);
         mHomeIntent.addCategory(Intent.CATEGORY_HOME);
         mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public void setUp() throws Exception {
         super.setUp();
+        // First, make sure we have a Context
+        assertNotNull("getContext() returned null!", getContext());
+
         mActivityManager = (ActivityManager)
                 getContext().getSystemService(Context.ACTIVITY_SERVICE);
         mPackageManager = getContext().getPackageManager();
@@ -75,43 +89,48 @@
         assertNull(reportMsg, reportMsg);
     }
 
-    private String checkForProcessErrors() throws Exception {
-        List<ProcessErrorStateInfo> errList;
-        errList = mActivityManager.getProcessesInErrorState();
+    /**
+     * A test that runs all Launcher-launchable activities and verifies that no ANRs or crashes
+     * happened while doing so.
+     */
+    public void testRunAllActivities() throws Exception {
+        final Set<ProcessError> errSet = new LinkedHashSet<ProcessError>();
 
-        // note: this contains information about each process that is currently in an error
-        // condition.  if the list is empty (null) then "we're good".
+        for (ResolveInfo app : getLauncherActivities(mPackageManager)) {
+            final Collection<ProcessError> errProcs = runOneActivity(app);
+            if (errProcs != null) {
+                errSet.addAll(errProcs);
+            }
+        }
 
-        // if the list is non-empty, then it's useful to report the contents of the list
-        final String reportMsg = reportListContents(errList);
-        return reportMsg;
+        if (!errSet.isEmpty()) {
+            fail(String.format("Got %d errors:\n%s", errSet.size(),
+                    reportWrappedListContents(errSet)));
+        }
     }
 
     /**
-     * A helper function to query the provided {@link PackageManager} for a list of Activities that
-     * can be launched from Launcher.
+     * This test checks for asynchronously-caused errors (crashes or ANRs) and fails in case any
+     * were found.  This prevents us from needing to fail unrelated testcases when, for instance
+     * a background thread causes a crash or ANR.
+     * <p />
+     * Because this behavior depends on the contents of static member {@link mAsyncErrors}, we clear
+     * that state here as a side-effect so that if two successive runs happen in the same process,
+     * the asynchronous errors in the second test run won't include errors produced during the first
+     * run.
      */
-    static List<ResolveInfo> getLauncherActivities(PackageManager pm) {
-        final Intent launchable = new Intent(Intent.ACTION_MAIN);
-        launchable.addCategory(Intent.CATEGORY_LAUNCHER);
-        final List<ResolveInfo> activities = pm.queryIntentActivities(launchable, 0);
-        return activities;
+    public void testZZReportAsyncErrors() throws Exception {
+        try {
+            if (!mAsyncErrors.isEmpty()) {
+                fail(String.format("Got %d asynchronous errors:\n%s", mAsyncErrors.size(),
+                        reportWrappedListContents(mAsyncErrors)));
+            }
+        } finally {
+            // Reset state just in case we should get another set of runs in the same process
+            mAsyncErrors.clear();
+        }
     }
 
-    /**
-     * A helper function to create an {@link Intent} to run, given a {@link ResolveInfo} specifying
-     * an activity to be launched.
-     */
-    static Intent intentForActivity(ResolveInfo app) {
-        // build an Intent to launch the specified app
-        final ComponentName component = new ComponentName(app.activityInfo.packageName,
-                app.activityInfo.name);
-        final Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setComponent(component);
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
-        return intent;
-    }
 
     /**
      * A method to run the specified Activity and return a {@link Collection} of the Activities that
@@ -129,8 +148,7 @@
 
         // We check for any Crash or ANR dialogs that are already up, and we ignore them.  This is
         // so that we don't report crashes that were caused by prior apps (which those particular
-        // tests should have caught and reported already).  Otherwise, test failures would cascade
-        // from the initial broken app to many/all of the tests following that app's launch.
+        // tests should have caught and reported already).
         final Collection<ProcessError> preErrProcs =
                 ProcessError.fromCollection(mActivityManager.getProcessesInErrorState());
 
@@ -155,8 +173,24 @@
         // possible to occur.
         final Collection<ProcessError> errProcs =
                 ProcessError.fromCollection(mActivityManager.getProcessesInErrorState());
-        // Take the difference between the error processes we see now, and the ones that were
-        // present when we started
+
+        // Distinguish the asynchronous crashes/ANRs from the synchronous ones by checking the
+        // crash package name against the package name for {@code app}
+        if (errProcs != null) {
+            Iterator<ProcessError> errIter = errProcs.iterator();
+            while (errIter.hasNext()) {
+                ProcessError err = errIter.next();
+                if (!packageMatches(app, err)) {
+                    // async!  Drop into mAsyncErrors and don't report now
+                    mAsyncErrors.add(err);
+                    errIter.remove();
+                }
+            }
+        }
+        // Take the difference between the remaining current error processes and the ones that were
+        // present when we started.  The result is guaranteed to be:
+        // 1) Errors that are pertinent to this app's package
+        // 2) Errors that are pertinent to this particular app invocation
         if (errProcs != null && preErrProcs != null) {
             errProcs.removeAll(preErrProcs);
         }
@@ -164,27 +198,63 @@
         return errProcs;
     }
 
-    /**
-     * A test that runs all Launcher-launchable activities and verifies that no ANRs or crashes
-     * happened while doing so.
-     */
-    public void testRunAllActivities() throws Exception {
-        final Set<ProcessError> errSet = new HashSet<ProcessError>();
+    private String checkForProcessErrors() throws Exception {
+        List<ProcessErrorStateInfo> errList;
+        errList = mActivityManager.getProcessesInErrorState();
 
-        for (ResolveInfo app : getLauncherActivities(mPackageManager)) {
-            final Collection<ProcessError> errProcs = runOneActivity(app);
-            if (errProcs != null) {
-                errSet.addAll(errProcs);
-            }
-        }
+        // note: this contains information about each process that is currently in an error
+        // condition.  if the list is empty (null) then "we're good".
 
-        if (!errSet.isEmpty()) {
-            fail(String.format("Got %d errors:\n%s", errSet.size(),
-                    reportWrappedListContents(errSet)));
-        }
+        // if the list is non-empty, then it's useful to report the contents of the list
+        final String reportMsg = reportListContents(errList);
+        return reportMsg;
     }
 
-    String reportWrappedListContents(Collection<ProcessError> errList) {
+    /**
+     * A helper function that checks whether the specified error could have been caused by the
+     * specified app.
+     *
+     * @param app The app to check against
+     * @param err The error that we're considering
+     */
+    private static boolean packageMatches(ResolveInfo app, ProcessError err) {
+        final String appPkg = app.activityInfo.packageName;
+        final String errPkg = err.info.processName;
+        Log.d(TAG, String.format("packageMatches(%s, %s)", appPkg, errPkg));
+        return appPkg.equals(errPkg);
+    }
+
+    /**
+     * A helper function to query the provided {@link PackageManager} for a list of Activities that
+     * can be launched from Launcher.
+     */
+    static List<ResolveInfo> getLauncherActivities(PackageManager pm) {
+        final Intent launchable = new Intent(Intent.ACTION_MAIN);
+        launchable.addCategory(Intent.CATEGORY_LAUNCHER);
+        final List<ResolveInfo> activities = pm.queryIntentActivities(launchable, 0);
+        return activities;
+    }
+
+    /**
+     * A helper function to create an {@link Intent} to run, given a {@link ResolveInfo} specifying
+     * an activity to be launched.
+     */
+    static Intent intentForActivity(ResolveInfo app) {
+        final ComponentName component = new ComponentName(app.activityInfo.packageName,
+                app.activityInfo.name);
+        final Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setComponent(component);
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+        return intent;
+    }
+
+    /**
+     * Report error reports for {@link ProcessErrorStateInfo} instances that are wrapped inside of
+     * {@link ProcessError} instances.  Just unwraps and calls
+     * {@see reportListContents(Collection<ProcessErrorStateInfo>)}.
+     */
+    static String reportWrappedListContents(Collection<ProcessError> errList) {
         List<ProcessErrorStateInfo> newList = new ArrayList<ProcessErrorStateInfo>(errList.size());
         for (ProcessError err : errList) {
             newList.add(err.info);
@@ -198,7 +268,7 @@
      * @param errList The error report containing one or more error records.
      * @return Returns a string containing all of the errors.
      */
-    private String reportListContents(Collection<ProcessErrorStateInfo> errList) {
+    private static String reportListContents(Collection<ProcessErrorStateInfo> errList) {
         if (errList == null) return null;
 
         StringBuilder builder = new StringBuilder();
diff --git a/tests/SmokeTest/tests/src/com/android/smoketest/SmokeTestRunner.java b/tests/SmokeTest/tests/src/com/android/smoketest/SmokeTestRunner.java
index 51331fe..db549a1 100644
--- a/tests/SmokeTest/tests/src/com/android/smoketest/SmokeTestRunner.java
+++ b/tests/SmokeTest/tests/src/com/android/smoketest/SmokeTestRunner.java
@@ -47,9 +47,6 @@
         final PackageManager pm = getTargetContext().getPackageManager();
         final List<ResolveInfo> apps = ProcessErrorsTest.getLauncherActivities(pm);
 
-        // FIXME: figure out some way to control the reported class names for these anonymous
-        // FIXME: class instances.
-
         final TestCase setupTest = new ProcessErrorsTest() {
             @Override
             public void runTest() throws Exception {
@@ -88,6 +85,15 @@
             suite.addTest(appTest);
         }
 
+        final TestCase asyncErrorTest = new ProcessErrorsTest() {
+            @Override
+            public void runTest() throws Exception {
+                testZZReportAsyncErrors();
+            }
+        };
+        asyncErrorTest.setName("testAsynchronousErrors");
+        suite.addTest(asyncErrorTest);
+
         return suite;
     }
 }
diff --git a/tests/WebViewTests/src/com/android/webviewtests/JavaBridgeBasicsTest.java b/tests/WebViewTests/src/com/android/webviewtests/JavaBridgeBasicsTest.java
index 07d7c34..1ecccf6 100644
--- a/tests/WebViewTests/src/com/android/webviewtests/JavaBridgeBasicsTest.java
+++ b/tests/WebViewTests/src/com/android/webviewtests/JavaBridgeBasicsTest.java
@@ -186,6 +186,13 @@
         assertRaisesException("testController.foo()");
     }
 
+    public void testUncaughtJavaExceptionRaisesJavaException() throws Throwable {
+        injectObjectAndReload(new Object() {
+            public void method() { throw new RuntimeException("foo"); }
+        }, "testObject");
+        assertRaisesException("testObject.method()");
+    }
+
     // Note that this requires that we can pass a JavaScript string to Java.
     public void testTypeOfStaticMethod() throws Throwable {
         injectObjectAndReload(new ObjectWithStaticMethod(), "testObject");
@@ -394,7 +401,6 @@
         assertEquals("", mTestController.waitForStringValue());
     }
 
-    // java.lang.reflect only allows access to public methods and fields. See b/6386557.
     public void testReflectPublicMethod() throws Throwable {
         injectObjectAndReload(new Object() {
             public String method() { return "foo"; }
@@ -404,7 +410,6 @@
                 ".toString()"));
     }
 
-    // java.lang.reflect only allows access to public methods and fields. See b/6386557.
     public void testReflectPublicField() throws Throwable {
         injectObjectAndReload(new Object() {
             public String field = "foo";
@@ -412,4 +417,26 @@
         assertEquals("foo", executeJavaScriptAndGetStringResult(
                 "testObject.getClass().getField('field').get(testObject).toString()"));
     }
+
+    public void testReflectPrivateMethodRaisesException() throws Throwable {
+        injectObjectAndReload(new Object() {
+            private void method() {};
+        }, "testObject");
+        assertRaisesException("testObject.getClass().getMethod('method', null)");
+        // getDeclaredMethod() is able to access a private method, but invoke()
+        // throws a Java exception.
+        assertRaisesException(
+                "testObject.getClass().getDeclaredMethod('method', null).invoke(testObject, null)");
+    }
+
+    public void testReflectPrivateFieldRaisesException() throws Throwable {
+        injectObjectAndReload(new Object() {
+            private int field;
+        }, "testObject");
+        assertRaisesException("testObject.getClass().getField('field')");
+        // getDeclaredField() is able to access a private field, but getInt()
+        // throws a Java exception.
+        assertRaisesException(
+                "testObject.getClass().getDeclaredField('field').getInt(testObject)");
+    }
 }
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index a4473c8..d428fef 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -1740,20 +1740,6 @@
             // Write the R.java file into the appropriate class directory
             // e.g. gen/com/foo/app/R.java
             err = writeResourceSymbols(bundle, assets, assets->getPackage(), true);
-            // If we have library files, we're going to write our R.java file into
-            // the appropriate class directory for those libraries as well.
-            // e.g. gen/com/foo/app/lib/R.java
-            if (bundle->getExtraPackages() != NULL) {
-                // Split on colon
-                String8 libs(bundle->getExtraPackages());
-                char* packageString = strtok(libs.lockBuffer(libs.length()), ":");
-                while (packageString != NULL) {
-                    // Write the R.java file out with the correct package name
-                    err = writeResourceSymbols(bundle, assets, String8(packageString), true);
-                    packageString = strtok(NULL, ":");
-                }
-                libs.unlockBuffer();
-            }
         } else {
             const String8 customPkg(bundle->getCustomPackage());
             err = writeResourceSymbols(bundle, assets, customPkg, true);
@@ -1761,6 +1747,23 @@
         if (err < 0) {
             goto bail;
         }
+        // If we have library files, we're going to write our R.java file into
+        // the appropriate class directory for those libraries as well.
+        // e.g. gen/com/foo/app/lib/R.java
+        if (bundle->getExtraPackages() != NULL) {
+            // Split on colon
+            String8 libs(bundle->getExtraPackages());
+            char* packageString = strtok(libs.lockBuffer(libs.length()), ":");
+            while (packageString != NULL) {
+                // Write the R.java file out with the correct package name
+                err = writeResourceSymbols(bundle, assets, String8(packageString), true);
+                if (err < 0) {
+                    goto bail;
+                }
+                packageString = strtok(NULL, ":");
+            }
+            libs.unlockBuffer();
+        }
     } else {
         err = writeResourceSymbols(bundle, assets, assets->getPackage(), false);
         if (err < 0) {
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 705e3c7..ac0fbfa 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1534,8 +1534,7 @@
 
     private void sendNetworkStateChangeBroadcast(String bssid) {
         Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
-                | Intent.FLAG_RECEIVER_REPLACE_PENDING);
+        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
         intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, new NetworkInfo(mNetworkInfo));
         intent.putExtra(WifiManager.EXTRA_LINK_PROPERTIES, new LinkProperties (mLinkProperties));
         if (bssid != null)
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
index 3751727..8942ff1 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
@@ -27,8 +27,9 @@
 import java.util.HashMap;
 
 /**
- * A class representing a Wi-Fi P2p device list
+ * A class representing a Wi-Fi P2p device list.
  *
+ * Note that the operations are not thread safe.
  * {@see WifiP2pManager}
  */
 public class WifiP2pDeviceList implements Parcelable {
@@ -83,6 +84,13 @@
     }
 
     /** @hide */
+    public void updateStatus(String deviceAddress, int status) {
+        if (deviceAddress == null) return;
+        WifiP2pDevice d = mDevices.get(deviceAddress);
+        d.status = status;
+    }
+
+    /** @hide */
     public WifiP2pDevice get(String deviceAddress) {
         if (deviceAddress == null) return null;
 
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 018e0a8..ef77d45 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -30,6 +30,7 @@
 import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo;
 import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceResponse;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.IBinder;
 import android.os.Handler;
 import android.os.Looper;
@@ -265,6 +266,41 @@
      */
     public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
 
+    /**
+     * The lookup key for a {@link #String} object.
+     * Retrieve with {@link android.os.Bundle#getString(String)}.
+     * @hide
+     */
+    public static final String APP_PKG_BUNDLE_KEY = "appPkgName";
+
+    /**
+     * The lookup key for a {@link #Boolean} object.
+     * Retrieve with {@link android.os.Bundle#getBoolean(String)}.
+     * @hide
+     */
+    public static final String RESET_DIALOG_LISTENER_BUNDLE_KEY = "dialogResetFlag";
+
+    /**
+     * The lookup key for a {@link #String} object.
+     * Retrieve with {@link android.os.Bundle#getString(String)}.
+     * @hide
+     */
+    public static final String WPS_PIN_BUNDLE_KEY = "wpsPin";
+
+    /**
+     * The lookup key for a {@link android.net.wifi.p2p.WifiP2pDevice} object
+     * Retrieve with {@link android.os.Bundle#getParcelable(String)}.
+     * @hide
+     */
+    public static final String P2P_DEV_BUNDLE_KEY = "wifiP2pDevice";
+
+    /**
+     * The lookup key for a {@link android.net.wifi.p2p.WifiP2pConfig} object
+     * Retrieve with {@link android.os.Bundle#getParcelable(String)}.
+     * @hide
+     */
+    public static final String P2P_CONFIG_BUNDLE_KEY = "wifiP2pConfig";
+
     IWifiP2pManager mService;
 
     private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
@@ -381,6 +417,25 @@
     /** @hide */
     public static final int RESPONSE_SERVICE                        = BASE + 50;
 
+    /** @hide */
+    public static final int SET_DEVICE_NAME                         = BASE + 51;
+    /** @hide */
+    public static final int SET_DEVICE_NAME_FAILED                  = BASE + 52;
+    /** @hide */
+    public static final int SET_DEVICE_NAME_SUCCEEDED               = BASE + 53;
+
+    /** @hide */
+    public static final int SET_DIALOG_LISTENER                     = BASE + 54;
+    /** @hide */
+    public static final int DIALOG_LISTENER_DETACHED                = BASE + 55;
+    /** @hide */
+    public static final int DIALOG_LISTENER_ATTACHED                = BASE + 56;
+
+    /** @hide */
+    public static final int CONNECTION_REQUESTED                    = BASE + 57;
+    /** @hide */
+    public static final int SHOW_PIN_REQUESTED                      = BASE + 58;
+
     /**
      * Create a new WifiP2pManager instance. Applications use
      * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
@@ -420,6 +475,14 @@
      */
     public static final int NO_SERVICE_REQUESTS = 3;
 
+    /**
+     * Passed with {@link DialogListener#onDetached}.
+     * Indicates that the registered listener was detached from the system because
+     * the application went into background.
+     * @hide
+     */
+    public static final int NOT_IN_FOREGROUND   = 4;
+
     /** Interface for callback invocation when framework channel is lost */
     public interface ChannelListener {
         /**
@@ -468,7 +531,7 @@
         public void onGroupInfoAvailable(WifiP2pGroup group);
     }
 
-    /**
+   /**
     * Interface for callback invocation when service discovery response other than
     * Upnp or Bonjour is received
     */
@@ -552,15 +615,59 @@
 
 
     /**
+     * Interface for callback invocation when dialog events are received.
+     * see {@link #setDialogListener}.
+     * @hide
+     */
+    public interface DialogListener {
+
+        /**
+         * Called by the system when a request to show WPS pin is received.
+         *
+         * @param pin WPS pin.
+         */
+        public void onShowPinRequested(String pin);
+
+        /**
+         * Called by the system when a request to establish the connection is received.
+         *
+         * Application can then call {@link #connect} with the given config if the request
+         * is acceptable.
+         *
+         * @param device the source device.
+         * @param config p2p configuration.
+         */
+        public void onConnectionRequested(WifiP2pDevice device, WifiP2pConfig config);
+
+        /**
+         * Called by the system when this listener was attached to the system.
+         */
+        public void onAttached();
+
+        /**
+         * Called by the system when this listener was detached from the system or
+         * failed to attach.
+         *
+         * Application can request again using {@link #setDialogListener} when it is
+         * in the foreground.
+         *
+         * @param reason The reason for failure could be one of {@link #ERROR},
+         * {@link #BUSY}, {@link #P2P_UNSUPPORTED} or {@link #NOT_IN_FOREGROUND}
+         */
+        public void onDetached(int reason);
+    }
+
+    /**
      * A channel that connects the application to the Wifi p2p framework.
      * Most p2p operations require a Channel as an argument. An instance of Channel is obtained
      * by doing a call on {@link #initialize}
      */
     public static class Channel {
-        Channel(Looper looper, ChannelListener l) {
+        Channel(Context context, Looper looper, ChannelListener l) {
             mAsyncChannel = new AsyncChannel();
             mHandler = new P2pHandler(looper);
             mChannelListener = l;
+            mContext = context;
         }
         private final static int INVALID_LISTENER_KEY = 0;
         private ChannelListener mChannelListener;
@@ -571,9 +678,11 @@
         private HashMap<Integer, Object> mListenerMap = new HashMap<Integer, Object>();
         private Object mListenerMapLock = new Object();
         private int mListenerKey = 0;
+        private DialogListener mDialogListener;
 
-        AsyncChannel mAsyncChannel;
-        P2pHandler mHandler;
+        private AsyncChannel mAsyncChannel;
+        private P2pHandler mHandler;
+        Context mContext;
         class P2pHandler extends Handler {
             P2pHandler(Looper looper) {
                 super(looper);
@@ -603,6 +712,7 @@
                     case WifiP2pManager.ADD_SERVICE_REQUEST_FAILED:
                     case WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED:
                     case WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED:
+                    case WifiP2pManager.SET_DEVICE_NAME_FAILED:
                         if (listener != null) {
                             ((ActionListener) listener).onFailure(message.arg1);
                         }
@@ -621,6 +731,7 @@
                     case WifiP2pManager.ADD_SERVICE_REQUEST_SUCCEEDED:
                     case WifiP2pManager.REMOVE_SERVICE_REQUEST_SUCCEEDED:
                     case WifiP2pManager.CLEAR_SERVICE_REQUESTS_SUCCEEDED:
+                    case WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED:
                         if (listener != null) {
                             ((ActionListener) listener).onSuccess();
                         }
@@ -647,6 +758,34 @@
                         WifiP2pServiceResponse resp = (WifiP2pServiceResponse) message.obj;
                         handleServiceResponse(resp);
                         break;
+                    case WifiP2pManager.CONNECTION_REQUESTED:
+                        if (mDialogListener != null) {
+                            Bundle bundle = message.getData();
+                            mDialogListener.onConnectionRequested(
+                                    (WifiP2pDevice)bundle.getParcelable(
+                                            P2P_DEV_BUNDLE_KEY),
+                                    (WifiP2pConfig)bundle.getParcelable(
+                                            P2P_CONFIG_BUNDLE_KEY));
+                        }
+                        break;
+                    case WifiP2pManager.SHOW_PIN_REQUESTED:
+                        if (mDialogListener != null) {
+                            Bundle bundle = message.getData();
+                            mDialogListener.onShowPinRequested(
+                                    bundle.getString(WPS_PIN_BUNDLE_KEY));
+                        }
+                        break;
+                    case WifiP2pManager.DIALOG_LISTENER_ATTACHED:
+                        if (mDialogListener != null) {
+                            mDialogListener.onAttached();
+                        }
+                        break;
+                    case WifiP2pManager.DIALOG_LISTENER_DETACHED:
+                        if (mDialogListener != null) {
+                            mDialogListener.onDetached(message.arg1);
+                            mDialogListener = null;
+                        }
+                        break;
                    default:
                         Log.d(TAG, "Ignored " + message);
                         break;
@@ -712,6 +851,10 @@
                 return mListenerMap.remove(key);
             }
         }
+
+        private void setDialogListener(DialogListener listener) {
+            mDialogListener = listener;
+        }
     }
 
     private static void checkChannel(Channel c) {
@@ -739,7 +882,7 @@
         Messenger messenger = getMessenger();
         if (messenger == null) return null;
 
-        Channel c = new Channel(srcLooper, listener);
+        Channel c = new Channel(srcContext, srcLooper, listener);
         if (c.mAsyncChannel.connectSync(srcContext, c.mHandler, messenger)
                 == AsyncChannel.STATUS_SUCCESSFUL) {
             return c;
@@ -1104,6 +1247,56 @@
     }
 
     /**
+     * Set p2p device name.
+     * @hide
+     * @param c is the channel created at {@link #initialize}
+     * @param listener for callback when group info is available. Can be null.
+     */
+    public void setDeviceName(Channel c, String devName, ActionListener listener) {
+        checkChannel(c);
+        WifiP2pDevice d = new WifiP2pDevice();
+        d.deviceName = devName;
+        c.mAsyncChannel.sendMessage(SET_DEVICE_NAME, 0, c.putListener(listener), d);
+    }
+
+
+    /**
+     * Set dialog listener to over-ride system dialogs on p2p events. This function
+     * allows an application to receive notifications on connection requests from
+     * peers so that it can customize the user experience for connection with
+     * peers.
+     *
+     * <p> The function call immediately returns after sending a request
+     * to the framework. The application is notified of a success or failure to attach
+     * to the system through listener callbacks {@link DialogListener#onAttached} or
+     * {@link DialogListener#onDetached}.
+     *
+     * <p> Note that only foreground application will be successful in overriding the
+     * system dialogs.
+     * @hide
+     *
+     * @param c is the channel created at {@link #initialize}
+     * @param listener for callback on a dialog event.
+     */
+    public void setDialogListener(Channel c, DialogListener listener) {
+        checkChannel(c);
+        c.setDialogListener(listener);
+
+        /**
+         * mAsyncChannel should always stay private and inaccessible from the app
+         * to prevent an app from sending a message with a fake app name to gain
+         * control over the dialogs
+         */
+        Message msg = Message.obtain();
+        Bundle bundle = new Bundle();
+        bundle.putString(APP_PKG_BUNDLE_KEY, c.mContext.getPackageName());
+        bundle.putBoolean(RESET_DIALOG_LISTENER_BUNDLE_KEY, listener == null);
+        msg.what = SET_DIALOG_LISTENER;
+        msg.setData(bundle);
+        c.mAsyncChannel.sendMessage(msg);
+    }
+
+    /**
      * Get a reference to WifiP2pService handler. This is used to establish
      * an AsyncChannel communication with WifiService
      *
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index 6168f0e..f0adb25 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -16,10 +16,13 @@
 
 package android.net.wifi.p2p;
 
+import android.app.Activity;
+import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.app.PendingIntent;
+import android.app.ActivityManager.RunningTaskInfo;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -46,15 +49,19 @@
 import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
 import android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.IBinder;
 import android.os.INetworkManagementService;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
 import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
+import android.os.Parcelable.Creator;
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Slog;
@@ -102,6 +109,8 @@
     INetworkManagementService mNwService;
     private DhcpStateMachine mDhcpStateMachine;
 
+    private ActivityManager mActivityMgr;
+
     private P2pStateMachine mP2pStateMachine;
     private AsyncChannel mReplyChannel = new AsyncChannel();
     private AsyncChannel mWifiChannel;
@@ -148,7 +157,7 @@
     /* When a group has been explicitly created by an app, we persist the group
      * even after all clients have been disconnected until an explicit remove
      * is invoked */
-    private boolean mPersistGroup;
+    private boolean mAutonomousGroup;
 
     /* Track whether we are in p2p discovery. This is used to avoid sending duplicate
      * broadcasts
@@ -167,6 +176,13 @@
     /* clients(application) information list. */
     private HashMap<Messenger, ClientInfo> mClientInfoList = new HashMap<Messenger, ClientInfo>();
 
+    /* The foreground application's messenger.
+     * The connection request is notified only to foreground application  */
+    private Messenger mForegroundAppMessenger;
+
+    /* the package name of foreground application. */
+    private String mForegroundAppPkgName;
+
     /* Is chosen as a unique range to avoid conflict with
        the range defined in Tethering.java */
     private static final String[] DHCP_RANGE = {"192.168.49.2", "192.168.49.254"};
@@ -177,6 +193,8 @@
 
         //STOPSHIP: get this from native side
         mInterface = "p2p0";
+        mActivityMgr = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE);
+
         mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI_P2P, 0, NETWORKTYPE, "");
 
         mP2pSupported = mContext.getPackageManager().hasSystemFeature(
@@ -184,7 +202,6 @@
 
         mThisDevice.primaryDeviceType = mContext.getResources().getString(
                 com.android.internal.R.string.config_wifi_p2p_device_type);
-        mThisDevice.deviceName = getDefaultDeviceName();
 
         mP2pStateMachine = new P2pStateMachine(TAG, mP2pSupported);
         mP2pStateMachine.start();
@@ -205,14 +222,6 @@
                 "WifiP2pService");
     }
 
-    /* We use the 4 digits of the ANDROID_ID to have a friendly
-     * default that has low likelihood of collision with a peer */
-    private String getDefaultDeviceName() {
-        String id = Settings.Secure.getString(mContext.getContentResolver(),
-                    Settings.Secure.ANDROID_ID);
-        return "Android_" + id.substring(0,4);
-    }
-
     /**
      * Get a reference to handler. This is used by a client to establish
      * an AsyncChannel communication with WifiP2pService
@@ -270,6 +279,9 @@
         // Saved WifiP2pGroup from invitation request
         private WifiP2pGroup mSavedP2pGroup;
 
+        // Saved WifiP2pDevice from provisioning request
+        private WifiP2pDevice mSavedProvDiscDevice;
+
         P2pStateMachine(String name, boolean p2pSupported) {
             super(name);
 
@@ -376,6 +388,10 @@
                             WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED,
                             WifiP2pManager.BUSY);
                     break;
+                case WifiP2pManager.SET_DEVICE_NAME:
+                    replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED,
+                            WifiP2pManager.BUSY);
+                    break;
                 case WifiP2pManager.REQUEST_PEERS:
                     replyToMessage(message, WifiP2pManager.RESPONSE_PEERS, mPeers);
                     break;
@@ -385,6 +401,18 @@
                 case WifiP2pManager.REQUEST_GROUP_INFO:
                     replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, mGroup);
                     break;
+                case WifiP2pManager.SET_DIALOG_LISTENER:
+                    String appPkgName = (String)message.getData().getString(
+                            WifiP2pManager.APP_PKG_BUNDLE_KEY);
+                    boolean isReset = message.getData().getBoolean(
+                            WifiP2pManager.RESET_DIALOG_LISTENER_BUNDLE_KEY);
+                    if (setDialogListenerApp(message.replyTo, appPkgName, isReset)) {
+                        replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_ATTACHED);
+                    } else {
+                        replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED,
+                                WifiP2pManager.NOT_IN_FOREGROUND);
+                    }
+                    break;
                     // Ignore
                 case WifiMonitor.P2P_INVITATION_RESULT_EVENT:
                 case WifiMonitor.SCAN_RESULTS_EVENT:
@@ -398,7 +426,7 @@
                 case PEER_CONNECTION_USER_REJECT:
                 case GROUP_CREATING_TIMED_OUT:
                     break;
-                /* unexpected group created, remove */
+                    /* unexpected group created, remove */
                 case WifiMonitor.P2P_GROUP_STARTED_EVENT:
                     mGroup = (WifiP2pGroup) message.obj;
                     loge("Unexpected group creation, remove " + mGroup);
@@ -452,6 +480,10 @@
                     replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED,
                             WifiP2pManager.P2P_UNSUPPORTED);
                     break;
+                case WifiP2pManager.SET_DIALOG_LISTENER:
+                    replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED,
+                            WifiP2pManager.P2P_UNSUPPORTED);
+                    break;
                 case WifiP2pManager.REMOVE_LOCAL_SERVICE:
                     replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED,
                             WifiP2pManager.P2P_UNSUPPORTED);
@@ -474,6 +506,10 @@
                             WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED,
                             WifiP2pManager.P2P_UNSUPPORTED);
                     break;
+                case WifiP2pManager.SET_DEVICE_NAME:
+                    replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED,
+                            WifiP2pManager.P2P_UNSUPPORTED);
+                    break;
                default:
                     return NOT_HANDLED;
             }
@@ -583,6 +619,16 @@
                     mWifiNative.closeSupplicantConnection();
                     transitionTo(mP2pDisablingState);
                     break;
+                case WifiP2pManager.SET_DEVICE_NAME:
+                    WifiP2pDevice d = (WifiP2pDevice) message.obj;
+                    if (d != null && setAndPersistDeviceName(d.deviceName)) {
+                        if (DBG) logd("set device name " + d.deviceName);
+                        replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED);
+                    } else {
+                        replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED,
+                                WifiP2pManager.ERROR);
+                    }
+                    break;
                 case WifiP2pManager.DISCOVER_PEERS:
                     // do not send service discovery request while normal find operation.
                     clearSupplicantServiceRequest();
@@ -705,33 +751,53 @@
             switch (message.what) {
                 case WifiP2pManager.CONNECT:
                     if (DBG) logd(getName() + " sending connect");
-                    mSavedPeerConfig = (WifiP2pConfig) message.obj;
-                    mPersistGroup = false;
-                    int netId = configuredNetworkId(mSavedPeerConfig.deviceAddress);
-                    if (netId >= 0) {
-                        //TODO: if failure, remove config and do a regular p2pConnect()
-                        mWifiNative.p2pReinvoke(netId, mSavedPeerConfig.deviceAddress);
-                    } else {
+                    WifiP2pConfig config = (WifiP2pConfig) message.obj;
+                    mAutonomousGroup = false;
+
+                    if (mSavedPeerConfig != null && config.deviceAddress.equals(
+                                    mSavedPeerConfig.deviceAddress)) {
+                        mSavedPeerConfig = config;
+
                         //Stop discovery before issuing connect
                         mWifiNative.p2pStopFind();
-                        //If peer is a GO, we do not need to send provisional discovery,
-                        //the supplicant takes care of it.
                         if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
-                            if (DBG) logd("Sending join to GO");
                             p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP);
-                            transitionTo(mGroupNegotiationState);
                         } else {
-                            if (DBG) logd("Sending prov disc");
-                            transitionTo(mProvisionDiscoveryState);
+                            p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP);
+                        }
+                        transitionTo(mGroupNegotiationState);
+                    } else {
+                        mSavedPeerConfig = config;
+                        int netId = configuredNetworkId(mSavedPeerConfig.deviceAddress);
+                        if (netId >= 0) {
+                            //TODO: if failure, remove config and do a regular p2pConnect()
+                            mWifiNative.p2pReinvoke(netId, mSavedPeerConfig.deviceAddress);
+                        } else {
+                            //Stop discovery before issuing connect
+                            mWifiNative.p2pStopFind();
+                            //If peer is a GO, we do not need to send provisional discovery,
+                            //the supplicant takes care of it.
+                            if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
+                                if (DBG) logd("Sending join to GO");
+                                p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP);
+                                transitionTo(mGroupNegotiationState);
+                            } else {
+                                if (DBG) logd("Sending prov disc");
+                                transitionTo(mProvisionDiscoveryState);
+                            }
                         }
                     }
-                    updateDeviceStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED);
+                    mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED);
                     sendP2pPeersChangedBroadcast();
                     replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED);
                     break;
                 case WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT:
                     mSavedPeerConfig = (WifiP2pConfig) message.obj;
-                    transitionTo(mUserAuthorizingInvitationState);
+
+                    if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress),
+                            mSavedPeerConfig)) {
+                        transitionTo(mUserAuthorizingInvitationState);
+                    }
                     break;
                 case WifiMonitor.P2P_INVITATION_RECEIVED_EVENT:
                     WifiP2pGroup group = (WifiP2pGroup) message.obj;
@@ -747,7 +813,7 @@
 
                     //Check if we have the owner in peer list and use appropriate
                     //wps method. Default is to use PBC.
-                    if ((owner = getDeviceFromPeerList(owner.deviceAddress)) != null) {
+                    if ((owner = mPeers.get(owner.deviceAddress)) != null) {
                         if (owner.wpsPbcSupported()) {
                             mSavedPeerConfig.wps.setup = WpsInfo.PBC;
                         } else if (owner.wpsKeypadSupported()) {
@@ -756,29 +822,23 @@
                             mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY;
                         }
                     }
-                    transitionTo(mUserAuthorizingInvitationState);
+
+                    //TODO In the p2p client case, we should set source address correctly.
+                    if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress),
+                            mSavedPeerConfig)) {
+                        transitionTo(mUserAuthorizingInvitationState);
+                    }
                     break;
                 case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT:
                 case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT:
                 case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT:
-                    WifiP2pProvDiscEvent provDisc = (WifiP2pProvDiscEvent) message.obj;
-                    mSavedPeerConfig = new WifiP2pConfig();
-                    mSavedPeerConfig.deviceAddress = provDisc.device.deviceAddress;
-                    if (message.what == WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT) {
-                        mSavedPeerConfig.wps.setup = WpsInfo.KEYPAD;
-                        if (DBG) logd("Keypad prov disc request");
-                    } else if (message.what == WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT) {
-                        mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY;
-                        mSavedPeerConfig.wps.pin = provDisc.pin;
-                        if (DBG) logd("Display prov disc request");
-                    } else {
-                        mSavedPeerConfig.wps.setup = WpsInfo.PBC;
-                        if (DBG) logd("PBC prov disc request");
-                    }
-                    transitionTo(mUserAuthorizingInvitationState);
-                    break;
+                    //We let the supplicant handle the provision discovery response
+                    //and wait instead for the GO_NEGOTIATION_REQUEST_EVENT.
+                    //Handling provision discovery and issuing a p2p_connect before
+                    //group negotiation comes through causes issues
+                   break;
                 case WifiP2pManager.CREATE_GROUP:
-                    mPersistGroup = true;
+                    mAutonomousGroup = true;
                     if (mWifiNative.p2pGroupAdd()) {
                         replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED);
                     } else {
@@ -840,12 +900,16 @@
         @Override
         public void enter() {
             if (DBG) logd(getName());
-            notifyInvitationReceived();
+            if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress),
+                    mSavedPeerConfig)) {
+                notifyInvitationReceived();
+            }
         }
 
         @Override
         public boolean processMessage(Message message) {
             if (DBG) logd(getName() + message.toString());
+            boolean ret = HANDLED;
             switch (message.what) {
                 case PEER_CONNECTION_USER_ACCEPT:
                     //TODO: handle persistence
@@ -854,7 +918,7 @@
                     } else {
                         p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP);
                     }
-                    updateDeviceStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED);
+                    mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED);
                     sendP2pPeersChangedBroadcast();
                     transitionTo(mGroupNegotiationState);
                     break;
@@ -866,7 +930,7 @@
                 default:
                     return NOT_HANDLED;
             }
-            return HANDLED;
+            return ret;
         }
 
         @Override
@@ -924,7 +988,9 @@
                         if (DBG) logd("Found a match " + mSavedPeerConfig);
                         mSavedPeerConfig.wps.pin = provDisc.pin;
                         mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP);
-                        notifyInvitationSent(provDisc.pin, device.deviceAddress);
+                        if (!sendShowPinReqToFrontApp(provDisc.pin)) {
+                            notifyInvitationSent(provDisc.pin, device.deviceAddress);
+                        }
                         transitionTo(mGroupNegotiationState);
                     }
                     break;
@@ -961,7 +1027,7 @@
                                 P2pStateMachine.this, mGroup.getInterface());
                         mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP);
                         WifiP2pDevice groupOwner = mGroup.getOwner();
-                        updateDeviceStatus(groupOwner.deviceAddress, WifiP2pDevice.CONNECTED);
+                        mPeers.updateStatus(groupOwner.deviceAddress, WifiP2pDevice.CONNECTED);
                         sendP2pPeersChangedBroadcast();
                     }
                     mSavedPeerConfig = null;
@@ -996,7 +1062,7 @@
                 sendP2pConnectionChangedBroadcast();
             }
 
-            if (!mPersistGroup) {
+            if (!mAutonomousGroup) {
                 mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S);
             }
         }
@@ -1009,8 +1075,12 @@
                     WifiP2pDevice device = (WifiP2pDevice) message.obj;
                     String deviceAddress = device.deviceAddress;
                     if (deviceAddress != null) {
+                        if (mSavedProvDiscDevice != null &&
+                                deviceAddress.equals(mSavedProvDiscDevice.deviceAddress)) {
+                            mSavedProvDiscDevice = null;
+                        }
                         mGroup.addClient(deviceAddress);
-                        updateDeviceStatus(deviceAddress, WifiP2pDevice.CONNECTED);
+                        mPeers.updateStatus(deviceAddress, WifiP2pDevice.CONNECTED);
                         if (DBG) logd(getName() + " ap sta connected");
                         sendP2pPeersChangedBroadcast();
                     } else {
@@ -1021,10 +1091,10 @@
                     device = (WifiP2pDevice) message.obj;
                     deviceAddress = device.deviceAddress;
                     if (deviceAddress != null) {
-                        updateDeviceStatus(deviceAddress, WifiP2pDevice.AVAILABLE);
+                        mPeers.updateStatus(deviceAddress, WifiP2pDevice.AVAILABLE);
                         if (mGroup.removeClient(deviceAddress)) {
                             if (DBG) logd("Removed client " + deviceAddress);
-                            if (!mPersistGroup && mGroup.isClientListEmpty()) {
+                            if (!mAutonomousGroup && mGroup.isClientListEmpty()) {
                                 Slog.d(TAG, "Client list empty, remove non-persistent p2p group");
                                 mWifiNative.p2pGroupRemove(mGroup.getInterface());
                             }
@@ -1103,14 +1173,45 @@
                     break;
                 case WifiP2pManager.CONNECT:
                     WifiP2pConfig config = (WifiP2pConfig) message.obj;
-                    logd("Inviting device : " + config.deviceAddress);
-                    if (mWifiNative.p2pInvite(mGroup, config.deviceAddress)) {
-                        updateDeviceStatus(config.deviceAddress, WifiP2pDevice.INVITED);
-                        sendP2pPeersChangedBroadcast();
+                    if (config.deviceAddress == null ||
+                            (mSavedProvDiscDevice != null &&
+                                    mSavedProvDiscDevice.deviceAddress.equals(
+                                            config.deviceAddress))) {
+                        if (config.wps.setup == WpsInfo.PBC) {
+                            mWifiNative.startWpsPbc(mGroup.getInterface(), null);
+                        } else {
+                            if (config.wps.pin == null) {
+                                String pin = mWifiNative.startWpsPinDisplay(mGroup.getInterface());
+                                try {
+                                    Integer.parseInt(pin);
+                                    if (!sendShowPinReqToFrontApp(pin)) {
+                                        notifyInvitationSent(pin,
+                                                config.deviceAddress != null ?
+                                                        config.deviceAddress : "any");
+                                    }
+                                } catch (NumberFormatException ignore) {
+                                    // do nothing if pin is invalid
+                                }
+                            } else {
+                                mWifiNative.startWpsPinKeypad(mGroup.getInterface(),
+                                        config.wps.pin);
+                            }
+                        }
+                        if (config.deviceAddress != null) {
+                            mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED);
+                            sendP2pPeersChangedBroadcast();
+                        }
                         replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED);
                     } else {
-                        replyToMessage(message, WifiP2pManager.CONNECT_FAILED,
-                                WifiP2pManager.ERROR);
+                        logd("Inviting device : " + config.deviceAddress);
+                        if (mWifiNative.p2pInvite(mGroup, config.deviceAddress)) {
+                            mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED);
+                            sendP2pPeersChangedBroadcast();
+                            replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED);
+                        } else {
+                            replyToMessage(message, WifiP2pManager.CONNECT_FAILED,
+                                    WifiP2pManager.ERROR);
+                        }
                     }
                     // TODO: figure out updating the status to declined when invitation is rejected
                     break;
@@ -1118,6 +1219,7 @@
                 case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT:
                 case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT:
                     WifiP2pProvDiscEvent provDisc = (WifiP2pProvDiscEvent) message.obj;
+                    mSavedProvDiscDevice = provDisc.device;
                     mSavedPeerConfig = new WifiP2pConfig();
                     mSavedPeerConfig.deviceAddress = provDisc.device.deviceAddress;
                     if (message.what == WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT) {
@@ -1128,7 +1230,9 @@
                     } else {
                         mSavedPeerConfig.wps.setup = WpsInfo.PBC;
                     }
-                    transitionTo(mUserAuthorizingJoinState);
+                    if (!sendConnectNoticeToApp(mSavedProvDiscDevice, mSavedPeerConfig)) {
+                        transitionTo(mUserAuthorizingJoinState);
+                    }
                     break;
                 case WifiMonitor.P2P_GROUP_STARTED_EVENT:
                     Slog.e(TAG, "Duplicate group creation event notice, ignore");
@@ -1140,6 +1244,7 @@
         }
 
         public void exit() {
+            mSavedProvDiscDevice = null;
             updateThisDevice(WifiP2pDevice.AVAILABLE);
             setWifiP2pInfoOnGroupTermination();
             mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null);
@@ -1151,6 +1256,7 @@
         @Override
         public void enter() {
             if (DBG) logd(getName());
+
             notifyInvitationReceived();
         }
 
@@ -1165,9 +1271,10 @@
                     break;
                 case PEER_CONNECTION_USER_ACCEPT:
                     if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) {
-                        mWifiNative.startWpsPbc(null);
+                        mWifiNative.startWpsPbc(mGroup.getInterface(), null);
                     } else {
-                        mWifiNative.startWpsPinKeypad(mSavedPeerConfig.wps.pin);
+                        mWifiNative.startWpsPinKeypad(mGroup.getInterface(),
+                                mSavedPeerConfig.wps.pin);
                     }
                     mSavedPeerConfig = null;
                     transitionTo(mGroupCreatedState);
@@ -1358,14 +1465,6 @@
         dialog.show();
     }
 
-    private void updateDeviceStatus(String deviceAddress, int status) {
-        for (WifiP2pDevice d : mPeers.getDeviceList()) {
-            if (d.deviceAddress.equals(deviceAddress)) {
-                d.status = status;
-            }
-        }
-    }
-
     //TODO: implement when wpa_supplicant is fixed
     private int configuredNetworkId(String deviceAddress) {
         return -1;
@@ -1384,36 +1483,59 @@
     }
 
     private String getDeviceName(String deviceAddress) {
-        for (WifiP2pDevice d : mPeers.getDeviceList()) {
-            if (d.deviceAddress.equals(deviceAddress)) {
+        WifiP2pDevice d = mPeers.get(deviceAddress);
+        if (d != null) {
                 return d.deviceName;
-            }
         }
         //Treat the address as name if there is no match
         return deviceAddress;
     }
 
-    private WifiP2pDevice getDeviceFromPeerList(String deviceAddress) {
-        for (WifiP2pDevice d : mPeers.getDeviceList()) {
-            if (d.deviceAddress.equals(deviceAddress)) {
-                return d;
-            }
-        }
-        return null;
-    }
-
     private void p2pConnectWithPinDisplay(WifiP2pConfig config, boolean join) {
         String pin = mWifiNative.p2pConnect(config, join);
         try {
             Integer.parseInt(pin);
-            notifyInvitationSent(pin, config.deviceAddress);
+            if (!sendShowPinReqToFrontApp(pin)) {
+                notifyInvitationSent(pin, config.deviceAddress);
+            }
         } catch (NumberFormatException ignore) {
             // do nothing if p2pConnect did not return a pin
         }
     }
 
+    private String getPersistedDeviceName() {
+        String deviceName = Settings.Secure.getString(mContext.getContentResolver(),
+                Settings.Secure.WIFI_P2P_DEVICE_NAME);
+        if (deviceName == null) {
+            /* We use the 4 digits of the ANDROID_ID to have a friendly
+             * default that has low likelihood of collision with a peer */
+            String id = Settings.Secure.getString(mContext.getContentResolver(),
+                    Settings.Secure.ANDROID_ID);
+            return "Android_" + id.substring(0,4);
+        }
+        return deviceName;
+    }
+
+    private boolean setAndPersistDeviceName(String devName) {
+        if (devName == null) return false;
+
+        if (!mWifiNative.setDeviceName(devName)) {
+            loge("Failed to set device name " + devName);
+            return false;
+        }
+
+        mThisDevice.deviceName = devName;
+        mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName);
+
+        Settings.Secure.putString(mContext.getContentResolver(),
+                Settings.Secure.WIFI_P2P_DEVICE_NAME, devName);
+        sendThisDeviceChangedBroadcast();
+        return true;
+    }
+
     private void initializeP2pSettings() {
         mWifiNative.setPersistentReconnect(true);
+        mThisDevice.deviceName = getPersistedDeviceName();
         mWifiNative.setDeviceName(mThisDevice.deviceName);
         //DIRECT-XY-DEVICENAME (XY is randomly generated)
         mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName);
@@ -1736,6 +1858,139 @@
         return clientInfo;
     }
 
+    /**
+     * Send detached message to dialog listener in the foreground application.
+     * @param reason
+     */
+    private void sendDetachedMsg(int reason) {
+        if (mForegroundAppMessenger == null) return;
+
+        Message msg = Message.obtain();
+        msg.what = WifiP2pManager.DIALOG_LISTENER_DETACHED;
+        msg.arg1 = reason;
+        try {
+            mForegroundAppMessenger.send(msg);
+        } catch (RemoteException e) {
+        }
+        mForegroundAppMessenger = null;
+        mForegroundAppPkgName = null;
+    }
+
+    /**
+     * Send a request to show wps pin to dialog listener in the foreground application.
+     * @param pin WPS pin
+     * @return
+     */
+    private boolean sendShowPinReqToFrontApp(String pin) {
+        if (!isForegroundApp(mForegroundAppPkgName)) {
+            sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND);
+            return false;
+        }
+        Message msg = Message.obtain();
+        msg.what = WifiP2pManager.SHOW_PIN_REQUESTED;
+        Bundle bundle = new Bundle();
+        bundle.putString(WifiP2pManager.WPS_PIN_BUNDLE_KEY, pin);
+        msg.setData(bundle);
+        return sendDialogMsgToFrontApp(msg);
+    }
+
+    /**
+     * Send a request to establish the connection to dialog listener in the foreground
+     * application.
+     * @param dev source device
+     * @param config
+     * @return
+     */
+    private boolean sendConnectNoticeToApp(WifiP2pDevice dev, WifiP2pConfig config) {
+        if (dev == null) {
+            dev = new WifiP2pDevice(config.deviceAddress);
+        }
+
+        if (!isForegroundApp(mForegroundAppPkgName)) {
+            if (DBG) logd("application is NOT foreground");
+            sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND);
+            return false;
+        }
+
+        Message msg = Message.obtain();
+        msg.what = WifiP2pManager.CONNECTION_REQUESTED;
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(WifiP2pManager.P2P_DEV_BUNDLE_KEY, dev);
+        bundle.putParcelable(WifiP2pManager.P2P_CONFIG_BUNDLE_KEY, config);
+        msg.setData(bundle);
+        return sendDialogMsgToFrontApp(msg);
+    }
+
+    /**
+     * Send dialog event message to front application's dialog listener.
+     * @param msg
+     * @return true if success.
+     */
+    private boolean sendDialogMsgToFrontApp(Message msg) {
+        try {
+            mForegroundAppMessenger.send(msg);
+        } catch (RemoteException e) {
+            mForegroundAppMessenger = null;
+            mForegroundAppPkgName = null;
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Set dialog listener application.
+     * @param m
+     * @param appPkgName if null, reset the listener.
+     * @param isReset if true, try to reset.
+     * @return
+     */
+    private boolean setDialogListenerApp(Messenger m,
+            String appPkgName, boolean isReset) {
+
+        if (mForegroundAppPkgName != null && !mForegroundAppPkgName.equals(appPkgName)) {
+            if (isForegroundApp(mForegroundAppPkgName)) {
+                // The current dialog listener is foreground app's.
+                if (DBG) logd("application is NOT foreground");
+                return false;
+            }
+            // detach an old listener.
+            sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND);
+        }
+
+        if (isReset) {
+            if (DBG) logd("reset dialog listener");
+            mForegroundAppMessenger = null;
+            mForegroundAppPkgName = null;
+            return true;
+        }
+
+        if (!isForegroundApp(appPkgName)) {
+            return false;
+        }
+
+        mForegroundAppMessenger = m;
+        mForegroundAppPkgName = appPkgName;
+        if (DBG) logd("set dialog listener. app=" + appPkgName);
+        return true;
+    }
+
+    /**
+     * Return true if the specified package name is foreground app's.
+     *
+     * @param pkgName application package name.
+     * @return
+     */
+    private boolean isForegroundApp(String pkgName) {
+        if (pkgName == null) return false;
+
+        List<RunningTaskInfo> tasks = mActivityMgr.getRunningTasks(1);
+        if (tasks.size() == 0) {
+            return false;
+        }
+
+        return pkgName.equals(tasks.get(0).baseActivity.getPackageName());
+    }
+
     }
 
     /**
@@ -1766,4 +2021,5 @@
             mServList = new ArrayList<WifiP2pServiceInfo>();
         }
     }
+
 }