Merge "Remove UUIDs from the cache when the device is unpaired."
diff --git a/Android.mk b/Android.mk
index 06db5822..8a8678d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -81,7 +81,6 @@
 	core/java/android/app/IActivityWatcher.aidl \
 	core/java/android/app/IAlarmManager.aidl \
 	core/java/android/app/IBackupAgent.aidl \
-    core/java/android/app/IDevicePolicyManager.aidl \
 	core/java/android/app/IInstrumentationWatcher.aidl \
 	core/java/android/app/INotificationManager.aidl \
 	core/java/android/app/ISearchManager.aidl \
@@ -93,6 +92,7 @@
 	core/java/android/app/IUiModeManager.aidl \
 	core/java/android/app/IWallpaperManager.aidl \
 	core/java/android/app/IWallpaperManagerCallback.aidl \
+	core/java/android/app/admin/IDevicePolicyManager.aidl \
 	core/java/android/backup/IBackupManager.aidl \
 	core/java/android/backup/IRestoreObserver.aidl \
 	core/java/android/backup/IRestoreSession.aidl \
@@ -167,6 +167,7 @@
 	location/java/android/location/ILocationProvider.aidl \
 	location/java/android/location/INetInitiatedListener.aidl \
 	media/java/android/media/IAudioService.aidl \
+	media/java/android/media/IAudioFocusDispatcher.aidl \
 	media/java/android/media/IMediaScannerListener.aidl \
 	media/java/android/media/IMediaScannerService.aidl \
 	telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl \
diff --git a/api/8.xml b/api/8.xml
index a07537c..c5e899d 100644
--- a/api/8.xml
+++ b/api/8.xml
@@ -42346,28 +42346,6 @@
  visibility="public"
 >
 </field>
-<field name="PKG_INSTALL_COMPLETE"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PKG_INSTALL_INCOMPLETE"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
 <field name="SIGNATURE_FIRST_NOT_SIGNED"
  type="int"
  transient="false"
diff --git a/api/current.xml b/api/current.xml
index 8a9a77a..1f7be9e 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -7819,6 +7819,39 @@
  visibility="public"
 >
 </field>
+<field name="stripEnabled"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843454"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="stripLeft"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843452"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="stripRight"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843453"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="suggestActionMsg"
  type="int"
  transient="false"
@@ -20089,804 +20122,6 @@
 </parameter>
 </method>
 </interface>
-<class name="DeviceAdminInfo"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-<implements name="android.os.Parcelable">
-</implements>
-<constructor name="DeviceAdminInfo"
- type="android.app.DeviceAdminInfo"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="receiver" type="android.content.pm.ResolveInfo">
-</parameter>
-<exception name="IOException" type="java.io.IOException">
-</exception>
-<exception name="XmlPullParserException" type="org.xmlpull.v1.XmlPullParserException">
-</exception>
-</constructor>
-<method name="describeContents"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="dump"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="pw" type="android.util.Printer">
-</parameter>
-<parameter name="prefix" type="java.lang.String">
-</parameter>
-</method>
-<method name="getActivityInfo"
- return="android.content.pm.ActivityInfo"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getComponent"
- return="android.content.ComponentName"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getPackageName"
- return="java.lang.String"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getReceiverName"
- return="java.lang.String"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getTagForPolicy"
- return="java.lang.String"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="policyIdent" type="int">
-</parameter>
-</method>
-<method name="loadDescription"
- return="java.lang.CharSequence"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="pm" type="android.content.pm.PackageManager">
-</parameter>
-<exception name="Resources.NotFoundException" type="android.content.res.Resources.NotFoundException">
-</exception>
-</method>
-<method name="loadIcon"
- return="android.graphics.drawable.Drawable"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="pm" type="android.content.pm.PackageManager">
-</parameter>
-</method>
-<method name="loadLabel"
- return="java.lang.CharSequence"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="pm" type="android.content.pm.PackageManager">
-</parameter>
-</method>
-<method name="usesPolicy"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="policyIdent" type="int">
-</parameter>
-</method>
-<method name="writeToParcel"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="dest" type="android.os.Parcel">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<field name="CREATOR"
- type="android.os.Parcelable.Creator"
- transient="false"
- volatile="false"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="USES_POLICY_FORCE_LOCK"
- type="int"
- transient="false"
- volatile="false"
- value="3"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="USES_POLICY_LIMIT_PASSWORD"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="USES_POLICY_RESET_PASSWORD"
- type="int"
- transient="false"
- volatile="false"
- value="2"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="USES_POLICY_WATCH_LOGIN"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="USES_POLICY_WIPE_DATA"
- type="int"
- transient="false"
- volatile="false"
- value="4"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="DeviceAdminReceiver"
- extends="android.content.BroadcastReceiver"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="DeviceAdminReceiver"
- type="android.app.DeviceAdminReceiver"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</constructor>
-<method name="getManager"
- return="android.app.DevicePolicyManager"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-</method>
-<method name="getWho"
- return="android.content.ComponentName"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-</method>
-<method name="onDisableRequested"
- return="java.lang.CharSequence"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onDisabled"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onEnabled"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onPasswordChanged"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onPasswordFailed"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onPasswordSucceeded"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<method name="onReceive"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="context" type="android.content.Context">
-</parameter>
-<parameter name="intent" type="android.content.Intent">
-</parameter>
-</method>
-<field name="ACTION_DEVICE_ADMIN_DISABLED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.DEVICE_ADMIN_DISABLED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_DEVICE_ADMIN_DISABLE_REQUESTED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_DEVICE_ADMIN_ENABLED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.DEVICE_ADMIN_ENABLED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_PASSWORD_CHANGED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.ACTION_PASSWORD_CHANGED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_PASSWORD_FAILED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.ACTION_PASSWORD_FAILED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_PASSWORD_SUCCEEDED"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.ACTION_PASSWORD_SUCCEEDED&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="DEVICE_ADMIN_META_DATA"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.device_admin&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="EXTRA_DISABLE_WARNING"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.extra.DISABLE_WARNING&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="DevicePolicyManager"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="getActiveAdmins"
- return="java.util.List&lt;android.content.ComponentName&gt;"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getCurrentFailedPasswordAttempts"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getMaximumFailedPasswordsForWipe"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="getMaximumTimeToLock"
- return="long"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="getPasswordMaximumLength"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="quality" type="int">
-</parameter>
-</method>
-<method name="getPasswordMinimumLength"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="getPasswordQuality"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="isActivePasswordSufficient"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="isAdminActive"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="who" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="lockNow"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="removeActiveAdmin"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="who" type="android.content.ComponentName">
-</parameter>
-</method>
-<method name="resetPassword"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="password" type="java.lang.String">
-</parameter>
-</method>
-<method name="setMaximumFailedPasswordsForWipe"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-<parameter name="num" type="int">
-</parameter>
-</method>
-<method name="setMaximumTimeToLock"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-<parameter name="timeMs" type="long">
-</parameter>
-</method>
-<method name="setPasswordMinimumLength"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-<parameter name="length" type="int">
-</parameter>
-</method>
-<method name="setPasswordQuality"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="admin" type="android.content.ComponentName">
-</parameter>
-<parameter name="quality" type="int">
-</parameter>
-</method>
-<method name="wipeData"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<field name="ACTION_ADD_DEVICE_ADMIN"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.ADD_DEVICE_ADMIN&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="ACTION_SET_NEW_PASSWORD"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.action.SET_NEW_PASSWORD&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="EXTRA_ADD_EXPLANATION"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.extra.ADD_EXPLANATION&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="EXTRA_DEVICE_ADMIN"
- type="java.lang.String"
- transient="false"
- volatile="false"
- value="&quot;android.app.extra.DEVICE_ADMIN&quot;"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PASSWORD_QUALITY_ALPHANUMERIC"
- type="int"
- transient="false"
- volatile="false"
- value="196608"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PASSWORD_QUALITY_NUMERIC"
- type="int"
- transient="false"
- volatile="false"
- value="131072"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PASSWORD_QUALITY_SOMETHING"
- type="int"
- transient="false"
- volatile="false"
- value="65536"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PASSWORD_QUALITY_UNSPECIFIED"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
 <class name="Dialog"
  extends="java.lang.Object"
  abstract="false"
@@ -25238,6 +24473,17 @@
  visibility="public"
 >
 </field>
+<field name="SUGGEST_COLUMN_TEXT_2_URL"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;suggest_text_2_url&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SUGGEST_MIME_TYPE"
  type="java.lang.String"
  transient="false"
@@ -26841,6 +26087,831 @@
 </field>
 </class>
 </package>
+<package name="android.app.admin"
+>
+<class name="DeviceAdminInfo"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.os.Parcelable">
+</implements>
+<constructor name="DeviceAdminInfo"
+ type="android.app.admin.DeviceAdminInfo"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="receiver" type="android.content.pm.ResolveInfo">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+<exception name="XmlPullParserException" type="org.xmlpull.v1.XmlPullParserException">
+</exception>
+</constructor>
+<method name="describeContents"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="dump"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="pw" type="android.util.Printer">
+</parameter>
+<parameter name="prefix" type="java.lang.String">
+</parameter>
+</method>
+<method name="getActivityInfo"
+ return="android.content.pm.ActivityInfo"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getComponent"
+ return="android.content.ComponentName"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getPackageName"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getReceiverName"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getTagForPolicy"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="policyIdent" type="int">
+</parameter>
+</method>
+<method name="isVisible"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="loadDescription"
+ return="java.lang.CharSequence"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="pm" type="android.content.pm.PackageManager">
+</parameter>
+<exception name="Resources.NotFoundException" type="android.content.res.Resources.NotFoundException">
+</exception>
+</method>
+<method name="loadIcon"
+ return="android.graphics.drawable.Drawable"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="pm" type="android.content.pm.PackageManager">
+</parameter>
+</method>
+<method name="loadLabel"
+ return="java.lang.CharSequence"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="pm" type="android.content.pm.PackageManager">
+</parameter>
+</method>
+<method name="usesPolicy"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="policyIdent" type="int">
+</parameter>
+</method>
+<method name="writeToParcel"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="dest" type="android.os.Parcel">
+</parameter>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<field name="CREATOR"
+ type="android.os.Parcelable.Creator"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="USES_POLICY_FORCE_LOCK"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="USES_POLICY_LIMIT_PASSWORD"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="USES_POLICY_RESET_PASSWORD"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="USES_POLICY_WATCH_LOGIN"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="USES_POLICY_WIPE_DATA"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="DeviceAdminReceiver"
+ extends="android.content.BroadcastReceiver"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="DeviceAdminReceiver"
+ type="android.app.admin.DeviceAdminReceiver"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="getManager"
+ return="android.app.admin.DevicePolicyManager"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</method>
+<method name="getWho"
+ return="android.content.ComponentName"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</method>
+<method name="onDisableRequested"
+ return="java.lang.CharSequence"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onDisabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onPasswordChanged"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onPasswordFailed"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onPasswordSucceeded"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<method name="onReceive"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="intent" type="android.content.Intent">
+</parameter>
+</method>
+<field name="ACTION_DEVICE_ADMIN_DISABLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.DEVICE_ADMIN_DISABLED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_DEVICE_ADMIN_DISABLE_REQUESTED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_DEVICE_ADMIN_ENABLED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.DEVICE_ADMIN_ENABLED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_PASSWORD_CHANGED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.ACTION_PASSWORD_CHANGED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_PASSWORD_FAILED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.ACTION_PASSWORD_FAILED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_PASSWORD_SUCCEEDED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.ACTION_PASSWORD_SUCCEEDED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DEVICE_ADMIN_META_DATA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.device_admin&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_DISABLE_WARNING"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.extra.DISABLE_WARNING&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="DevicePolicyManager"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="getActiveAdmins"
+ return="java.util.List&lt;android.content.ComponentName&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getCurrentFailedPasswordAttempts"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getMaximumFailedPasswordsForWipe"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="getMaximumTimeToLock"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="getPasswordMaximumLength"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="quality" type="int">
+</parameter>
+</method>
+<method name="getPasswordMinimumLength"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="getPasswordQuality"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="isActivePasswordSufficient"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isAdminActive"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="who" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="lockNow"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeActiveAdmin"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="who" type="android.content.ComponentName">
+</parameter>
+</method>
+<method name="resetPassword"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="password" type="java.lang.String">
+</parameter>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<method name="setMaximumFailedPasswordsForWipe"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+<parameter name="num" type="int">
+</parameter>
+</method>
+<method name="setMaximumTimeToLock"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+<parameter name="timeMs" type="long">
+</parameter>
+</method>
+<method name="setPasswordMinimumLength"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+<parameter name="length" type="int">
+</parameter>
+</method>
+<method name="setPasswordQuality"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="admin" type="android.content.ComponentName">
+</parameter>
+<parameter name="quality" type="int">
+</parameter>
+</method>
+<method name="wipeData"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="flags" type="int">
+</parameter>
+</method>
+<field name="ACTION_ADD_DEVICE_ADMIN"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.ADD_DEVICE_ADMIN&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_SET_NEW_PASSWORD"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.action.SET_NEW_PASSWORD&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_ADD_EXPLANATION"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.extra.ADD_EXPLANATION&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="EXTRA_DEVICE_ADMIN"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.app.extra.DEVICE_ADMIN&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="PASSWORD_QUALITY_ALPHANUMERIC"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="196608"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="PASSWORD_QUALITY_NUMERIC"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="131072"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="PASSWORD_QUALITY_SOMETHING"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="65536"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="PASSWORD_QUALITY_UNSPECIFIED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="RESET_PASSWORD_REQUIRE_ENTRY"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+</package>
 <package name="android.appwidget"
 >
 <class name="AppWidgetHost"
@@ -30038,6 +30109,48 @@
 >
 </field>
 </class>
+<class name="ActiveSyncInfo"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="getAccount"
+ return="android.accounts.Account"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getAuthority"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getStartTime"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+</class>
 <class name="ActivityNotFoundException"
  extends="java.lang.RuntimeException"
  abstract="false"
@@ -32073,6 +32186,17 @@
 <parameter name="selectionArgs" type="java.lang.String[]">
 </parameter>
 </method>
+<method name="getActiveSync"
+ return="android.content.ActiveSyncInfo"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getIsSyncable"
  return="int"
  abstract="false"
@@ -32679,6 +32803,39 @@
  visibility="public"
 >
 </field>
+<field name="SYNC_OBSERVER_TYPE_ACTIVE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SYNC_OBSERVER_TYPE_PENDING"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SYNC_OBSERVER_TYPE_SETTINGS"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </class>
 <class name="ContentUris"
  extends="java.lang.Object"
@@ -36445,6 +36602,32 @@
 <parameter name="defaultValue" type="char">
 </parameter>
 </method>
+<method name="getCharSequenceArrayExtra"
+ return="java.lang.CharSequence[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
+<method name="getCharSequenceArrayListExtra"
+ return="java.util.ArrayList&lt;java.lang.CharSequence&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
 <method name="getCharSequenceExtra"
  return="java.lang.CharSequence"
  abstract="false"
@@ -36906,6 +37089,21 @@
 <exception name="URISyntaxException" type="java.net.URISyntaxException">
 </exception>
 </method>
+<method name="putCharSequenceArrayListExtra"
+ return="android.content.Intent"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
+<parameter name="value" type="java.util.ArrayList&lt;java.lang.CharSequence&gt;">
+</parameter>
+</method>
 <method name="putExtra"
  return="android.content.Intent"
  abstract="false"
@@ -37248,6 +37446,21 @@
 >
 <parameter name="name" type="java.lang.String">
 </parameter>
+<parameter name="value" type="java.lang.CharSequence[]">
+</parameter>
+</method>
+<method name="putExtra"
+ return="android.content.Intent"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="name" type="java.lang.String">
+</parameter>
 <parameter name="value" type="android.os.Bundle">
 </parameter>
 </method>
@@ -42175,6 +42388,17 @@
  visibility="public"
 >
 </field>
+<field name="CONFIG_UI_MODE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="512"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="CREATOR"
  type="android.os.Parcelable.Creator"
  transient="false"
@@ -45298,28 +45522,6 @@
  visibility="public"
 >
 </field>
-<field name="PKG_INSTALL_COMPLETE"
- type="int"
- transient="false"
- volatile="false"
- value="1"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="PKG_INSTALL_INCOMPLETE"
- type="int"
- transient="false"
- volatile="false"
- value="0"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
 <field name="SIGNATURE_FIRST_NOT_SIGNED"
  type="int"
  transient="false"
@@ -47650,6 +47852,94 @@
  visibility="public"
 >
 </field>
+<field name="UI_MODE_NIGHT_MASK"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="48"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_NIGHT_NO"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_NIGHT_UNDEFINED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_NIGHT_YES"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="32"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_TYPE_CAR"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_TYPE_MASK"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="15"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_TYPE_NORMAL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="UI_MODE_TYPE_UNDEFINED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="fontScale"
  type="float"
  transient="false"
@@ -47770,6 +48060,16 @@
  visibility="public"
 >
 </field>
+<field name="uiMode"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </class>
 <class name="Resources"
  extends="java.lang.Object"
@@ -54728,7 +55028,7 @@
  volatile="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="protected"
 >
 </field>
@@ -54738,7 +55038,7 @@
  volatile="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="protected"
 >
 </field>
@@ -54748,7 +55048,7 @@
  volatile="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="protected"
 >
 </field>
@@ -71261,6 +71561,19 @@
 <exception name="IOException" type="java.io.IOException">
 </exception>
 </method>
+<method name="setZoomCallback"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="cb" type="android.hardware.Camera.ZoomCallback">
+</parameter>
+</method>
 <method name="startPreview"
  return="void"
  abstract="false"
@@ -71272,6 +71585,19 @@
  visibility="public"
 >
 </method>
+<method name="startSmoothZoom"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="int">
+</parameter>
+</method>
 <method name="stopPreview"
  return="void"
  abstract="false"
@@ -71283,6 +71609,17 @@
  visibility="public"
 >
 </method>
+<method name="stopSmoothZoom"
+ return="void"
+ abstract="false"
+ native="true"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="takePicture"
  return="void"
  abstract="false"
@@ -71576,6 +71913,17 @@
  visibility="public"
 >
 </method>
+<method name="getMaxZoom"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getMinExposureCompensation"
  return="int"
  abstract="false"
@@ -71807,6 +72155,50 @@
  visibility="public"
 >
 </method>
+<method name="getZoom"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getZoomRatios"
+ return="java.util.List&lt;java.lang.Integer&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isSmoothZoomSupported"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isZoomSupported"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="remove"
  return="void"
  abstract="false"
@@ -72127,6 +72519,19 @@
 <parameter name="value" type="java.lang.String">
 </parameter>
 </method>
+<method name="setZoom"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="value" type="int">
+</parameter>
+</method>
 <method name="unflatten"
  return="void"
  abstract="false"
@@ -72742,6 +73147,31 @@
 >
 </field>
 </class>
+<interface name="Camera.ZoomCallback"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onZoomUpdate"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="zoomValue" type="int">
+</parameter>
+<parameter name="stopped" type="boolean">
+</parameter>
+<parameter name="camera" type="android.hardware.Camera">
+</parameter>
+</method>
+</interface>
 <class name="GeomagneticField"
  extends="java.lang.Object"
  abstract="false"
@@ -72991,7 +73421,7 @@
  value="3"
  static="true"
  final="true"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </field>
@@ -77642,75 +78072,6 @@
 </exception>
 </method>
 </class>
-<class name="GeocoderParams"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<implements name="android.os.Parcelable">
-</implements>
-<method name="describeContents"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getClientPackage"
- return="java.lang.String"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getLocale"
- return="java.util.Locale"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="writeToParcel"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="parcel" type="android.os.Parcel">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<field name="CREATOR"
- type="android.os.Parcelable.Creator"
- transient="false"
- volatile="false"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
 <class name="GpsSatellite"
  extends="java.lang.Object"
  abstract="false"
@@ -90397,7 +90758,7 @@
  type="android.net.http.SslCertificate"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="issuedTo" type="java.lang.String">
@@ -90416,6 +90777,22 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="issuedTo" type="java.lang.String">
+</parameter>
+<parameter name="issuedBy" type="java.lang.String">
+</parameter>
+<parameter name="validNotBefore" type="java.util.Date">
+</parameter>
+<parameter name="validNotAfter" type="java.util.Date">
+</parameter>
+</constructor>
+<constructor name="SslCertificate"
+ type="android.net.http.SslCertificate"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
 <parameter name="certificate" type="java.security.cert.X509Certificate">
 </parameter>
 </constructor>
@@ -90448,6 +90825,17 @@
  synchronized="false"
  static="false"
  final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+</method>
+<method name="getValidNotAfterDate"
+ return="java.util.Date"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -90459,6 +90847,17 @@
  synchronized="false"
  static="false"
  final="false"
+ deprecated="deprecated"
+ visibility="public"
+>
+</method>
+<method name="getValidNotBeforeDate"
+ return="java.util.Date"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
  deprecated="not deprecated"
  visibility="public"
 >
@@ -112461,6 +112860,32 @@
 <parameter name="key" type="java.lang.String">
 </parameter>
 </method>
+<method name="getCharSequenceArray"
+ return="java.lang.CharSequence[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="key" type="java.lang.String">
+</parameter>
+</method>
+<method name="getCharSequenceArrayList"
+ return="java.util.ArrayList&lt;java.lang.CharSequence&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="key" type="java.lang.String">
+</parameter>
+</method>
 <method name="getDouble"
  return="double"
  abstract="false"
@@ -112949,6 +113374,36 @@
 <parameter name="value" type="java.lang.CharSequence">
 </parameter>
 </method>
+<method name="putCharSequenceArray"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="key" type="java.lang.String">
+</parameter>
+<parameter name="value" type="java.lang.CharSequence[]">
+</parameter>
+</method>
+<method name="putCharSequenceArrayList"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="key" type="java.lang.String">
+</parameter>
+<parameter name="value" type="java.util.ArrayList&lt;java.lang.CharSequence&gt;">
+</parameter>
+</method>
 <method name="putDouble"
  return="void"
  abstract="false"
@@ -119998,7 +120453,7 @@
  visibility="public"
 >
 <method name="disableUsbMassStorage"
- return="int"
+ return="void"
  abstract="false"
  native="false"
  synchronized="false"
@@ -120009,7 +120464,7 @@
 >
 </method>
 <method name="enableUsbMassStorage"
- return="int"
+ return="void"
  abstract="false"
  native="false"
  synchronized="false"
@@ -138245,6 +138700,17 @@
  visibility="public"
 >
 </field>
+<field name="EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.speech.extra.ONLY_RETURN_LANGUAGE_PREFERENCE&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="EXTRA_PARTIAL_RESULTS"
  type="java.lang.String"
  transient="false"
@@ -163448,7 +163914,7 @@
 <method name="println"
  return="int"
  abstract="false"
- native="true"
+ native="false"
  synchronized="false"
  static="true"
  final="false"
@@ -166348,7 +166814,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </method>
@@ -166374,6 +166840,17 @@
  visibility="public"
 >
 </method>
+<method name="getRotation"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getWidth"
  return="int"
  abstract="false"
@@ -189558,7 +190035,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </method>
@@ -189610,7 +190087,7 @@
  synchronized="false"
  static="true"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </method>
@@ -209109,6 +209586,17 @@
  visibility="public"
 >
 </method>
+<method name="isStripEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="onFocusChange"
  return="void"
  abstract="false"
@@ -209163,6 +209651,71 @@
 <parameter name="resId" type="int">
 </parameter>
 </method>
+<method name="setLeftStripDrawable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="drawable" type="android.graphics.drawable.Drawable">
+</parameter>
+</method>
+<method name="setLeftStripDrawable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="resId" type="int">
+</parameter>
+</method>
+<method name="setRightStripDrawable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="drawable" type="android.graphics.drawable.Drawable">
+</parameter>
+</method>
+<method name="setRightStripDrawable"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="resId" type="int">
+</parameter>
+</method>
+<method name="setStripEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stripEnabled" type="boolean">
+</parameter>
+</method>
 </class>
 <class name="TableLayout"
  extends="android.widget.LinearLayout"
diff --git a/calendar/Android.mk b/calendar/Android.mk
deleted file mode 100644
index fd20dfa..0000000
--- a/calendar/Android.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2009 Google, Inc.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := calendar
-LOCAL_SRC_FILES := \
-	../core/java/android/provider/Calendar.java \
-	../core/java/android/pim/EventRecurrence.java \
-	../core/java/android/pim/ICalendar.java \
-	../core/java/android/pim/RecurrenceSet.java \
-	../core/java/android/pim/ContactsAsyncHelper.java \
-	../core/java/android/pim/DateException.java
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# Include this library in the build server's output directory
-$(call dist-for-goals, droid, $(LOCAL_BUILT_MODULE):calendar.jar)
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index b6c9de4..5d6970a 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -35,6 +35,7 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.PrintStream;
 import java.net.URISyntaxException;
 import java.util.Iterator;
 import java.util.Set;
@@ -47,6 +48,7 @@
     private String mCurArgData;
 
     private boolean mDebugOption = false;
+    private boolean mWaitOption = false;
 
     // These are magic strings understood by the Eclipse plugin.
     private static final String FATAL_ERROR_CODE = "Error type 1";
@@ -106,6 +108,7 @@
         boolean hasIntentInfo = false;
 
         mDebugOption = false;
+        mWaitOption = false;
         Uri data = null;
         String type = null;
 
@@ -153,6 +156,8 @@
                 intent.setFlags(Integer.decode(str).intValue());
             } else if (opt.equals("-D")) {
                 mDebugOption = true;
+            } else if (opt.equals("-W")) {
+                mWaitOption = true;
             } else {
                 System.err.println("Error: Unknown option: " + opt);
                 showUsage();
@@ -199,58 +204,90 @@
         System.out.println("Starting: " + intent);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         // XXX should do something to determine the MIME type.
-        int res = mAm.startActivity(null, intent, intent.getType(),
-                null, 0, null, null, 0, false, mDebugOption);
+        IActivityManager.WaitResult result = null;
+        int res;
+        if (mWaitOption) {
+            result = mAm.startActivityAndWait(null, intent, intent.getType(),
+                        null, 0, null, null, 0, false, mDebugOption);
+            res = result.result;
+        } else {
+            res = mAm.startActivity(null, intent, intent.getType(),
+                    null, 0, null, null, 0, false, mDebugOption);
+        }
+        PrintStream out = mWaitOption ? System.out : System.err;
+        boolean launched = false;
         switch (res) {
             case IActivityManager.START_SUCCESS:
+                launched = true;
                 break;
             case IActivityManager.START_SWITCHES_CANCELED:
-                System.err.println(
+                launched = true;
+                out.println(
                         "Warning: Activity not started because the "
                         + " current activity is being kept for the user.");
                 break;
             case IActivityManager.START_DELIVERED_TO_TOP:
-                System.err.println(
+                launched = true;
+                out.println(
                         "Warning: Activity not started, intent has "
                         + "been delivered to currently running "
                         + "top-most instance.");
                 break;
             case IActivityManager.START_RETURN_INTENT_TO_CALLER:
-                System.err.println(
+                launched = true;
+                out.println(
                         "Warning: Activity not started because intent "
                         + "should be handled by the caller");
                 break;
             case IActivityManager.START_TASK_TO_FRONT:
-                System.err.println(
+                launched = true;
+                out.println(
                         "Warning: Activity not started, its current "
                         + "task has been brought to the front");
                 break;
             case IActivityManager.START_INTENT_NOT_RESOLVED:
-                System.err.println(
+                out.println(
                         "Error: Activity not started, unable to "
                         + "resolve " + intent.toString());
                 break;
             case IActivityManager.START_CLASS_NOT_FOUND:
-                System.err.println(NO_CLASS_ERROR_CODE);
-                System.err.println("Error: Activity class " +
+                out.println(NO_CLASS_ERROR_CODE);
+                out.println("Error: Activity class " +
                         intent.getComponent().toShortString()
                         + " does not exist.");
                 break;
             case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:
-                System.err.println(
+                out.println(
                         "Error: Activity not started, you requested to "
                         + "both forward and receive its result");
                 break;
             case IActivityManager.START_PERMISSION_DENIED:
-                System.err.println(
+                out.println(
                         "Error: Activity not started, you do not "
                         + "have permission to access it.");
                 break;
             default:
-                System.err.println(
+                out.println(
                         "Error: Activity not started, unknown error code " + res);
                 break;
         }
+        if (mWaitOption && launched) {
+            if (result == null) {
+                result = new IActivityManager.WaitResult();
+                result.who = intent.getComponent();
+            }
+            System.out.println("Status: " + (result.timeout ? "timeout" : "ok"));
+            if (result.who != null) {
+                System.out.println("Activity: " + result.who.flattenToShortString());
+            }
+            if (result.thisTime >= 0) {
+                System.out.println("ThisTime: " + result.thisTime);
+            }
+            if (result.totalTime >= 0) {
+                System.out.println("TotalTime: " + result.totalTime);
+            }
+            System.out.println("Complete");
+        }
     }
 
     private void sendBroadcast() throws Exception {
@@ -504,8 +541,9 @@
         System.err.println(
                 "usage: am [subcommand] [options]\n" +
                 "\n" +
-                "    start an Activity: am start [-D] <INTENT>\n" +
+                "    start an Activity: am start [-D] [-W] <INTENT>\n" +
                 "        -D: enable debugging\n" +
+                "        -W: wait for launch to complete\n" +
                 "\n" +
                 "    start a Service: am startservice <INTENT>\n" +
                 "\n" +
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
index acfbb07..7e9fd61 100644
--- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
+++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java
@@ -289,17 +289,66 @@
                 this.notify();
             }
         }
+
+        public void waitForCompletion() {
+            // The restoreFinished() callback will throw the 'done' flag; we
+            // just sit and wait on that notification.
+            synchronized (this) {
+                while (!this.done) {
+                    try {
+                        this.wait();
+                    } catch (InterruptedException ex) {
+                    }
+                }
+            }
+        }
     }
 
     private void doRestore() {
-        long token;
-        try {
-            token = Long.parseLong(nextArg(), 16);
-        } catch (NumberFormatException e) {
-            showUsage();
-            return;
+        String arg = nextArg();
+        if (arg.indexOf('.') >= 0) {
+            // it's a package name
+            doRestorePackage(arg);
+        } else {
+            try {
+                long token = Long.parseLong(nextArg(), 16);
+                doRestoreAll(token);
+            } catch (NumberFormatException e) {
+                showUsage();
+                return;
+            }
         }
 
+        System.out.println("done");
+    }
+
+    private void doRestorePackage(String pkg) {
+        try {
+            String curTransport = mBmgr.getCurrentTransport();
+            mRestore = mBmgr.beginRestoreSession(curTransport);
+            if (mRestore == null) {
+                System.err.println(BMGR_NOT_RUNNING_ERR);
+                return;
+            }
+
+            RestoreObserver observer = new RestoreObserver();
+            int err = mRestore.restorePackage(pkg, observer);
+            if (err == 0) {
+                // Off and running -- wait for the restore to complete
+                observer.waitForCompletion();
+            } else {
+                System.err.println("Unable to restore package " + pkg);
+            }
+
+            // And finally shut down the session
+            mRestore.endRestoreSession();
+        } catch (RemoteException e) {
+            System.err.println(e.toString());
+            System.err.println(BMGR_NOT_RUNNING_ERR);
+        }
+    }
+
+    private void doRestoreAll(long token) {
         RestoreObserver observer = new RestoreObserver();
 
         try {
@@ -332,14 +381,7 @@
             // if we kicked off a restore successfully, we have to wait for it
             // to complete before we can shut down the restore session safely
             if (didRestore) {
-                synchronized (observer) {
-                    while (!observer.done) {
-                        try {
-                            observer.wait();
-                        } catch (InterruptedException ex) {
-                        }
-                    }
-                }
+                observer.waitForCompletion();
             }
 
             // once the restore has finished, close down the session and we're done
@@ -348,8 +390,6 @@
             System.err.println(e.toString());
             System.err.println(BMGR_NOT_RUNNING_ERR);
         }
-
-        System.out.println("done");
     }
 
     private String nextArg() {
@@ -370,6 +410,7 @@
         System.err.println("       bmgr list sets");
         System.err.println("       bmgr transport WHICH");
         System.err.println("       bmgr restore TOKEN");
+        System.err.println("       bmgr restore PACKAGE");
         System.err.println("       bmgr run");
         System.err.println("       bmgr wipe PACKAGE");
         System.err.println("");
@@ -396,8 +437,14 @@
         System.err.println("The 'transport' command designates the named transport as the currently");
         System.err.println("active one.  This setting is persistent across reboots.");
         System.err.println("");
-        System.err.println("The 'restore' command initiates a restore operation, using the restore set");
-        System.err.println("from the current transport whose token matches the argument.");
+        System.err.println("The 'restore' command when given a restore token initiates a full-system");
+        System.err.println("restore operation from the currently active transport.  It will deliver");
+        System.err.println("the restore set designated by the TOKEN argument to each application");
+        System.err.println("that had contributed data to that restore set.");
+        System.err.println("");
+        System.err.println("The 'restore' command when given a package name intiates a restore of");
+        System.err.println("just that one package according to the restore set selection algorithm");
+        System.err.println("used by the RestoreSession.restorePackage() method.");
         System.err.println("");
         System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
         System.err.println("immediately, without the usual waiting period for batching together");
diff --git a/common/tests/Android.mk b/common/tests/Android.mk
index 0f2c3e4..74255521 100644
--- a/common/tests/Android.mk
+++ b/common/tests/Android.mk
@@ -23,4 +23,6 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_STATIC_JAVA_LIBRARIES := android-common
 
+LOCAL_PROGUARD_ENABLED := disabled
+
 include $(BUILD_PACKAGE)
diff --git a/core/java/android/accounts/AuthenticatorDescription.java b/core/java/android/accounts/AuthenticatorDescription.java
index 91c94e6..eddf7c1 100644
--- a/core/java/android/accounts/AuthenticatorDescription.java
+++ b/core/java/android/accounts/AuthenticatorDescription.java
@@ -91,7 +91,7 @@
         return "AuthenticatorDescription {type=" + type + "}";
     }
 
-    /** @inhericDoc */
+    /** @inheritDoc */
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeString(type);
         dest.writeString(packageName);
diff --git a/core/java/android/accounts/ChooseAccountActivity.java b/core/java/android/accounts/ChooseAccountActivity.java
index 4a0018e..0bbb6fc 100644
--- a/core/java/android/accounts/ChooseAccountActivity.java
+++ b/core/java/android/accounts/ChooseAccountActivity.java
@@ -36,14 +36,15 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        if (savedInstanceState == null) {
-            mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS);
-            mAccountManagerResponse =
-                    getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE);
-        } else {
-            mAccounts = savedInstanceState.getParcelableArray(AccountManager.KEY_ACCOUNTS);
-            mAccountManagerResponse =
-                    savedInstanceState.getParcelable(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE);
+        mAccounts = getIntent().getParcelableArrayExtra(AccountManager.KEY_ACCOUNTS);
+        mAccountManagerResponse =
+                getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_MANAGER_RESPONSE);
+
+        // KEY_ACCOUNTS is a required parameter
+        if (mAccounts == null) {
+            setResult(RESULT_CANCELED);
+            finish();
+            return;
         }
 
         String[] mAccountNames = new String[mAccounts.length];
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 2e39c10..6849fd76 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -146,6 +146,28 @@
             return true;
         }
 
+        case START_ACTIVITY_AND_WAIT_TRANSACTION:
+        {
+            data.enforceInterface(IActivityManager.descriptor);
+            IBinder b = data.readStrongBinder();
+            IApplicationThread app = ApplicationThreadNative.asInterface(b);
+            Intent intent = Intent.CREATOR.createFromParcel(data);
+            String resolvedType = data.readString();
+            Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
+            int grantedMode = data.readInt();
+            IBinder resultTo = data.readStrongBinder();
+            String resultWho = data.readString();    
+            int requestCode = data.readInt();
+            boolean onlyIfNeeded = data.readInt() != 0;
+            boolean debug = data.readInt() != 0;
+            WaitResult result = startActivityAndWait(app, intent, resolvedType,
+                    grantedUriPermissions, grantedMode, resultTo, resultWho,
+                    requestCode, onlyIfNeeded, debug);
+            reply.writeNoException();
+            result.writeToParcel(reply, 0);
+            return true;
+        }
+
         case START_ACTIVITY_INTENT_SENDER_TRANSACTION:
         {
             data.enforceInterface(IActivityManager.descriptor);
@@ -1238,6 +1260,31 @@
         data.recycle();
         return result;
     }
+    public WaitResult startActivityAndWait(IApplicationThread caller, Intent intent,
+            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
+            IBinder resultTo, String resultWho,
+            int requestCode, boolean onlyIfNeeded,
+            boolean debug) throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
+        intent.writeToParcel(data, 0);
+        data.writeString(resolvedType);
+        data.writeTypedArray(grantedUriPermissions, 0);
+        data.writeInt(grantedMode);
+        data.writeStrongBinder(resultTo);
+        data.writeString(resultWho);
+        data.writeInt(requestCode);
+        data.writeInt(onlyIfNeeded ? 1 : 0);
+        data.writeInt(debug ? 1 : 0);
+        mRemote.transact(START_ACTIVITY_AND_WAIT_TRANSACTION, data, reply, 0);
+        reply.readException();
+        WaitResult result = WaitResult.CREATOR.createFromParcel(reply);
+        reply.recycle();
+        data.recycle();
+        return result;
+    }
     public int startActivityIntentSender(IApplicationThread caller,
             IntentSender intent, Intent fillInIntent, String resolvedType,
             IBinder resultTo, String resultWho, int requestCode,
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index fe81056..f0cef98 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -119,9 +119,10 @@
     public AnrInfo anrInfo;
 
     /**
-     * Text containing battery usage data.
+     * If this report is of type {@link #TYPE_BATTERY}, contains an instance
+     * of BatteryInfo; otherwise null.
      */
-    public String batteryText;
+    public BatteryInfo batteryInfo;
     
     /**
      * Create an uninitialized instance of {@link ApplicationErrorReport}.
@@ -215,7 +216,7 @@
                 anrInfo.writeToParcel(dest, flags);
                 break;
             case TYPE_BATTERY:
-                dest.writeString(batteryText);
+                batteryInfo.writeToParcel(dest, flags);
                 break;
         }
     }
@@ -232,15 +233,15 @@
             case TYPE_CRASH:
                 crashInfo = new CrashInfo(in);
                 anrInfo = null;
-                batteryText = null;
+                batteryInfo = null;
                 break;
             case TYPE_ANR:
                 anrInfo = new AnrInfo(in);
                 crashInfo = null;
-                batteryText = null;
+                batteryInfo = null;
                 break;
             case TYPE_BATTERY:
-                batteryText = in.readString();
+                batteryInfo = new BatteryInfo(in);
                 anrInfo = null;
                 crashInfo = null;
                 break;
@@ -411,6 +412,68 @@
         }
     }
 
+    /**
+     * Describes a battery usage report.
+     */
+    public static class BatteryInfo {
+        /**
+         * Percentage of the battery that was used up by the process.
+         */
+        public int usagePercent;
+
+        /**
+         * Duration in microseconds over which the process used the above
+         * percentage of battery.
+         */
+        public long durationMicros;
+
+        /**
+         * Dump of various info impacting battery use.
+         */
+        public String usageDetails;
+
+        /**
+         * Checkin details.
+         */
+        public String checkinDetails;
+
+        /**
+         * Create an uninitialized instance of BatteryInfo.
+         */
+        public BatteryInfo() {
+        }
+
+        /**
+         * Create an instance of BatteryInfo initialized from a Parcel.
+         */
+        public BatteryInfo(Parcel in) {
+            usagePercent = in.readInt();
+            durationMicros = in.readLong();
+            usageDetails = in.readString();
+            checkinDetails = in.readString();
+        }
+
+        /**
+         * Save a BatteryInfo instance to a parcel.
+         */
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(usagePercent);
+            dest.writeLong(durationMicros);
+            dest.writeString(usageDetails);
+            dest.writeString(checkinDetails);
+        }
+
+        /**
+         * Dump a BatteryInfo instance to a Printer.
+         */
+        public void dump(Printer pw, String prefix) {
+            pw.println(prefix + "usagePercent: " + usagePercent);
+            pw.println(prefix + "durationMicros: " + durationMicros);
+            pw.println(prefix + "usageDetails: " + usageDetails);
+            pw.println(prefix + "checkinDetails: " + checkinDetails);
+        }
+    }
+
     public static final Parcelable.Creator<ApplicationErrorReport> CREATOR
             = new Parcelable.Creator<ApplicationErrorReport>() {
         public ApplicationErrorReport createFromParcel(Parcel source) {
@@ -445,7 +508,7 @@
                 anrInfo.dump(pw, prefix);
                 break;
             case TYPE_BATTERY:
-                pw.println(batteryText);
+                batteryInfo.dump(pw, prefix);
                 break;
         }
     }
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 8335bf3..4464ab9 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -99,6 +99,7 @@
 import android.view.inputmethod.InputMethodManager;
 import android.accounts.AccountManager;
 import android.accounts.IAccountManager;
+import android.app.admin.DevicePolicyManager;
 
 import com.android.internal.os.IDropBoxManagerService;
 
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 0ed5eb8..981c237 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -27,7 +27,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Config;
 import android.util.Log;
 import android.view.ContextMenu;
 import android.view.ContextThemeWrapper;
@@ -72,8 +71,6 @@
  */
 public class Dialog implements DialogInterface, Window.Callback,
         KeyEvent.Callback, OnCreateContextMenuListener {
-    private static final String LOG_TAG = "Dialog";
-
     private Activity mOwnerActivity;
     
     final Context mContext;
@@ -104,6 +101,12 @@
     private final Thread mUiThread;
     private final Handler mHandler = new Handler();
 
+    private static final int DISMISS = 0x43;
+    private static final int CANCEL = 0x44;
+    private static final int SHOW = 0x45;
+
+    private Handler mListenersHandler;
+
     private final Runnable mDismissAction = new Runnable() {
         public void run() {
             dismissDialog();
@@ -213,8 +216,6 @@
      */
     public void show() {
         if (mShowing) {
-            if (Config.LOGV) Log.v(LOG_TAG,
-                    "[Dialog] start: already showing, ignore");
             if (mDecor != null) {
                 mDecor.setVisibility(View.VISIBLE);
             }
@@ -266,14 +267,7 @@
     }
 
     private void dismissDialog() {
-        if (mDecor == null) {
-            if (Config.LOGV) Log.v(LOG_TAG,
-                    "[Dialog] dismiss: already dismissed, ignore");
-            return;
-        }
-        if (!mShowing) {
-            if (Config.LOGV) Log.v(LOG_TAG,
-                    "[Dialog] dismiss: not showing, ignore");
+        if (mDecor == null || !mShowing || mDecor.getWindowToken() == null) {
             return;
         }
 
@@ -1034,12 +1028,6 @@
         mOnKeyListener = onKeyListener;
     }
 
-    private static final int DISMISS = 0x43;
-    private static final int CANCEL = 0x44;
-    private static final int SHOW = 0x45;
-
-    private Handler mListenersHandler;
-
     private static final class ListenersHandler extends Handler {
         private WeakReference<DialogInterface> mDialog;
 
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 86f28bf..3913ed5 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -84,6 +84,10 @@
             Intent intent, String resolvedType, Uri[] grantedUriPermissions,
             int grantedMode, IBinder resultTo, String resultWho, int requestCode,
             boolean onlyIfNeeded, boolean debug) throws RemoteException;
+    public WaitResult startActivityAndWait(IApplicationThread caller,
+            Intent intent, String resolvedType, Uri[] grantedUriPermissions,
+            int grantedMode, IBinder resultTo, String resultWho, int requestCode,
+            boolean onlyIfNeeded, boolean debug) throws RemoteException;
     public int startActivityIntentSender(IApplicationThread caller,
             IntentSender intent, Intent fillInIntent, String resolvedType,
             IBinder resultTo, String resultWho, int requestCode,
@@ -348,6 +352,49 @@
         }
     };
 
+    /** Information returned after waiting for an activity start. */
+    public static class WaitResult implements Parcelable {
+        public int result;
+        public boolean timeout;
+        public ComponentName who;
+        public long thisTime;
+        public long totalTime;
+
+        public WaitResult() {
+        }
+
+        public int describeContents() {
+            return 0;
+        }
+
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(result);
+            dest.writeInt(timeout ? 1 : 0);
+            ComponentName.writeToParcel(who, dest);
+            dest.writeLong(thisTime);
+            dest.writeLong(totalTime);
+        }
+
+        public static final Parcelable.Creator<WaitResult> CREATOR
+                = new Parcelable.Creator<WaitResult>() {
+            public WaitResult createFromParcel(Parcel source) {
+                return new WaitResult(source);
+            }
+
+            public WaitResult[] newArray(int size) {
+                return new WaitResult[size];
+            }
+        };
+
+        private WaitResult(Parcel source) {
+            result = source.readInt();
+            timeout = source.readInt() != 0;
+            who = ComponentName.readFromParcel(source);
+            thisTime = source.readLong();
+            totalTime = source.readLong();
+        }
+    };
+
     String descriptor = "android.app.IActivityManager";
 
     // Please keep these transaction codes the same -- they are also
@@ -453,4 +500,5 @@
     int HANDLE_APPLICATION_WTF_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+101;
     int KILL_BACKGROUND_PROCESSES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+102;
     int IS_USER_A_MONKEY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+103;
+    int START_ACTIVITY_AND_WAIT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+104;
 }
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index b54e53d..67f9629 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1355,6 +1355,16 @@
      *  a much smaller appearance.
      */
     public final static String SUGGEST_COLUMN_TEXT_2 = "suggest_text_2";
+
+    /**
+     * Column name for suggestions cursor.  <i>Optional.</i> This is a URL that will be shown
+     * as the second line of text instead of {@link #SUGGEST_COLUMN_TEXT_2}. This is a separate
+     * column so that the search UI knows to display the text as a URL, e.g. by using a different
+     * color. If this column is absent, or has the value {@code null},
+     * {@link #SUGGEST_COLUMN_TEXT_2} will be used instead.
+     */
+    public final static String SUGGEST_COLUMN_TEXT_2_URL = "suggest_text_2_url";
+
     /**
      * Column name for suggestions cursor.  <i>Optional.</i>  If your cursor includes this column,
      *  then all suggestions will be provided in a format that includes space for two small icons,
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 57795d1..07e9793 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -16,6 +16,8 @@
 
 package android.app;
 
+import com.android.internal.R;
+
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -23,16 +25,20 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.StateListDrawable;
 import android.net.Uri;
-import android.text.Html;
+import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.TextUtils;
+import android.text.style.TextAppearanceSpan;
 import android.util.Log;
 import android.util.SparseArray;
+import android.util.TypedValue;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Filter;
@@ -64,10 +70,13 @@
     private SparseArray<Drawable.ConstantState> mBackgroundsCache;
     private boolean mClosed = false;
 
+    // URL color
+    private ColorStateList mUrlColor;
+
     // Cached column indexes, updated when the cursor changes.
-    private int mFormatCol;
     private int mText1Col;
     private int mText2Col;
+    private int mText2UrlCol;
     private int mIconName1Col;
     private int mIconName2Col;
     private int mBackgroundColorCol;
@@ -188,9 +197,9 @@
             super.changeCursor(c);
 
             if (c != null) {
-                mFormatCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FORMAT);
                 mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1);
                 mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2);
+                mText2UrlCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL);
                 mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1);
                 mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2);
                 mBackgroundColorCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_BACKGROUND_COLOR);
@@ -239,9 +248,20 @@
         Drawable background = getItemBackground(backgroundColor);
         view.setBackgroundDrawable(background);
 
-        final boolean isHtml = mFormatCol > 0 && "html".equals(cursor.getString(mFormatCol));
-        setViewText(cursor, views.mText1, mText1Col, isHtml);
-        setViewText(cursor, views.mText2, mText2Col, isHtml);
+        if (views.mText1 != null) {
+            String text1 = getStringOrNull(cursor, mText1Col);
+            setViewText(views.mText1, text1);
+        }
+        if (views.mText2 != null) {
+            // First check TEXT_2_URL
+            CharSequence text2 = getStringOrNull(cursor, mText2UrlCol);
+            if (text2 != null) {
+                text2 = formatUrl(text2);
+            } else {
+                text2 = getStringOrNull(cursor, mText2Col);
+            }
+            setViewText(views.mText2, text2);
+        }
 
         if (views.mIcon1 != null) {
             setViewDrawable(views.mIcon1, getIcon1(cursor));
@@ -251,6 +271,21 @@
         }
     }
 
+    private CharSequence formatUrl(CharSequence url) {
+        if (mUrlColor == null) {
+            // Lazily get the URL color from the current theme.
+            TypedValue colorValue = new TypedValue();
+            mContext.getTheme().resolveAttribute(R.attr.textColorSearchUrl, colorValue, true);
+            mUrlColor = mContext.getResources().getColorStateList(colorValue.resourceId);
+        }
+
+        SpannableString text = new SpannableString(url);
+        text.setSpan(new TextAppearanceSpan(null, 0, 0, mUrlColor, null),
+                0, url.length(),
+                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return text;
+    }
+
     /**
      * Gets a drawable with no color when selected or pressed, and the given color when
      * neither selected nor pressed.
@@ -278,19 +313,7 @@
         }
     }
 
-    private void setViewText(Cursor cursor, TextView v, int textCol, boolean isHtml) {
-        if (v == null) {
-            return;
-        }
-        CharSequence text = null;
-        if (textCol >= 0) {
-            String str = cursor.getString(textCol);
-            if (isHtml && looksLikeHtml(str)) {
-                text = Html.fromHtml(str);
-            } else {
-                text = str;
-            }
-        }
+    private void setViewText(TextView v, CharSequence text) {
         // Set the text even if it's null, since we need to clear any previous text.
         v.setText(text);
 
@@ -301,15 +324,6 @@
         }
     }
 
-    private static boolean looksLikeHtml(String str) {
-        if (TextUtils.isEmpty(str)) return false;
-        for (int i = str.length() - 1; i >= 0; i--) {
-            char c = str.charAt(i);
-            if (c == '<' || c == '&') return true;
-        }
-        return false;
-    }
-
     private Drawable getIcon1(Cursor cursor) {
         if (mIconName1Col < 0) {
             return null;
@@ -617,6 +631,10 @@
      */
     public static String getColumnString(Cursor cursor, String columnName) {
         int col = cursor.getColumnIndex(columnName);
+        return getStringOrNull(cursor, col);
+    }
+
+    private static String getStringOrNull(Cursor cursor, int col) {
         if (col == NONE) {
             return null;
         }
@@ -629,5 +647,4 @@
             return null;
         }
     }
-
 }
diff --git a/core/java/android/app/DeviceAdminInfo.java b/core/java/android/app/admin/DeviceAdminInfo.java
similarity index 96%
rename from core/java/android/app/DeviceAdminInfo.java
rename to core/java/android/app/admin/DeviceAdminInfo.java
index 61e1bb339..c4de812 100644
--- a/core/java/android/app/DeviceAdminInfo.java
+++ b/core/java/android/app/admin/DeviceAdminInfo.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.app;
+package android.app.admin;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -150,6 +150,11 @@
     final ResolveInfo mReceiver;
     
     /**
+     * Whether this should be visible to the user.
+     */
+    boolean mVisible;
+    
+    /**
      * The policies this administrator needs access to.
      */
     int mUsesPolicies;
@@ -190,8 +195,11 @@
             }
             
             TypedArray sa = context.getResources().obtainAttributes(attrs,
-                    com.android.internal.R.styleable.Wallpaper);
+                    com.android.internal.R.styleable.DeviceAdmin);
 
+            mVisible = sa.getBoolean(
+                    com.android.internal.R.styleable.DeviceAdmin_visible, true);
+            
             sa.recycle();
             
             int outerDepth = parser.getDepth();
@@ -301,6 +309,14 @@
     }
     
     /**
+     * Returns whether this device admin would like to be visible to the
+     * user, even when it is not enabled.
+     */
+    public boolean isVisible() {
+        return mVisible;
+    }
+    
+    /**
      * Return true if the device admin has requested that it be able to use
      * the given policy control.  The possible policy identifier inputs are:
      * {@link #USES_POLICY_LIMIT_PASSWORD}, {@link #USES_POLICY_WATCH_LOGIN},
diff --git a/core/java/android/app/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java
similarity index 99%
rename from core/java/android/app/DeviceAdminReceiver.java
rename to core/java/android/app/admin/DeviceAdminReceiver.java
index 453e0bf..b4dd9e7 100644
--- a/core/java/android/app/DeviceAdminReceiver.java
+++ b/core/java/android/app/admin/DeviceAdminReceiver.java
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-package android.app;
+package android.app.admin;
 
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.app.Service;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
diff --git a/core/java/android/app/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
similarity index 97%
rename from core/java/android/app/DevicePolicyManager.java
rename to core/java/android/app/admin/DevicePolicyManager.java
index 0e8c1ab..2d9b415 100644
--- a/core/java/android/app/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
-package android.app;
+package android.app.admin;
 
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.app.admin.IDevicePolicyManager.Stub;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
@@ -56,7 +57,8 @@
                 ServiceManager.getService(Context.DEVICE_POLICY_SERVICE));
     }
 
-    /*package*/ static DevicePolicyManager create(Context context, Handler handler) {
+    /** @hide */
+    public static DevicePolicyManager create(Context context, Handler handler) {
         DevicePolicyManager me = new DevicePolicyManager(context, handler);
         return me.mService != null ? me : null;
     }
@@ -394,6 +396,12 @@
     }
     
     /**
+     * Flag for {@link #resetPassword}: don't allow other admins to change
+     * the password again until the user has entered it.
+     */
+    public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001;
+    
+    /**
      * Force a new device unlock password (the password needed to access the
      * entire device, not for individual accounts) on the user.  This takes
      * effect immediately.
@@ -411,13 +419,14 @@
      * this method; if it has not, a security exception will be thrown.
      * 
      * @param password The new password for the user.
+     * @param flags May be 0 or {@link #RESET_PASSWORD_REQUIRE_ENTRY}.
      * @return Returns true if the password was applied, or false if it is
      * not acceptable for the current constraints.
      */
-    public boolean resetPassword(String password) {
+    public boolean resetPassword(String password, int flags) {
         if (mService != null) {
             try {
-                return mService.resetPassword(password);
+                return mService.resetPassword(password, flags);
             } catch (RemoteException e) {
                 Log.w(TAG, "Failed talking with device policy service", e);
             }
diff --git a/core/java/android/app/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
similarity index 95%
rename from core/java/android/app/IDevicePolicyManager.aidl
rename to core/java/android/app/admin/IDevicePolicyManager.aidl
index b138720..6fc4dc5 100644
--- a/core/java/android/app/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -15,7 +15,7 @@
 ** limitations under the License.
 */
 
-package android.app;
+package android.app.admin;
 
 import android.content.ComponentName;
 import android.os.RemoteCallback;
@@ -37,7 +37,7 @@
     void setMaximumFailedPasswordsForWipe(in ComponentName admin, int num);
     int getMaximumFailedPasswordsForWipe(in ComponentName admin);
     
-    boolean resetPassword(String password);
+    boolean resetPassword(String password, int flags);
     
     void setMaximumTimeToLock(in ComponentName who, long timeMs);
     long getMaximumTimeToLock(in ComponentName who);
diff --git a/core/java/android/content/ActiveSyncInfo.java b/core/java/android/content/ActiveSyncInfo.java
index 209dffa..b0c90a1 100644
--- a/core/java/android/content/ActiveSyncInfo.java
+++ b/core/java/android/content/ActiveSyncInfo.java
@@ -20,13 +20,46 @@
 import android.os.Parcel;
 import android.os.Parcelable.Creator;
 
-/** @hide */
+/**
+ * Information about the sync operation that is currently underway.
+ */
 public class ActiveSyncInfo {
-    public final int authorityId;
-    public final Account account;
-    public final String authority;
-    public final long startTime;
-    
+    private final int authorityId;
+    private final Account account;
+    private final String authority;
+    private final long startTime;
+
+    /**
+     * Get the {@link Account} that is currently being synced.
+     * @return the account
+     */
+    public Account getAccount() {
+        return new Account(account.name, account.type);
+    }
+
+    /** @hide */
+    public int getAuthorityId() {
+        return authorityId;
+    }
+
+    /**
+     * Get the authority of the provider that is currently being synced.
+     * @return the authority
+     */
+    public String getAuthority() {
+        return authority;
+    }
+
+    /**
+     * Get the start time of the current sync operation. This is represented in elapsed real time.
+     * See {@link android.os.SystemClock#elapsedRealtime()}.
+     * @return the start time in milliseconds since boot
+     */
+    public long getStartTime() {
+        return startTime;
+    }
+
+    /** @hide */
     ActiveSyncInfo(int authorityId, Account account, String authority,
             long startTime) {
         this.authorityId = authorityId;
@@ -34,11 +67,13 @@
         this.authority = authority;
         this.startTime = startTime;
     }
-    
+
+    /** @hide */
     public int describeContents() {
         return 0;
     }
 
+    /** @hide */
     public void writeToParcel(Parcel parcel, int flags) {
         parcel.writeInt(authorityId);
         account.writeToParcel(parcel, 0);
@@ -46,13 +81,15 @@
         parcel.writeLong(startTime);
     }
 
+    /** @hide */
     ActiveSyncInfo(Parcel parcel) {
         authorityId = parcel.readInt();
         account = new Account(parcel);
         authority = parcel.readString();
         startTime = parcel.readLong();
     }
-    
+
+    /** @hide */
     public static final Creator<ActiveSyncInfo> CREATOR = new Creator<ActiveSyncInfo>() {
         public ActiveSyncInfo createFromParcel(Parcel in) {
             return new ActiveSyncInfo(in);
@@ -62,4 +99,4 @@
             return new ActiveSyncInfo[size];
         }
     };
-}
\ No newline at end of file
+}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 29f388a..1b0ef34 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -156,11 +156,8 @@
     /** @hide */
     public static final int SYNC_ERROR_INTERNAL = 8;
 
-    /** @hide */
     public static final int SYNC_OBSERVER_TYPE_SETTINGS = 1<<0;
-    /** @hide */
     public static final int SYNC_OBSERVER_TYPE_PENDING = 1<<1;
-    /** @hide */
     public static final int SYNC_OBSERVER_TYPE_ACTIVE = 1<<2;
     /** @hide */
     public static final int SYNC_OBSERVER_TYPE_STATUS = 1<<3;
@@ -1183,7 +1180,6 @@
     /**
      * If a sync is active returns the information about it, otherwise returns false.
      * @return the ActiveSyncInfo for the currently active sync or null if one is not active.
-     * @hide
      */
     public static ActiveSyncInfo getActiveSync() {
         try {
@@ -1222,7 +1218,24 @@
         }
     }
 
+    /**
+     * Request notifications when the different aspects of the SyncManager change. The
+     * different items that can be requested are:
+     * <ul>
+     * <li> {@link #SYNC_OBSERVER_TYPE_PENDING}
+     * <li> {@link #SYNC_OBSERVER_TYPE_ACTIVE}
+     * <li> {@link #SYNC_OBSERVER_TYPE_SETTINGS}
+     * </ul>
+     * The caller can set one or more of the status types in the mask for any
+     * given listener registration.
+     * @param mask the status change types that will cause the callback to be invoked
+     * @param callback observer to be invoked when the status changes
+     * @return a handle that can be used to remove the listener at a later time
+     */
     public static Object addStatusChangeListener(int mask, final SyncStatusObserver callback) {
+        if (callback == null) {
+            throw new IllegalArgumentException("you passed in a null callback");
+        }
         try {
             ISyncStatusObserver.Stub observer = new ISyncStatusObserver.Stub() {
                 public void onStatusChanged(int which) throws RemoteException {
@@ -1236,7 +1249,14 @@
         }
     }
 
+    /**
+     * Remove a previously registered status change listener.
+     * @param handle the handle that was returned by {@link #addStatusChangeListener}
+     */
     public static void removeStatusChangeListener(Object handle) {
+        if (handle == null) {
+            throw new IllegalArgumentException("you passed in a null handle");
+        }
         try {
             getContentService().removeStatusChangeListener((ISyncStatusObserver.Stub) handle);
         } catch (RemoteException e) {
diff --git a/core/java/android/content/ContentService.java b/core/java/android/content/ContentService.java
index e0dfab5..0477d6d 100644
--- a/core/java/android/content/ContentService.java
+++ b/core/java/android/content/ContentService.java
@@ -32,7 +32,6 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 /**
@@ -104,7 +103,7 @@
             throw new IllegalArgumentException("You must pass a valid uri and observer");
         }
         synchronized (mRootNode) {
-            mRootNode.addObserver(uri, observer, notifyForDescendents);
+            mRootNode.addObserverLocked(uri, observer, notifyForDescendents, mRootNode);
             if (Config.LOGV) Log.v(TAG, "Registered observer " + observer + " at " + uri +
                     " with notifyForDescendents " + notifyForDescendents);
         }
@@ -115,7 +114,7 @@
             throw new IllegalArgumentException("You must pass a valid observer");
         }
         synchronized (mRootNode) {
-            mRootNode.removeObserver(observer);
+            mRootNode.removeObserverLocked(observer);
             if (Config.LOGV) Log.v(TAG, "Unregistered observer " + observer);
         }
     }
@@ -132,7 +131,7 @@
         try {
             ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
             synchronized (mRootNode) {
-                mRootNode.collectObservers(uri, 0, observer, observerWantsSelfNotifications,
+                mRootNode.collectObserversLocked(uri, 0, observer, observerWantsSelfNotifications,
                         calls);
             }
             final int numCalls = calls.size();
@@ -437,7 +436,7 @@
         long identityToken = clearCallingIdentity();
         try {
             SyncManager syncManager = getSyncManager();
-            if (syncManager != null) {
+            if (syncManager != null && callback != null) {
                 syncManager.getSyncStorageEngine().addStatusChangeListener(mask, callback);
             }
         } finally {
@@ -449,7 +448,7 @@
         long identityToken = clearCallingIdentity();
         try {
             SyncManager syncManager = getSyncManager();
-            if (syncManager != null) {
+            if (syncManager != null && callback != null) {
                 syncManager.getSyncStorageEngine().removeStatusChangeListener(callback);
             }
         } finally {
@@ -470,10 +469,12 @@
      */
     public static final class ObserverNode {
         private class ObserverEntry implements IBinder.DeathRecipient {
-            public IContentObserver observer;
-            public boolean notifyForDescendents;
+            public final IContentObserver observer;
+            public final boolean notifyForDescendents;
+            private final Object observersLock;
 
-            public ObserverEntry(IContentObserver o, boolean n) {
+            public ObserverEntry(IContentObserver o, boolean n, Object observersLock) {
+                this.observersLock = observersLock;
                 observer = o;
                 notifyForDescendents = n;
                 try {
@@ -484,7 +485,9 @@
             }
 
             public void binderDied() {
-                removeObserver(observer);
+                synchronized (observersLock) {
+                    removeObserverLocked(observer);
+                }
             }
         }
 
@@ -519,16 +522,16 @@
             return uri.getPathSegments().size() + 1;
         }
 
-        public void addObserver(Uri uri, IContentObserver observer, boolean notifyForDescendents) {
-            addObserver(uri, 0, observer, notifyForDescendents);
+        public void addObserverLocked(Uri uri, IContentObserver observer,
+                boolean notifyForDescendents, Object observersLock) {
+            addObserverLocked(uri, 0, observer, notifyForDescendents, observersLock);
         }
 
-        private void addObserver(Uri uri, int index, IContentObserver observer,
-                boolean notifyForDescendents) {
-
+        private void addObserverLocked(Uri uri, int index, IContentObserver observer,
+                boolean notifyForDescendents, Object observersLock) {
             // If this is the leaf node add the observer
             if (index == countUriSegments(uri)) {
-                mObservers.add(new ObserverEntry(observer, notifyForDescendents));
+                mObservers.add(new ObserverEntry(observer, notifyForDescendents, observersLock));
                 return;
             }
 
@@ -538,7 +541,7 @@
             for (int i = 0; i < N; i++) {
                 ObserverNode node = mChildren.get(i);
                 if (node.mName.equals(segment)) {
-                    node.addObserver(uri, index + 1, observer, notifyForDescendents);
+                    node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, observersLock);
                     return;
                 }
             }
@@ -546,13 +549,13 @@
             // No child found, create one
             ObserverNode node = new ObserverNode(segment);
             mChildren.add(node);
-            node.addObserver(uri, index + 1, observer, notifyForDescendents);
+            node.addObserverLocked(uri, index + 1, observer, notifyForDescendents, observersLock);
         }
 
-        public boolean removeObserver(IContentObserver observer) {
+        public boolean removeObserverLocked(IContentObserver observer) {
             int size = mChildren.size();
             for (int i = 0; i < size; i++) {
-                boolean empty = mChildren.get(i).removeObserver(observer);
+                boolean empty = mChildren.get(i).removeObserverLocked(observer);
                 if (empty) {
                     mChildren.remove(i);
                     i--;
@@ -578,10 +581,8 @@
             return false;
         }
 
-        private void collectMyObservers(Uri uri,
-                boolean leaf, IContentObserver observer, boolean selfNotify,
-                ArrayList<ObserverCall> calls)
-        {
+        private void collectMyObserversLocked(boolean leaf, IContentObserver observer,
+                boolean selfNotify, ArrayList<ObserverCall> calls) {
             int N = mObservers.size();
             IBinder observerBinder = observer == null ? null : observer.asBinder();
             for (int i = 0; i < N; i++) {
@@ -600,17 +601,17 @@
             }
         }
 
-        public void collectObservers(Uri uri, int index, IContentObserver observer,
+        public void collectObserversLocked(Uri uri, int index, IContentObserver observer,
                 boolean selfNotify, ArrayList<ObserverCall> calls) {
             String segment = null;
             int segmentCount = countUriSegments(uri);
             if (index >= segmentCount) {
                 // This is the leaf node, notify all observers
-                collectMyObservers(uri, true, observer, selfNotify, calls);
+                collectMyObserversLocked(true, observer, selfNotify, calls);
             } else if (index < segmentCount){
                 segment = getUriSegment(uri, index);
                 // Notify any observers at this level who are interested in descendents
-                collectMyObservers(uri, false, observer, selfNotify, calls);
+                collectMyObserversLocked(false, observer, selfNotify, calls);
             }
 
             int N = mChildren.size();
@@ -618,7 +619,7 @@
                 ObserverNode node = mChildren.get(i);
                 if (segment == null || node.mName.equals(segment)) {
                     // We found the child,
-                    node.collectObservers(uri, index + 1, observer, selfNotify, calls);
+                    node.collectObserversLocked(uri, index + 1, observer, selfNotify, calls);
                     if (segment != null) {
                         break;
                     }
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 897d702..8d136f1 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1507,7 +1507,7 @@
 
     /**
      * Use with {@link #getSystemService} to retrieve a 
-     * {@link android.app.DevicePolicyManager} for working with global
+     * {@link android.app.admin.DevicePolicyManager} for working with global
      * device policy management.
      *
      * @see #getSystemService
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index fb3f646..90e8c14 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3481,6 +3481,20 @@
      * @param name The name of the desired item.
      *
      * @return the value of an item that previously added with putExtra()
+     * or null if no ArrayList<CharSequence> value was found.
+     *
+     * @see #putCharSequenceArrayListExtra(String, ArrayList)
+     */
+    public ArrayList<CharSequence> getCharSequenceArrayListExtra(String name) {
+        return mExtras == null ? null : mExtras.getCharSequenceArrayList(name);
+    }
+
+    /**
+     * Retrieve extended data from the intent.
+     *
+     * @param name The name of the desired item.
+     *
+     * @return the value of an item that previously added with putExtra()
      * or null if no boolean array value was found.
      *
      * @see #putExtra(String, boolean[])
@@ -3607,6 +3621,20 @@
      * @param name The name of the desired item.
      *
      * @return the value of an item that previously added with putExtra()
+     * or null if no CharSequence array value was found.
+     *
+     * @see #putExtra(String, CharSequence[])
+     */
+    public CharSequence[] getCharSequenceArrayExtra(String name) {
+        return mExtras == null ? null : mExtras.getCharSequenceArray(name);
+    }
+
+    /**
+     * Retrieve extended data from the intent.
+     *
+     * @param name The name of the desired item.
+     *
+     * @return the value of an item that previously added with putExtra()
      * or null if no Bundle value was found.
      *
      * @see #putExtra(String, Bundle)
@@ -4309,6 +4337,29 @@
      * like "com.android.contacts.ShowAll".
      *
      * @param name The name of the extra data, with package prefix.
+     * @param value The ArrayList<CharSequence> data value.
+     *
+     * @return Returns the same Intent object, for chaining multiple calls
+     * into a single statement.
+     *
+     * @see #putExtras
+     * @see #removeExtra
+     * @see #getCharSequenceArrayListExtra(String)
+     */
+    public Intent putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value) {
+        if (mExtras == null) {
+            mExtras = new Bundle();
+        }
+        mExtras.putCharSequenceArrayList(name, value);
+        return this;
+    }
+
+    /**
+     * Add extended data to the intent.  The name must include a package
+     * prefix, for example the app com.android.contacts would use names
+     * like "com.android.contacts.ShowAll".
+     *
+     * @param name The name of the extra data, with package prefix.
      * @param value The Serializable data value.
      *
      * @return Returns the same Intent object, for chaining multiple calls
@@ -4539,6 +4590,29 @@
      * like "com.android.contacts.ShowAll".
      *
      * @param name The name of the extra data, with package prefix.
+     * @param value The CharSequence array data value.
+     *
+     * @return Returns the same Intent object, for chaining multiple calls
+     * into a single statement.
+     *
+     * @see #putExtras
+     * @see #removeExtra
+     * @see #getCharSequenceArrayExtra(String)
+     */
+    public Intent putExtra(String name, CharSequence[] value) {
+        if (mExtras == null) {
+            mExtras = new Bundle();
+        }
+        mExtras.putCharSequenceArray(name, value);
+        return this;
+    }
+
+    /**
+     * Add extended data to the intent.  The name must include a package
+     * prefix, for example the app com.android.contacts would use names
+     * like "com.android.contacts.ShowAll".
+     *
+     * @param name The name of the extra data, with package prefix.
      * @param value The Bundle data value.
      *
      * @return Returns the same Intent object, for chaining multiple calls
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java
index 317e5a9..211a2ae 100644
--- a/core/java/android/content/SyncManager.java
+++ b/core/java/android/content/SyncManager.java
@@ -819,7 +819,7 @@
             }
             scheduleSyncOperation(new SyncOperation(operation.account, operation.syncSource,
                     operation.authority, operation.extras,
-                    DELAY_RETRY_SYNC_IN_PROGRESS_IN_SECONDS));
+                    DELAY_RETRY_SYNC_IN_PROGRESS_IN_SECONDS * 1000));
         } else if (syncResult.hasSoftError()) {
             if (isLoggable) {
                 Log.d(TAG, "retrying sync operation because it encountered a soft error: "
@@ -982,8 +982,8 @@
         ActiveSyncInfo active = mSyncStorageEngine.getActiveSync();
         if (active != null) {
             SyncStorageEngine.AuthorityInfo authority
-                    = mSyncStorageEngine.getAuthority(active.authorityId);
-            final long durationInSeconds = (now - active.startTime) / 1000;
+                    = mSyncStorageEngine.getAuthority(active.getAuthorityId());
+            final long durationInSeconds = (now - active.getStartTime()) / 1000;
             pw.print("Active sync: ");
                     pw.print(authority != null ? authority.account : "<no account>");
                     pw.print(" ");
diff --git a/core/java/android/content/SyncOperation.java b/core/java/android/content/SyncOperation.java
index 4599165..3b3f9c1 100644
--- a/core/java/android/content/SyncOperation.java
+++ b/core/java/android/content/SyncOperation.java
@@ -19,7 +19,7 @@
     public SyncStorageEngine.PendingOperation pendingOperation;
 
     public SyncOperation(Account account, int source, String authority, Bundle extras,
-            long delay) {
+            long delayInMs) {
         this.account = account;
         this.syncSource = source;
         this.authority = authority;
@@ -33,12 +33,12 @@
         removeFalseExtra(ContentResolver.SYNC_EXTRAS_EXPEDITED);
         removeFalseExtra(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS);
         final long now = SystemClock.elapsedRealtime();
-        if (delay < 0) {
+        if (delayInMs < 0) {
             this.expedited = true;
             this.earliestRunTime = now;
         } else {
             this.expedited = false;
-            this.earliestRunTime = now + delay;
+            this.earliestRunTime = now + delayInMs;
         }
         this.key = toKey();
     }
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index 5aad3af..240da72 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -664,7 +664,7 @@
             }
 
             if (mActiveSync != null) {
-                AuthorityInfo ainfo = getAuthority(mActiveSync.authorityId);
+                AuthorityInfo ainfo = getAuthority(mActiveSync.getAuthorityId());
                 if (ainfo != null && ainfo.account.equals(account)
                         && ainfo.authority.equals(authority)) {
                     return true;
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index a13f7f9..91b2be7 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -253,7 +253,6 @@
      * Bit in {@link #configChanges} that indicates that the activity
      * can itself handle the ui mode. Set from the
      * {@link android.R.attr#configChanges} attribute.
-     * @hide (UIMODE) Pending API council approval
      */
     public static final int CONFIG_UI_MODE = 0x0200;
     /**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 2edb430..dc8f386 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -530,19 +530,6 @@
     public static final int INSTALL_FAILED_INTERNAL_ERROR = -110;
 
     /**
-     * Indicates the state of installation. Used by PackageManager to
-     * figure out incomplete installations. Say a package is being installed
-     * (the state is set to PKG_INSTALL_INCOMPLETE) and remains so till
-     * the package installation is successful or unsuccesful lin which case
-     * the PackageManager will no longer maintain state information associated
-     * with the package. If some exception(like device freeze or battery being
-     * pulled out) occurs during installation of a package, the PackageManager
-     * needs this information to clean up the previously failed installation.
-     */
-    public static final int PKG_INSTALL_INCOMPLETE = 0;
-    public static final int PKG_INSTALL_COMPLETE = 1;
-
-    /**
      * Flag parameter for {@link #deletePackage} to indicate that you don't want to delete the
      * package's data directory.
      *
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 6490b65..a737283 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -162,20 +162,14 @@
      */
     public int orientation;
 
-    /** @hide (UIMODE) Pending API council approval */
     public static final int UI_MODE_TYPE_MASK = 0x0f;
-    /** @hide (UIMODE) Pending API council approval */
-    public static final int UI_MODE_TYPE_NORMAL = 0x00;
-    /** @hide (UIMODE) Pending API council approval */
-    public static final int UI_MODE_TYPE_CAR = 0x01;
+    public static final int UI_MODE_TYPE_UNDEFINED = 0x00;
+    public static final int UI_MODE_TYPE_NORMAL = 0x01;
+    public static final int UI_MODE_TYPE_CAR = 0x02;
 
-    /** @hide (UIMODE) Pending API council approval */
     public static final int UI_MODE_NIGHT_MASK = 0x30;
-    /** @hide (UIMODE) Pending API council approval */
     public static final int UI_MODE_NIGHT_UNDEFINED = 0x00;
-    /** @hide (UIMODE) Pending API council approval */
     public static final int UI_MODE_NIGHT_NO = 0x10;
-    /** @hide (UIMODE) Pending API council approval */
     public static final int UI_MODE_NIGHT_YES = 0x20;
 
     /**
@@ -187,8 +181,6 @@
      * <p>The {@link #UI_MODE_NIGHT_MASK} defines whether the screen
      * is in a special mode. They may be one of
      * {@link #UI_MODE_NIGHT_NO} or {@link #UI_MODE_NIGHT_YES}.
-     *
-     * @hide (UIMODE) Pending API council approval
      */
     public int uiMode;
 
diff --git a/core/java/android/database/CursorToBulkCursorAdaptor.java b/core/java/android/database/CursorToBulkCursorAdaptor.java
index 19ad946..748eb99 100644
--- a/core/java/android/database/CursorToBulkCursorAdaptor.java
+++ b/core/java/android/database/CursorToBulkCursorAdaptor.java
@@ -143,8 +143,7 @@
 
     public void close() {
         maybeUnregisterObserverProxy();
-        mCursor.deactivate();       
-        
+        mCursor.close();
     }
 
     public int requery(IContentObserver observer, CursorWindow window) {
diff --git a/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java b/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java
new file mode 100644
index 0000000..8ac4c0f
--- /dev/null
+++ b/core/java/android/database/sqlite/DatabaseObjectNotClosedException.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 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.database.sqlite;
+
+/**
+ * An exception that indicates that garbage-collector is finalizing a database object
+ * that is not explicitly closed
+ * @hide
+ */
+public class DatabaseObjectNotClosedException extends RuntimeException
+{
+    private static final String s = "Application did not close the cursor or database object " +
+            "that was opened here";
+
+    public DatabaseObjectNotClosedException()
+    {
+        super(s);
+    }
+}
diff --git a/core/java/android/database/sqlite/SQLiteCompiledSql.java b/core/java/android/database/sqlite/SQLiteCompiledSql.java
index a7a1d9a..4ccf6b0 100644
--- a/core/java/android/database/sqlite/SQLiteCompiledSql.java
+++ b/core/java/android/database/sqlite/SQLiteCompiledSql.java
@@ -28,6 +28,8 @@
  */
 /* package */ class SQLiteCompiledSql {
 
+    private static final String TAG = "SQLiteCompiledSql";
+
     /** The database this program is compiled against. */
     /* package */ SQLiteDatabase mDatabase;
 
@@ -44,11 +46,17 @@
      */
     /* package */ int nStatement = 0;
 
+    /** the following are for debugging purposes */
+    private String mSqlStmt = null;
+    private Throwable mStackTrace = null;
+
     /** when in cache and is in use, this member is set */
     private boolean mInUse = false;
 
     /* package */ SQLiteCompiledSql(SQLiteDatabase db, String sql) {
         mDatabase = db;
+        mSqlStmt = sql;
+        mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
         this.nHandle = db.mNativeHandle;
         compile(sql, true);
     }
@@ -115,8 +123,15 @@
      * Make sure that the native resource is cleaned up.
      */
     @Override
-    protected void finalize() {
-        releaseSqlStatement();
+    protected void finalize() throws Throwable {
+        try {
+            if (nStatement == 0) return;
+            // finalizer should NEVER get called
+            Log.w(TAG, "finalizer should never be called. sql: " + mSqlStmt, mStackTrace);
+            releaseSqlStatement();
+        } finally {
+            super.finalize();
+        }
     }
 
     /**
diff --git a/core/java/android/database/sqlite/SQLiteCursor.java b/core/java/android/database/sqlite/SQLiteCursor.java
index b178d4f..3f0fcb1 100644
--- a/core/java/android/database/sqlite/SQLiteCursor.java
+++ b/core/java/android/database/sqlite/SQLiteCursor.java
@@ -62,9 +62,8 @@
     /** A mapping of column names to column indices, to speed up lookups */
     private Map<String, Integer> mColumnNameMap;
 
-    /** Used to find out where a cursor was allocated in case it never got
-     * released. */
-    private StackTraceElement[] mStackTraceElements;
+    /** Used to find out where a cursor was allocated in case it never got released. */
+    private Throwable mStackTrace;
     
     /** 
      *  mMaxRead is the max items that each cursor window reads 
@@ -208,11 +207,7 @@
             String editTable, SQLiteQuery query) {
         // The AbstractCursor constructor needs to do some setup.
         super();
-
-        if (SQLiteDebug.DEBUG_ACTIVE_CURSOR_FINALIZATION) {
-            mStackTraceElements = new Exception().getStackTrace();
-        }
-
+        mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
         mDatabase = db;
         mDriver = driver;
         mEditTable = editTable;
@@ -585,15 +580,9 @@
             // if the cursor hasn't been closed yet, close it first
             if (mWindow != null) {
                 close();
-                Log.e(TAG, "Finalizing cursor that has not been deactivated or closed." 
-                    + " database = " + mDatabase.getPath() + ", table = " + mEditTable
-                    + ", query = " + mQuery.mSql);
-                if (SQLiteDebug.DEBUG_ACTIVE_CURSOR_FINALIZATION) {
-                    Log.d(TAG, "This cursor was created in:");
-                    for (StackTraceElement ste : mStackTraceElements) {
-                        Log.d(TAG, "      " + ste);
-                    }
-                }
+                Log.e(TAG, "Finalizing a Cursor that has not been deactivated or closed. " +
+                        "database = " + mDatabase.getPath() + ", table = " + mEditTable +
+                        ", query = " + mQuery.mSql, mStackTrace);
                 SQLiteDebug.notifyActiveCursorFinalized();
             } else {
                 if (Config.LOGV) {
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index c13dd23..9fa9368 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -271,7 +271,8 @@
     private String mTimeOpened = null;
     private String mTimeClosed = null;
 
-    private final RuntimeException mLeakedException;
+    /** Used to find out where this object was created in case it never got closed. */
+    private Throwable mStackTrace = null;
 
     // System property that enables logging of slow queries. Specify the threshold in ms.
     private static final String LOG_SLOW_QUERIES_PROPERTY = "db.log.slow_query_threshold";
@@ -1726,13 +1727,8 @@
     @Override
     protected void finalize() {
         if (isOpen()) {
-            if (mPrograms.isEmpty()) {
-                Log.e(TAG, "Leak found", mLeakedException);
-            } else {
-                IllegalStateException leakProgram = new IllegalStateException(
-                        "mPrograms size " + mPrograms.size(), mLeakedException);
-                Log.e(TAG, "Leak found", leakProgram);
-            }
+            Log.e(TAG, "close() was never explicitly called on database '" +
+                    mPath + "' ", mStackTrace);
             closeClosable();
             onAllReferencesReleased();
         }
@@ -1753,9 +1749,7 @@
         mFlags = flags;
         mPath = path;
         mSlowQueryThreshold = SystemProperties.getInt(LOG_SLOW_QUERIES_PROPERTY, -1);
-
-        mLeakedException = new IllegalStateException(path +
-            " SQLiteDatabase created and never closed");
+        mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace();
         mFactory = factory;
         dbopen(mPath, mFlags);
         if (SQLiteDebug.DEBUG_SQL_CACHE) {
@@ -1908,14 +1902,6 @@
             return;
         }
 
-        /* don't cache PRAGMA sql statements.
-         * caching them makes sqlite return incorrect results on pragma sql execution!
-         */
-        String prefixSql = sql.substring(0, 6);
-        if (prefixSql.toLowerCase().startsWith("pragma")) {
-            return;
-        }
-
         SQLiteCompiledSql compiledSql = null;
         synchronized(mCompiledQueries) {
             // don't insert the new mapping if a mapping already exists
@@ -1981,12 +1967,6 @@
      * returns null, if not found in the cache.
      */
     /* package */ SQLiteCompiledSql getCompiledStatementForSql(String sql) {
-        // don't look for PRAGMA sql statements in compiled-sql cache
-        String prefixSql = sql.substring(0, 6);
-        if (prefixSql.toLowerCase().startsWith("pragma")) {
-            return null;
-        }
-
         SQLiteCompiledSql compiledStatement = null;
         boolean cacheHit;
         synchronized(mCompiledQueries) {
diff --git a/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java b/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java
index ca64aca..2144fc3 100644
--- a/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java
+++ b/core/java/android/database/sqlite/SQLiteDirectCursorDriver.java
@@ -18,7 +18,6 @@
 
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase.CursorFactory;
-import android.util.Log;
 
 /**
  * A cursor driver that uses the given query directly.
@@ -26,7 +25,6 @@
  * @hide
  */
 public class SQLiteDirectCursorDriver implements SQLiteCursorDriver {
-    private static String TAG = "SQLiteDirectCursorDriver";
     private String mEditTable; 
     private SQLiteDatabase mDatabase;
     private Cursor mCursor;
@@ -36,11 +34,6 @@
     public SQLiteDirectCursorDriver(SQLiteDatabase db, String sql, String editTable) {
         mDatabase = db;
         mEditTable = editTable;
-        //TODO remove all callers that end in ; and remove this check
-        if (sql.charAt(sql.length() - 1) == ';') {
-            Log.w(TAG, "Found SQL string that ends in ; -- " + sql);
-            sql = sql.substring(0, sql.length() - 1);
-        }
         mSql = sql;
     }
 
diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java
index 7a29cb4..389e15e 100644
--- a/core/java/android/database/sqlite/SQLiteProgram.java
+++ b/core/java/android/database/sqlite/SQLiteProgram.java
@@ -21,7 +21,10 @@
  */
 public abstract class SQLiteProgram extends SQLiteClosable {
 
-    /** The database this program is compiled against. */
+    /** The database this program is compiled against.
+     * @deprecated do not use this
+     */
+    @Deprecated
     protected SQLiteDatabase mDatabase;
 
     /** The SQL used to create this query */
@@ -30,7 +33,9 @@
     /**
      * Native linkage, do not modify. This comes from the database and should not be modified
      * in here or in the native code.
+     * @deprecated do not use this
      */
+    @Deprecated
     protected int nHandle = 0;
 
     /**
@@ -41,16 +46,30 @@
     /**
      * SQLiteCompiledSql statement id is populated with the corresponding object from the above
      * member. This member is used by the native_bind_* methods
+     * @deprecated do not use this
      */
+    @Deprecated
     protected int nStatement = 0;
 
     /* package */ SQLiteProgram(SQLiteDatabase db, String sql) {
         mDatabase = db;
-        mSql = sql;
+        mSql = sql.trim();
         db.acquireReference();
         db.addSQLiteClosable(this);
         this.nHandle = db.mNativeHandle;
 
+        // shouldn't reuse compiled-plans of PRAGMA sql statements
+        // because sqlite returns OLD values if compiled-pragma-statements are reused
+        //TODO: remove this code when sqlite fixes it (and add tests too)
+        String prefixSql = mSql.substring(0, 6);
+        if (prefixSql.toLowerCase().startsWith("pragma")) {
+            mCompiledSql = new SQLiteCompiledSql(db, sql);
+            nStatement = mCompiledSql.nStatement;
+            // since it is not in the cache, no need to acquire() it.
+            return;
+        }
+
+        // it is not pragma
         mCompiledSql = db.getCompiledStatementForSql(sql);
         if (mCompiledSql == null) {
             // create a new compiled-sql obj
@@ -70,6 +89,8 @@
                 // CompiledSql object. create a new one.
                 // finalize it when I am done with it in "this" object.
                 mCompiledSql = new SQLiteCompiledSql(db, sql);
+
+                // since it is not in the cache, no need to acquire() it.
             }
         }
         nStatement = mCompiledSql.nStatement;
@@ -95,9 +116,9 @@
         synchronized(mDatabase.mCompiledQueries) {
             if (!mDatabase.mCompiledQueries.containsValue(mCompiledSql)) {
                 // it is NOT in compiled-sql cache. i.e., responsibility of
-                // release this statement is on me.
+                // releasing this statement is on me.
                 mCompiledSql.releaseSqlStatement();
-                mCompiledSql = null; // so that GC doesn't call finalize() on it
+                mCompiledSql = null;
                 nStatement = 0;
             } else {
                 // it is in compiled-sql cache. reset its CompiledSql#mInUse flag
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index da5fa49..cddbec9 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -524,21 +524,24 @@
 
     /**
      * Zooms to the requested value smoothly. Driver will generate {@link
-     * #ZoomCallback} for the current zoom value and whether zoom is stopped.
-     * The applications can call {@link #stopSmoothZoom} to stop the zoom
-     * earlier. The applications should not call startSmoothZoom again or {@link
-     * android.hardware.Camera.Parameters#setZoom(int)} before the zoom stops.
+     * ZoomCallback} for the zoom value and whether zoom is stopped at the
+     * time. For example, suppose the current zoom is 0 and startSmoothZoom is
+     * called with value 3. Three ZoomCallback will be generated with zoom value
+     * 1, 2, and 3. The applications can call {@link #stopSmoothZoom} to stop
+     * the zoom earlier. The applications should not call startSmoothZoom again
+     * or change the zoom value before zoom stops. This method is supported if
+     * {@link android.hardware.Camera.Parameters#isSmoothZoomSupported} is true.
      *
      * @param value zoom value. The valid range is 0 to {@link
      *              android.hardware.Camera.Parameters#getMaxZoom}.
-     * @hide
      */
     public native final void startSmoothZoom(int value);
 
     /**
      * Stops the smooth zoom. The applications should wait for the {@link
-     * #ZoomCallback} to know when the zoom is actually stopped.
-     * @hide
+     * ZoomCallback} to know when the zoom is actually stopped. This method is
+     * supported if {@link
+     * android.hardware.Camera.Parameters#isSmoothZoomSupported} is true.
      */
     public native final void stopSmoothZoom();
 
@@ -560,7 +563,6 @@
     /**
      * Handles the zoom callback.
      *
-     * @hide
      */
     public interface ZoomCallback
     {
@@ -573,7 +575,7 @@
          *                this is the last zoom update for the application.
          *
          * @param camera  the Camera service object
-         * @see android.hardware.Camera.Parameters#startSmoothZoom
+         * @see #startSmoothZoom(int)
          */
         void onZoomUpdate(int zoomValue, boolean stopped, Camera camera);
     };
@@ -581,8 +583,9 @@
     /**
      * Registers a callback to be invoked when the zoom value is updated by the
      * camera driver during smooth zoom.
+     *
      * @param cb the callback to run
-     * @hide
+     * @see #startSmoothZoom(int)
      */
     public final void setZoomCallback(ZoomCallback cb)
     {
@@ -727,9 +730,16 @@
         private static final String KEY_MAX_EXPOSURE_COMPENSATION = "max-exposure-compensation";
         private static final String KEY_MIN_EXPOSURE_COMPENSATION = "min-exposure-compensation";
         private static final String KEY_EXPOSURE_COMPENSATION_STEP = "exposure-compensation-step";
+        private static final String KEY_ZOOM = "zoom";
+        private static final String KEY_MAX_ZOOM = "max-zoom";
+        private static final String KEY_ZOOM_RATIOS = "zoom-ratios";
+        private static final String KEY_ZOOM_SUPPORTED = "zoom-supported";
+        private static final String KEY_SMOOTH_ZOOM_SUPPORTED = "smooth-zoom-supported";
         // Parameter key suffix for supported values.
         private static final String SUPPORTED_VALUES_SUFFIX = "-values";
 
+        private static final String TRUE = "true";
+
         // Values for white balance settings.
         public static final String WHITE_BALANCE_AUTO = "auto";
         public static final String WHITE_BALANCE_INCANDESCENT = "incandescent";
@@ -1607,26 +1617,28 @@
 
         /**
          * Gets current zoom value. This also works when smooth zoom is in
-         * progress.
+         * progress. Applications should check {@link #isZoomSupported} before
+         * using this method.
          *
          * @return the current zoom value. The range is 0 to {@link
-         *          #getMaxZoom}.
-         * @hide
+         *         #getMaxZoom}. 0 means the camera is not zoomed.
          */
         public int getZoom() {
-            return getInt("zoom");
+            return getInt(KEY_ZOOM, 0);
         }
 
         /**
-         * Sets current zoom value. If {@link #startSmoothZoom(int)} has been
-         * called and zoom is not stopped yet, applications should not call this
-         * method.
+         * Sets current zoom value. If the camera is zoomed (value > 0), the
+         * actual picture size may be smaller than picture size setting.
+         * Applications can check the actual picture size after picture is
+         * returned from {@link PictureCallback}. The preview size remains the
+         * same in zoom. Applications should check {@link #isZoomSupported}
+         * before using this method.
          *
          * @param value zoom value. The valid range is 0 to {@link #getMaxZoom}.
-         * @hide
          */
         public void setZoom(int value) {
-            set("zoom", value);
+            set(KEY_ZOOM, value);
         }
 
         /**
@@ -1634,37 +1646,37 @@
          * before using other zoom methods.
          *
          * @return true if zoom is supported.
-         * @hide
          */
         public boolean isZoomSupported() {
-            String str = get("zoom-supported");
-            return "true".equals(str);
+            String str = get(KEY_ZOOM_SUPPORTED);
+            return TRUE.equals(str);
         }
 
         /**
          * Gets the maximum zoom value allowed for snapshot. This is the maximum
          * value that applications can set to {@link #setZoom(int)}.
+         * Applications should call {@link #isZoomSupported} before using this
+         * method. This value may change in different preview size. Applications
+         * should call this again after setting preview size.
          *
          * @return the maximum zoom value supported by the camera.
-         * @hide
          */
         public int getMaxZoom() {
-            return getInt("max-zoom");
+            return getInt(KEY_MAX_ZOOM, 0);
         }
 
         /**
-         * Gets the zoom factors of all zoom values.
+         * Gets the zoom ratios of all zoom values. Applications should check
+         * {@link #isZoomSupported} before using this method.
          *
-         * @return the zoom factors in 1/100 increments. Ex: a zoom of 3.2x is
-         *         returned as 320. Accuracy of the value is dependent on the
-         *         hardware implementation. The first element of the list is the
-         *         zoom factor of first zoom value. If the first zoom value is
-         *         0, the zoom factor should be 100. The last element is the
-         *         zoom factor of zoom value {@link #getMaxZoom}.
-         * @hide
+         * @return the zoom ratios in 1/100 increments. Ex: a zoom of 3.2x is
+         *         returned as 320. The number of elements is {@link
+         *         #getMaxZoom} + 1. The list is sorted from small to large. The
+         *         first element is always 100. The last element is the zoom
+         *         ratio of the maximum zoom value.
          */
-        public List<Integer> getZoomFactors() {
-            return splitInt(get("zoom-factors"));
+        public List<Integer> getZoomRatios() {
+            return splitInt(get(KEY_ZOOM_RATIOS));
         }
 
         /**
@@ -1672,11 +1684,10 @@
          * this before using other smooth zoom methods.
          *
          * @return true if smooth zoom is supported.
-         * @hide
          */
         public boolean isSmoothZoomSupported() {
-            String str = get("smooth-zoom-supported");
-            return "true".equals(str);
+            String str = get(KEY_SMOOTH_ZOOM_SUPPORTED);
+            return TRUE.equals(str);
         }
 
         // Splits a comma delimited string to an ArrayList of String.
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index f5fed4f..317e547 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -41,7 +41,10 @@
      * A constant describing an orientation sensor type.
      * See {@link android.hardware.SensorEvent SensorEvent}
      * for more details.
+     * @deprecated use {@link android.hardware.SensorManager#getOrientation
+     *  SensorManager.getOrientation()} instead.
      */
+    @Deprecated
     public static final int TYPE_ORIENTATION    = 3;
 
     /** A constant describing a gyroscope sensor type */
@@ -52,10 +55,13 @@
      * for more details.
      */
     public static final int TYPE_LIGHT          = 5;
+
     /** A constant describing a pressure sensor type */
     public static final int TYPE_PRESSURE       = 6;
+
     /** A constant describing a temperature sensor type */
     public static final int TYPE_TEMPERATURE    = 7;
+
     /**
      * A constant describing an proximity sensor type.
      * See {@link android.hardware.SensorEvent SensorEvent}
diff --git a/core/java/android/hardware/SensorEvent.java b/core/java/android/hardware/SensorEvent.java
index 32d5691..9a9f0bf 100644
--- a/core/java/android/hardware/SensorEvent.java
+++ b/core/java/android/hardware/SensorEvent.java
@@ -68,27 +68,30 @@
      *  All values are angles in degrees.
      * 
      * <p>values[0]: Azimuth, angle between the magnetic north direction and
-     * the Y axis, around the Z axis (0 to 359). 
+     * the Y axis, around the Z axis (0 to 359).
      * 0=North, 90=East, 180=South, 270=West
-     * 
+     *
      * <p>values[1]: Pitch, rotation around X axis (-180 to 180), 
      * with positive values when the z-axis moves <b>toward</b> the y-axis.
      *
      * <p>values[2]: Roll, rotation around Y axis (-90 to 90), with 
-     * positive values  when the x-axis moves <b>away</b> from the z-axis.
+     * positive values  when the x-axis moves <b>toward</b> the z-axis.
      * 
+     * <p><b>Important note:</b> For historical reasons the roll angle is
+     * positive in the clockwise direction (mathematically speaking, it
+     * should be positive in the counter-clockwise direction).
+     *
      * <p><b>Note:</b> This definition is different from <b>yaw, pitch and 
      * roll</b> used in aviation where the X axis is along the long side of
      * the plane (tail to nose).
-     * 
-     * <p><b>Note:</b> It is preferable to use 
+     *
+     * <p><b>Note:</b> This sensor type exists for legacy reasons, please use
      * {@link android.hardware.SensorManager#getRotationMatrix 
      *      getRotationMatrix()} in conjunction with
      * {@link android.hardware.SensorManager#remapCoordinateSystem 
      *      remapCoordinateSystem()} and
      * {@link android.hardware.SensorManager#getOrientation getOrientation()}
-     * to compute these values; while it may be more expensive, it is usually 
-     * more accurate.
+     * to compute these values instead.
      *
      * <p>{@link android.hardware.Sensor#TYPE_ACCELEROMETER Sensor.TYPE_ACCELEROMETER}:<p>
      *  All values are in SI units (m/s^2) and measure the acceleration applied
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index 8eed9f7..98172e6 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -1179,23 +1179,27 @@
      * 
      * <p>When the rotation matrix is used for drawing (for instance with 
      * OpenGL ES), it usually <b>doesn't need</b> to be transformed by this 
-     * function, unless the screen is physically rotated, such as when used
-     * in landscape mode. 
+     * function, unless the screen is physically rotated, in which case you
+     * can use {@link android.view.Display#getRotation() Display.getRotation()}
+     * to retrieve the current rotation of the screen.  Note that because the
+     * user is generally free to rotate their screen, you often should
+     * consider the rotation in deciding the parameters to use here.
      *
      * <p><u>Examples:</u><p>
      *
      * <li>Using the camera (Y axis along the camera's axis) for an augmented 
-     * reality application where the rotation angles are needed :</li><p>
+     * reality application where the rotation angles are needed: </li><p>
      *
      * <code>remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);</code><p>
      *
-     * <li>Using the device as a mechanical compass in landscape mode:</li><p>
+     * <li>Using the device as a mechanical compass when rotation is
+     * {@link android.view.Surface#ROTATION_90 Surface.ROTATION_90}:</li><p>
      *
      * <code>remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);</code><p>
      *
-     * Beware of the above example. This call is needed only if the device is
-     * physically used in landscape mode to calculate the rotation angles (see 
-     * {@link #getOrientation}).
+     * Beware of the above example. This call is needed only to account for
+     * a rotation from its natural orientation when calculating the
+     * rotation angles (see {@link #getOrientation}).
      * If the rotation matrix is also used for rendering, it may not need to 
      * be transformed, for instance if your {@link android.app.Activity
      * Activity} is running in landscape mode.
@@ -1302,6 +1306,8 @@
      * <li>values[1]: <i>pitch</i>, rotation around the X axis.</li>
      * <li>values[2]: <i>roll</i>, rotation around the Y axis.</li>
      * <p>
+     * All three angles above are in <b>radians</b> and <b>positive</b> in the
+     * <b>counter-clockwise</b> direction.
      *
      * @param R rotation matrix see {@link #getRotationMatrix}.
      * @param values an array of 3 floats to hold the result.
@@ -1441,8 +1447,9 @@
             values[3] = x;
             values[4] = y;
             values[5] = z;
-            // TODO: add support for 180 and 270 orientations
-            if (orientation == Surface.ROTATION_90) {
+
+            if ((orientation & Surface.ROTATION_90) != 0) {
+                // handles 90 and 270 rotation
                 switch (sensor) {
                     case SENSOR_ACCELEROMETER:
                     case SENSOR_MAGNETIC_FIELD:
@@ -1458,6 +1465,26 @@
                         break;
                 }
             }
+            if ((orientation & Surface.ROTATION_180) != 0) {
+                x = values[0];
+                y = values[1];
+                z = values[2];
+                // handles 180 (flip) and 270 (flip + 90) rotation
+                switch (sensor) {
+                    case SENSOR_ACCELEROMETER:
+                    case SENSOR_MAGNETIC_FIELD:
+                        values[0] =-x;
+                        values[1] =-y;
+                        values[2] = z;
+                        break;
+                    case SENSOR_ORIENTATION:
+                    case SENSOR_ORIENTATION_RAW:
+                        values[0] = (x >= 180) ? (x - 180) : (x + 180);
+                        values[1] =-y;
+                        values[2] =-z;
+                        break;
+                }
+            }
         }
     }
     
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index b254961..b59e279 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -48,6 +48,7 @@
     private ITelephony mPhoneService;
 
     private String mApnType;
+    private String mApnTypeToWatchFor;
     private String mApnName;
     private boolean mEnabled;
     private BroadcastReceiver mStateReceiver;
@@ -65,6 +66,12 @@
                 TelephonyManager.getDefault().getNetworkType(), tag,
                 TelephonyManager.getDefault().getNetworkTypeName());
         mApnType = networkTypeToApnType(netType);
+        if (TextUtils.equals(mApnType, Phone.APN_TYPE_HIPRI)) {
+            mApnTypeToWatchFor = Phone.APN_TYPE_DEFAULT;
+        } else {
+            mApnTypeToWatchFor = mApnType;
+        }
+
         mPhoneService = null;
         if(netType == ConnectivityManager.TYPE_MOBILE) {
             mEnabled = true;
@@ -122,7 +129,7 @@
 
         String[] list = typeList.split(",");
         for(int i=0; i< list.length; i++) {
-            if (TextUtils.equals(list[i], mApnType) ||
+            if (TextUtils.equals(list[i], mApnTypeToWatchFor) ||
                 TextUtils.equals(list[i], Phone.APN_TYPE_ALL)) {
                 return true;
             }
diff --git a/core/java/android/net/http/HttpsConnection.java b/core/java/android/net/http/HttpsConnection.java
index f735f3d..a67fd9a 100644
--- a/core/java/android/net/http/HttpsConnection.java
+++ b/core/java/android/net/http/HttpsConnection.java
@@ -59,7 +59,7 @@
     private static SSLSocketFactory mSslSocketFactory = null;
 
     static {
-        // This intiialization happens in the zygote. It triggers some
+        // This initialization happens in the zygote. It triggers some
         // lazy initialization that can will benefit later invocations of
         // initializeEngine().
         initializeEngine(null);
diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java
index 2214405..c29926c 100644
--- a/core/java/android/net/http/SslCertificate.java
+++ b/core/java/android/net/http/SslCertificate.java
@@ -18,7 +18,9 @@
 
 import android.os.Bundle;
 
-import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Vector;
 
 import java.security.cert.X509Certificate;
@@ -32,6 +34,11 @@
 public class SslCertificate {
 
     /**
+     * SimpleDateFormat pattern for an ISO 8601 date
+     */
+    private static String ISO_8601_DATE_FORMAT = "yyyy-MM-dd HH:mm:ssZ";
+
+    /**
      * Name of the entity this certificate is issued to
      */
     private DName mIssuedTo;
@@ -44,12 +51,12 @@
     /**
      * Not-before date from the validity period
      */
-    private String mValidNotBefore;
+    private Date mValidNotBefore;
 
     /**
      * Not-after date from the validity period
      */
-    private String mValidNotAfter;
+    private Date mValidNotAfter;
 
      /**
      * Bundle key names
@@ -101,16 +108,28 @@
      * Creates a new SSL certificate object
      * @param issuedTo The entity this certificate is issued to
      * @param issuedBy The entity that issued this certificate
+     * @param validNotBefore The not-before date from the certificate validity period in ISO 8601 format
+     * @param validNotAfter The not-after date from the certificate validity period in ISO 8601 format
+     * @deprecated Use {@link #SslCertificate(String, String, Date, Date)}
+     */
+    public SslCertificate(
+            String issuedTo, String issuedBy, String validNotBefore, String validNotAfter) {
+        this(issuedTo, issuedBy, parseDate(validNotBefore), parseDate(validNotAfter));
+    }
+
+    /**
+     * Creates a new SSL certificate object
+     * @param issuedTo The entity this certificate is issued to
+     * @param issuedBy The entity that issued this certificate
      * @param validNotBefore The not-before date from the certificate validity period
      * @param validNotAfter The not-after date from the certificate validity period
      */
     public SslCertificate(
-        String issuedTo, String issuedBy, String validNotBefore, String validNotAfter) {
+            String issuedTo, String issuedBy, Date validNotBefore, Date validNotAfter) {
         mIssuedTo = new DName(issuedTo);
         mIssuedBy = new DName(issuedBy);
-
-        mValidNotBefore = validNotBefore;
-        mValidNotAfter = validNotAfter;
+        mValidNotBefore = cloneDate(validNotBefore);
+        mValidNotAfter  = cloneDate(validNotAfter);
     }
 
     /**
@@ -120,24 +139,44 @@
     public SslCertificate(X509Certificate certificate) {
         this(certificate.getSubjectDN().getName(),
              certificate.getIssuerDN().getName(),
-             DateFormat.getInstance().format(certificate.getNotBefore()),
-             DateFormat.getInstance().format(certificate.getNotAfter()));
+             certificate.getNotBefore(),
+             certificate.getNotAfter());
     }
 
     /**
      * @return Not-before date from the certificate validity period or
      * "" if none has been set
      */
+    public Date getValidNotBeforeDate() {
+        return cloneDate(mValidNotBefore);
+    }
+
+    /**
+     * @return Not-before date from the certificate validity period in
+     * ISO 8601 format or "" if none has been set
+     *
+     * @deprecated Use {@link #getValidNotBeforeDate()}
+     */
     public String getValidNotBefore() {
-        return mValidNotBefore != null ? mValidNotBefore : "";
+        return formatDate(mValidNotBefore);
     }
 
     /**
      * @return Not-after date from the certificate validity period or
      * "" if none has been set
      */
+    public Date getValidNotAfterDate() {
+        return cloneDate(mValidNotAfter);
+    }
+
+    /**
+     * @return Not-after date from the certificate validity period in
+     * ISO 8601 format or "" if none has been set
+     *
+     * @deprecated Use {@link #getValidNotAfterDate()}
+     */
     public String getValidNotAfter() {
-        return mValidNotAfter != null ? mValidNotAfter : "";
+        return formatDate(mValidNotAfter);
     }
 
     /**
@@ -164,6 +203,37 @@
     }
 
     /**
+     * Parse an ISO 8601 date converting ParseExceptions to a null result;
+     */
+    private static Date parseDate(String string) {
+        try {
+            return new SimpleDateFormat(ISO_8601_DATE_FORMAT).parse(string);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Format a date as an ISO 8601 string, return "" for a null date
+     */
+    private static String formatDate(Date date) {
+        if (date == null) {
+            return "";
+        }
+        return new SimpleDateFormat(ISO_8601_DATE_FORMAT).format(date);
+    }
+
+    /**
+     * Clone a possibly null Date
+     */
+    private static Date cloneDate(Date date) {
+        if (date == null) {
+            return null;
+        }
+        return (Date) date.clone();
+    }
+
+    /**
      * A distinguished name helper class: a 3-tuple of:
      * - common name (CN),
      * - organization (O),
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index a91655f..d6fe107 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -525,6 +525,18 @@
     }
 
     /**
+     * Inserts an ArrayList<CharSequence> value into the mapping of this Bundle, replacing
+     * any existing value for the given key.  Either key or value may be null.
+     *
+     * @param key a String, or null
+     * @param value an ArrayList<CharSequence> object, or null
+     */
+    public void putCharSequenceArrayList(String key, ArrayList<CharSequence> value) {
+        unparcel();
+        mMap.put(key, value);
+    }
+
+    /**
      * Inserts a Serializable value into the mapping of this Bundle, replacing
      * any existing value for the given key.  Either key or value may be null.
      *
@@ -645,6 +657,18 @@
     }
 
     /**
+     * Inserts a CharSequence array value into the mapping of this Bundle, replacing
+     * any existing value for the given key.  Either key or value may be null.
+     *
+     * @param key a String, or null
+     * @param value a CharSequence array object, or null
+     */
+    public void putCharSequenceArray(String key, CharSequence[] value) {
+        unparcel();
+        mMap.put(key, value);
+    }
+
+    /**
      * Inserts a Bundle value into the mapping of this Bundle, replacing
      * any existing value for the given key.  Either key or value may be null.
      *
@@ -1186,6 +1210,28 @@
      * value is explicitly associated with the key.
      *
      * @param key a String, or null
+     * @return an ArrayList<CharSequence> value, or null
+     */
+    public ArrayList<CharSequence> getCharSequenceArrayList(String key) {
+        unparcel();
+        Object o = mMap.get(key);
+        if (o == null) {
+            return null;
+        }
+        try {
+            return (ArrayList<CharSequence>) o;
+        } catch (ClassCastException e) {
+            typeWarning(key, o, "ArrayList<CharSequence>", e);
+            return null;
+        }
+    }
+
+    /**
+     * Returns the value associated with the given key, or null if
+     * no mapping of the desired type exists for the given key or a null
+     * value is explicitly associated with the key.
+     *
+     * @param key a String, or null
      * @return a boolean[] value, or null
      */
     public boolean[] getBooleanArray(String key) {
@@ -1384,6 +1430,28 @@
      * value is explicitly associated with the key.
      *
      * @param key a String, or null
+     * @return a CharSequence[] value, or null
+     */
+    public CharSequence[] getCharSequenceArray(String key) {
+        unparcel();
+        Object o = mMap.get(key);
+        if (o == null) {
+            return null;
+        }
+        try {
+            return (CharSequence[]) o;
+        } catch (ClassCastException e) {
+            typeWarning(key, o, "CharSequence[]", e);
+            return null;
+        }
+    }
+
+    /**
+     * Returns the value associated with the given key, or null if
+     * no mapping of the desired type exists for the given key or a null
+     * value is explicitly associated with the key.
+     *
+     * @param key a String, or null
      * @return an IBinder value, or null
      *
      * @deprecated
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 6cfccee..8ad600c 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -212,6 +212,7 @@
     private static final int VAL_SERIALIZABLE = 21;
     private static final int VAL_SPARSEBOOLEANARRAY = 22;
     private static final int VAL_BOOLEANARRAY = 23;
+    private static final int VAL_CHARSEQUENCEARRAY = 24;
 
     private static final int EX_SECURITY = -1;
     private static final int EX_BAD_PARCELABLE = -2;
@@ -411,6 +412,15 @@
     public final native void writeString(String val);
 
     /**
+     * Write a CharSequence value into the parcel at the current dataPosition(),
+     * growing dataCapacity() if needed.
+     * @hide
+     */
+    public final void writeCharSequence(CharSequence val) {
+        TextUtils.writeToParcel(val, this, 0);
+    }
+
+    /**
      * Write an object into the parcel at the current dataPosition(),
      * growing dataCapacity() if needed.
      */
@@ -827,6 +837,21 @@
         }
     }
 
+    /**
+     * @hide
+     */
+    public final void writeCharSequenceArray(CharSequence[] val) {
+        if (val != null) {
+            int N = val.length;
+            writeInt(N);
+            for (int i=0; i<N; i++) {
+                writeCharSequence(val[i]);
+            }
+        } else {
+            writeInt(-1);
+        }
+    }
+
     public final IBinder[] createBinderArray() {
         int N = readInt();
         if (N >= 0) {
@@ -1045,7 +1070,7 @@
         } else if (v instanceof CharSequence) {
             // Must be after String
             writeInt(VAL_CHARSEQUENCE);
-            TextUtils.writeToParcel((CharSequence) v, this, 0);
+            writeCharSequence((CharSequence) v);
         } else if (v instanceof List) {
             writeInt(VAL_LIST);
             writeList((List) v);
@@ -1061,6 +1086,10 @@
         } else if (v instanceof String[]) {
             writeInt(VAL_STRINGARRAY);
             writeStringArray((String[]) v);
+        } else if (v instanceof CharSequence[]) {
+            // Must be after String[] and before Object[]
+            writeInt(VAL_CHARSEQUENCEARRAY);
+            writeCharSequenceArray((CharSequence[]) v);
         } else if (v instanceof IBinder) {
             writeInt(VAL_IBINDER);
             writeStrongBinder((IBinder) v);
@@ -1257,6 +1286,14 @@
     public final native String readString();
 
     /**
+     * Read a CharSequence value from the parcel at the current dataPosition().
+     * @hide
+     */
+    public final CharSequence readCharSequence() {
+        return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
+    }
+
+    /**
      * Read an object from the parcel at the current dataPosition().
      */
     public final native IBinder readStrongBinder();
@@ -1389,6 +1426,27 @@
     }
 
     /**
+     * Read and return a CharSequence[] object from the parcel.
+     * {@hide}
+     */
+    public final CharSequence[] readCharSequenceArray() {
+        CharSequence[] array = null;
+
+        int length = readInt();
+        if (length >= 0)
+        {
+            array = new CharSequence[length];
+
+            for (int i = 0 ; i < length ; i++)
+            {
+                array[i] = readCharSequence();
+            }
+        }
+
+        return array;
+    }
+
+    /**
      * Read and return a new ArrayList object from the parcel at the current
      * dataPosition().  Returns null if the previously written list object was
      * null.  The given class loader will be used to load any enclosed
@@ -1728,7 +1786,7 @@
             return readInt() == 1;
 
         case VAL_CHARSEQUENCE:
-            return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
+            return readCharSequence();
 
         case VAL_LIST:
             return readArrayList(loader);
@@ -1742,6 +1800,9 @@
         case VAL_STRINGARRAY:
             return readStringArray();
 
+        case VAL_CHARSEQUENCEARRAY:
+            return readCharSequenceArray();
+
         case VAL_IBINDER:
             return readStrongBinder();
 
diff --git a/core/java/android/os/storage/IMountService.aidl b/core/java/android/os/storage/IMountService.aidl
index 2b2dcf4..ad4cb10 100644
--- a/core/java/android/os/storage/IMountService.aidl
+++ b/core/java/android/os/storage/IMountService.aidl
@@ -45,8 +45,10 @@
 
     /**
      * Enables / disables USB mass storage.
+     * The caller should check actual status of enabling/disabling
+     * USB mass storage via StorageEventListener.
      */
-    int setUsbMassStorageEnabled(boolean enable);
+    void setUsbMassStorageEnabled(boolean enable);
 
     /**
      * Returns true if a USB mass storage host is enabled (media is shared)
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index e421ea5..b49979c 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -243,30 +243,24 @@
 
     /**
      * Enables USB Mass Storage (UMS) on the device.
-     * @return an integer value representing the outcome of the operation.
-     * @see android.os.storage.StorageResultCode
      */
-    public int enableUsbMassStorage() {
+    public void enableUsbMassStorage() {
         try {
-            return mMountService.setUsbMassStorageEnabled(true);
+            mMountService.setUsbMassStorageEnabled(true);
         } catch (Exception ex) {
             Log.e(TAG, "Failed to enable UMS", ex);
         }
-        return StorageResultCode.OperationFailedInternalError;
     }
 
     /**
      * Disables USB Mass Storage (UMS) on the device.
-     * @return an integer value representing the outcome of the operation.
-     * @see android.os.storage.StorageResultCode
      */
-    public int disableUsbMassStorage() {
+    public void disableUsbMassStorage() {
         try {
-            return mMountService.setUsbMassStorageEnabled(false);
+            mMountService.setUsbMassStorageEnabled(false);
         } catch (Exception ex) {
             Log.e(TAG, "Failed to disable UMS", ex);
         }
-        return StorageResultCode.OperationFailedInternalError;
     }
 
     /**
diff --git a/core/java/android/pim/EventRecurrence.java b/core/java/android/pim/EventRecurrence.java
index 3ea9b4a..56c4f7a 100644
--- a/core/java/android/pim/EventRecurrence.java
+++ b/core/java/android/pim/EventRecurrence.java
@@ -16,7 +16,6 @@
 
 package android.pim;
 
-import android.content.res.Resources;
 import android.text.TextUtils;
 import android.text.format.Time;
 
@@ -325,55 +324,6 @@
         return s.toString();
     }
     
-    public String getRepeatString() {
-        Resources r = Resources.getSystem();
-        
-        // TODO Implement "Until" portion of string, as well as custom settings
-        switch (this.freq) {
-            case DAILY:
-                return r.getString(com.android.internal.R.string.daily);
-            case WEEKLY: {
-                if (repeatsOnEveryWeekDay()) {
-                    return r.getString(com.android.internal.R.string.every_weekday);
-                } else {
-                    String format = r.getString(com.android.internal.R.string.weekly);
-                    StringBuilder days = new StringBuilder();
-                
-                    // Do one less iteration in the loop so the last element is added out of the
-                    // loop. This is done so the comma is not placed after the last item.
-                    int count = this.bydayCount - 1;
-                    if (count >= 0) {
-                        for (int i = 0 ; i < count ; i++) {
-                            days.append(dayToString(r, this.byday[i]));
-                            days.append(",");
-                        }
-                        days.append(dayToString(r, this.byday[count]));
-                    
-                        return String.format(format, days.toString());
-                    }
-                    
-                    // There is no "BYDAY" specifier, so use the day of the
-                    // first event.  For this to work, the setStartDate()
-                    // method must have been used by the caller to set the
-                    // date of the first event in the recurrence.
-                    if (startDate == null) {
-                        return null;
-                    }
-                    
-                    int day = timeDay2Day(startDate.weekDay);
-                    return String.format(format, dayToString(r, day));
-                }
-            }
-            case MONTHLY: {
-                return r.getString(com.android.internal.R.string.monthly);
-            }
-            case YEARLY:
-                return r.getString(com.android.internal.R.string.yearly);
-        }
-
-        return null;
-    }
-    
     public boolean repeatsOnEveryWeekDay() {
         if (this.freq != WEEKLY) {
             return false; 
@@ -405,17 +355,4 @@
         
         return true;
     }
-    
-    private String dayToString(Resources r, int day) {
-        switch (day) {
-        case SU: return r.getString(com.android.internal.R.string.day_of_week_long_sunday);
-        case MO: return r.getString(com.android.internal.R.string.day_of_week_long_monday);
-        case TU: return r.getString(com.android.internal.R.string.day_of_week_long_tuesday);
-        case WE: return r.getString(com.android.internal.R.string.day_of_week_long_wednesday);
-        case TH: return r.getString(com.android.internal.R.string.day_of_week_long_thursday);
-        case FR: return r.getString(com.android.internal.R.string.day_of_week_long_friday);
-        case SA: return r.getString(com.android.internal.R.string.day_of_week_long_saturday);
-        default: throw new IllegalArgumentException("bad day argument: " + day);
-        }
-    }
 }
diff --git a/core/java/android/provider/Browser.java b/core/java/android/provider/Browser.java
index f7c3148..f32fb5a 100644
--- a/core/java/android/provider/Browser.java
+++ b/core/java/android/provider/Browser.java
@@ -145,14 +145,6 @@
     }
 
     /**
-     * Stores a String extra in an {@link Intent} representing the title of a
-     * page to share.  When receiving an {@link Intent#ACTION_SEND} from the
-     * Browser, use this to access the title.
-     * @hide
-     */
-    public final static String EXTRA_SHARE_TITLE = "share_title";
-
-    /**
      * Stores a Bitmap extra in an {@link Intent} representing the screenshot of
      * a page to share.  When receiving an {@link Intent#ACTION_SEND} from the
      * Browser, use this to access the screenshot.
@@ -219,6 +211,57 @@
                 new String[] { BookmarkColumns.URL }, null, null, null);
     }
 
+    private static final void addOrUrlEquals(StringBuilder sb) {
+        sb.append(" OR " + BookmarkColumns.URL + " = ");
+    }
+
+    /**
+     *  Return a Cursor with all history/bookmarks that are similar to url,
+     *  where similar means 'http(s)://' and 'www.' are optional, but the rest
+     *  of the url is the same.
+     *  @param cr   The ContentResolver used to access the database.
+     *  @param url  The url to compare to.
+     *  @hide
+     */
+    public static final Cursor getVisitedLike(ContentResolver cr, String url) {
+        boolean secure = false;
+        String compareString = url;
+        if (compareString.startsWith("http://")) {
+            compareString = compareString.substring(7);
+        } else if (compareString.startsWith("https://")) {
+            compareString = compareString.substring(8);
+            secure = true;
+        }
+        if (compareString.startsWith("www.")) {
+            compareString = compareString.substring(4);
+        }
+        StringBuilder whereClause = null;
+        if (secure) {
+            whereClause = new StringBuilder(BookmarkColumns.URL + " = ");
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    "https://" + compareString);
+            addOrUrlEquals(whereClause);
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    "https://www." + compareString);
+        } else {
+            whereClause = new StringBuilder(BookmarkColumns.URL + " = ");
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    compareString);
+            addOrUrlEquals(whereClause);
+            String wwwString = "www." + compareString;
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    wwwString);
+            addOrUrlEquals(whereClause);
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    "http://" + compareString);
+            addOrUrlEquals(whereClause);
+            DatabaseUtils.appendEscapedSQLString(whereClause,
+                    "http://" + wwwString);
+        }
+        return cr.query(BOOKMARKS_URI, HISTORY_PROJECTION,
+                whereClause.toString(), null, null);
+    }
+
     /**
      *  Update the visited history to acknowledge that a site has been
      *  visited.
@@ -233,14 +276,7 @@
                                                   String url, boolean real) {
         long now = new Date().getTime();
         try {
-            StringBuilder sb = new StringBuilder(BookmarkColumns.URL + " = ");
-            DatabaseUtils.appendEscapedSQLString(sb, url);
-            Cursor c = cr.query(
-                    BOOKMARKS_URI,
-                    HISTORY_PROJECTION,
-                    sb.toString(),
-                    null,
-                    null);
+            Cursor c = getVisitedLike(cr, url);
             /* We should only get one answer that is exactly the same. */
             if (c.moveToFirst()) {
                 ContentValues map = new ContentValues();
diff --git a/core/java/android/provider/Calendar.java b/core/java/android/provider/Calendar.java
index c9dab60..509317d 100644
--- a/core/java/android/provider/Calendar.java
+++ b/core/java/android/provider/Calendar.java
@@ -168,10 +168,13 @@
         public static final String _SYNC_VERSION = "_sync_version";
 
         /**
-         * Used in temporary provider while syncing, always NULL for rows in persistent providers.
+         * For use by sync adapter at its discretion; not modified by CalendarProvider
+         * Note that this column was formerly named _SYNC_LOCAL_ID.  We are using it to avoid a
+         * schema change.
+         * TODO Replace this with something more general in the future.
          * <P>Type: INTEGER (long)</P>
          */
-        public static final String _SYNC_LOCAL_ID = "_sync_local_id";
+        public static final String _SYNC_DATA = "_sync_local_id";
 
         /**
          * Used only in persistent providers, and only during merging.
@@ -690,6 +693,7 @@
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, GUESTS_CAN_SEE_GUESTS);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, ORGANIZER);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_ID);
+                DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_DATA);
                 DatabaseUtils.cursorLongToContentValuesIfPresent(cursor, cv, _SYNC_DIRTY);
                 DatabaseUtils.cursorStringToContentValuesIfPresent(cursor, cv, _SYNC_VERSION);
                 DatabaseUtils.cursorIntToContentValuesIfPresent(cursor, cv, DELETED);
@@ -802,123 +806,6 @@
             return null;
         }
 
-        public static final Uri insertVEvent(ContentResolver cr,
-            ICalendar.Component event, long calendarId, int status,
-            ContentValues values) {
-
-            // TODO: define VEVENT component names as constants in some
-            // appropriate class (ICalendar.Component?).
-
-            values.clear();
-
-            // title
-            String title = extractValue(event, "SUMMARY");
-            if (TextUtils.isEmpty(title)) {
-                if (Config.LOGD) {
-                    Log.d(TAG, "No SUMMARY provided for event.  "
-                            + "Cannot import.");
-                }
-                return null;
-            }
-            values.put(TITLE, title);
-
-            // status
-            values.put(STATUS, status);
-
-            // description
-            String description = extractValue(event, "DESCRIPTION");
-            if (!TextUtils.isEmpty(description)) {
-                values.put(DESCRIPTION, description);
-            }
-
-            // where
-            String where = extractValue(event, "LOCATION");
-            if (!TextUtils.isEmpty(where)) {
-                values.put(EVENT_LOCATION, where);
-            }
-
-            // Calendar ID
-            values.put(CALENDAR_ID, calendarId);
-
-            boolean timesSet = false;
-
-            // TODO: deal with VALARMs
-
-            // dtstart & dtend
-            Time time = new Time(Time.TIMEZONE_UTC);
-            String dtstart = null;
-            String dtend = null;
-            String duration = null;
-            ICalendar.Property dtstartProp = event.getFirstProperty("DTSTART");
-            // TODO: handle "floating" timezone (no timezone specified).
-            if (dtstartProp != null) {
-                dtstart = dtstartProp.getValue();
-                if (!TextUtils.isEmpty(dtstart)) {
-                    ICalendar.Parameter tzidParam =
-                            dtstartProp.getFirstParameter("TZID");
-                    if (tzidParam != null && tzidParam.value != null) {
-                        time.clear(tzidParam.value);
-                    }
-                    try {
-                        time.parse(dtstart);
-                    } catch (Exception e) {
-                        if (Config.LOGD) {
-                            Log.d(TAG, "Cannot parse dtstart " + dtstart, e);
-                        }
-                        return null;
-                    }
-                    if (time.allDay) {
-                        values.put(ALL_DAY, 1);
-                    }
-                    values.put(DTSTART, time.toMillis(false /* use isDst */));
-                    values.put(EVENT_TIMEZONE, time.timezone);
-                }
-
-                ICalendar.Property dtendProp = event.getFirstProperty("DTEND");
-                if (dtendProp != null) {
-                    dtend = dtendProp.getValue();
-                    if (!TextUtils.isEmpty(dtend)) {
-                        // TODO: make sure the timezones are the same for
-                        // start, end.
-                        try {
-                            time.parse(dtend);
-                        } catch (Exception e) {
-                            if (Config.LOGD) {
-                                Log.d(TAG, "Cannot parse dtend " + dtend, e);
-                            }
-                            return null;
-                        }
-                        values.put(DTEND, time.toMillis(false /* use isDst */));
-                    }
-                } else {
-                    // look for a duration
-                    ICalendar.Property durationProp =
-                            event.getFirstProperty("DURATION");
-                    if (durationProp != null) {
-                        duration = durationProp.getValue();
-                        if (!TextUtils.isEmpty(duration)) {
-                            // TODO: check that it is valid?
-                            values.put(DURATION, duration);
-                        }
-                    }
-                }
-            }
-            if (TextUtils.isEmpty(dtstart) ||
-                    (TextUtils.isEmpty(dtend) && TextUtils.isEmpty(duration))) {
-                if (Config.LOGD) {
-                    Log.d(TAG, "No DTSTART or DTEND/DURATION defined.");
-                }
-                return null;
-            }
-
-            // rrule
-            if (!RecurrenceSet.populateContentValues(event, values)) {
-                return null;
-            }
-
-            return cr.insert(CONTENT_URI, values);
-        }
-
         /**
          * The content:// style URL for this table
          */
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 081cf32..18e2647 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1279,6 +1279,17 @@
             "notifications_use_ring_volume";
 
         /**
+         * Whether silent mode should allow vibration feedback. This is used
+         * internally in AudioService and the Sound settings activity to
+         * coordinate decoupling of vibrate and silent modes. This setting
+         * will likely be removed in a future release with support for
+         * audio/vibe feedback profiles.
+         *
+         * @hide
+         */
+        public static final String VIBRATE_IN_SILENT = "vibrate_in_silent";
+
+        /**
          * The mapping of stream type (integer) to its setting.
          */
         public static final String[] VOLUME_SETTINGS = {
diff --git a/core/java/android/provider/SyncConstValue.java b/core/java/android/provider/SyncConstValue.java
index 30966eb..2fcf315 100644
--- a/core/java/android/provider/SyncConstValue.java
+++ b/core/java/android/provider/SyncConstValue.java
@@ -18,6 +18,7 @@
 
 /**
  * Columns for tables that are synced to a server.
+ * @deprecated
  * @hide
  */
 public interface SyncConstValue
@@ -69,7 +70,7 @@
      * <P>Type: INTEGER (long)</P>
      */
     public static final String _SYNC_DIRTY = "_sync_dirty";
-    
+
     /**
      * Used to indicate that this account is not synced
      */
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index d96596295..0de1868 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -101,6 +101,12 @@
         public static final String READ = "read";
 
         /**
+         * Indicates whether this message has been seen by the user. The "seen" flag will be
+         * used to figure out whether we need to throw up a statusbar notification or not.
+         */
+        public static final String SEEN = "seen";
+
+        /**
          * The TP-Status value for the message, or -1 if no status has
          * been received
          */
@@ -646,6 +652,12 @@
         public static final String READ = "read";
 
         /**
+         * Indicates whether this message has been seen by the user. The "seen" flag will be
+         * used to figure out whether we need to throw up a statusbar notification or not.
+         */
+        public static final String SEEN = "seen";
+
+        /**
          * The Message-ID of the message.
          * <P>Type: TEXT</P>
          */
@@ -1097,6 +1109,7 @@
          * <P>Type: INTEGER</P>
          */
         public static final String READ = "read";
+
         /**
          * The snippet of the latest message in the thread.
          * <P>Type: TEXT</P>
diff --git a/core/java/android/speech/RecognizerIntent.java b/core/java/android/speech/RecognizerIntent.java
index bf411e1..d55a943 100644
--- a/core/java/android/speech/RecognizerIntent.java
+++ b/core/java/android/speech/RecognizerIntent.java
@@ -298,6 +298,15 @@
             "android.speech.action.GET_LANGUAGE_DETAILS";
     
     /**
+     * Specify this boolean extra in a broadcast of {@link #ACTION_GET_LANGUAGE_DETAILS} to
+     * indicate that only the current language preference is needed in the response. This
+     * avoids any additional computation if all you need is {@link #EXTRA_LANGUAGE_PREFERENCE}
+     * in the response.
+     */
+    public static final String EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE =
+            "android.speech.extra.ONLY_RETURN_LANGUAGE_PREFERENCE";
+    
+    /**
      * The key to the extra in the {@link Bundle} returned by {@link #ACTION_GET_LANGUAGE_DETAILS}
      * which is a {@link String} that represents the current language preference this user has
      * specified - a locale string like "en-US".
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 0db2198..9e04cf8 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -410,17 +410,17 @@
         mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID;
         mCachedParams[Engine.PARAM_POSITION_ENGINE] = Engine.KEY_PARAM_ENGINE;
 
-        mCachedParams[Engine.PARAM_POSITION_RATE + 1] =
-                String.valueOf(Engine.DEFAULT_RATE);
-        // initialize the language cached parameters with the current Locale
-        Locale defaultLoc = Locale.getDefault();
-        mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language();
-        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country();
-        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant();
+        // Leave all defaults that are shown in Settings uninitialized so that
+        // the values set in Settings will take effect if the application does
+        // not try to change these settings itself.
+        mCachedParams[Engine.PARAM_POSITION_RATE + 1] = "";
+        mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = "";
+        mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = "";
+        mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = "";
         mCachedParams[Engine.PARAM_POSITION_STREAM + 1] =
                 String.valueOf(Engine.DEFAULT_STREAM);
         mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = "";
-        mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = Engine.DEFAULT_SYNTH;
+        mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = "";
 
         initTts();
     }
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index afb22ac..9589bf3 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -1557,13 +1557,17 @@
      * @param reqModes The modes to be checked: may be any combination of
      * {@link #CAP_MODE_CHARACTERS}, {@link #CAP_MODE_WORDS}, and
      * {@link #CAP_MODE_SENTENCES}.
-     * 
+     *
      * @return Returns the actual capitalization modes that can be in effect
      * at the current position, which is any combination of
      * {@link #CAP_MODE_CHARACTERS}, {@link #CAP_MODE_WORDS}, and
      * {@link #CAP_MODE_SENTENCES}.
      */
     public static int getCapsMode(CharSequence cs, int off, int reqModes) {
+        if (off < 0) {
+            return 0;
+        }
+
         int i;
         char c;
         int mode = 0;
diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java
index 9dd8ceb..dde0889 100644
--- a/core/java/android/text/format/DateUtils.java
+++ b/core/java/android/text/format/DateUtils.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.pim.DateException;
 
 import java.util.Calendar;
 import java.util.Date;
@@ -814,35 +813,6 @@
                 && (thenMonth == time.month) 
                 && (thenMonthDay == time.monthDay);
     }
-    
-    /**
-     * @hide
-     * @deprecated use {@link android.text.format.Time}
-     */
-    private static final int ctoi(String str, int index)
-                                                throws DateException
-    {
-        char c = str.charAt(index);
-        if (c >= '0' && c <= '9') {
-            return (int)(c - '0');
-        }
-        throw new DateException("Expected numeric character.  Got '" +
-                                            c + "'");
-    }
-
-    /**
-     * @hide
-     * @deprecated use {@link android.text.format.Time}
-     */
-    private static final int check(int lowerBound, int upperBound, int value)
-                                                throws DateException
-    {
-        if (value >= lowerBound && value <= upperBound) {
-            return value;
-        }
-        throw new DateException("field out of bounds.  max=" + upperBound
-                                        + " value=" + value);
-    }
 
     /**
      * @hide
@@ -861,81 +831,6 @@
         return false;
     }
 
-
-    // note that month in Calendar is 0 based and in all other human
-    // representations, it's 1 based.
-    // Returns if the Z was present, meaning that the time is in UTC
-    /**
-     * @hide
-     * @deprecated use {@link android.text.format.Time}
-     */
-    public static boolean parseDateTime(String str, Calendar cal)
-                                                throws DateException
-    {
-        int len = str.length();
-        boolean dateTime = (len == 15 || len == 16) && str.charAt(8) == 'T';
-        boolean justDate = len == 8;
-        if (dateTime || justDate) {
-            cal.clear();
-            cal.set(Calendar.YEAR, 
-                            ctoi(str, 0)*1000 + ctoi(str, 1)*100
-                            + ctoi(str, 2)*10 + ctoi(str, 3));
-            cal.set(Calendar.MONTH,
-                            check(0, 11, ctoi(str, 4)*10 + ctoi(str, 5) - 1));
-            cal.set(Calendar.DAY_OF_MONTH,
-                            check(1, 31, ctoi(str, 6)*10 + ctoi(str, 7)));
-            if (dateTime) {
-                cal.set(Calendar.HOUR_OF_DAY,
-                            check(0, 23, ctoi(str, 9)*10 + ctoi(str, 10)));
-                cal.set(Calendar.MINUTE,
-                            check(0, 59, ctoi(str, 11)*10 + ctoi(str, 12)));
-                cal.set(Calendar.SECOND,
-                            check(0, 59, ctoi(str, 13)*10 + ctoi(str, 14)));
-            }
-            if (justDate) {
-                cal.set(Calendar.HOUR_OF_DAY, 0);
-                cal.set(Calendar.MINUTE, 0);
-                cal.set(Calendar.SECOND, 0);
-                return true;
-            }
-            if (len == 15) {
-                return false;
-            }
-            if (str.charAt(15) == 'Z') {
-                return true;
-            }
-        }
-        throw new DateException("Invalid time (expected "
-                                + "YYYYMMDDThhmmssZ? got '" + str + "').");
-    }
-
-    /**
-     * Given a timezone string which can be null, and a dateTime string,
-     * set that time into a calendar.
-     * @hide
-     * @deprecated use {@link android.text.format.Time}
-     */
-    public static void parseDateTime(String tz, String dateTime, Calendar out)
-                                                throws DateException
-    {
-        TimeZone timezone;
-        if (DateUtils.isUTC(dateTime)) {
-            timezone = TimeZone.getTimeZone("UTC");
-        }
-        else if (tz == null) {
-            timezone = TimeZone.getDefault();
-        }
-        else {
-            timezone = TimeZone.getTimeZone(tz);
-        }
-
-        Calendar local = new GregorianCalendar(timezone);
-        DateUtils.parseDateTime(dateTime, local);
-
-        out.setTimeInMillis(local.getTimeInMillis());
-    }
-
-
     /**
      * Return a string containing the date and time in RFC2445 format.
      * Ensures that the time is written in UTC.  The Calendar class doesn't
diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java
index 75b1b90..e111669 100644
--- a/core/java/android/util/Log.java
+++ b/core/java/android/util/Log.java
@@ -98,7 +98,7 @@
      * @param msg The message you would like logged.
      */
     public static int v(String tag, String msg) {
-        return println(VERBOSE, tag, msg);
+        return println_native(LOG_ID_MAIN, VERBOSE, tag, msg);
     }
 
     /**
@@ -109,7 +109,7 @@
      * @param tr An exception to log
      */
     public static int v(String tag, String msg, Throwable tr) {
-        return println(VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
     }
 
     /**
@@ -119,7 +119,7 @@
      * @param msg The message you would like logged.
      */
     public static int d(String tag, String msg) {
-        return println(DEBUG, tag, msg);
+        return println_native(LOG_ID_MAIN, DEBUG, tag, msg);
     }
 
     /**
@@ -130,7 +130,7 @@
      * @param tr An exception to log
      */
     public static int d(String tag, String msg, Throwable tr) {
-        return println(DEBUG, tag, msg + '\n' + getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, DEBUG, tag, msg + '\n' + getStackTraceString(tr));
     }
 
     /**
@@ -140,7 +140,7 @@
      * @param msg The message you would like logged.
      */
     public static int i(String tag, String msg) {
-        return println(INFO, tag, msg);
+        return println_native(LOG_ID_MAIN, INFO, tag, msg);
     }
 
     /**
@@ -151,7 +151,7 @@
      * @param tr An exception to log
      */
     public static int i(String tag, String msg, Throwable tr) {
-        return println(INFO, tag, msg + '\n' + getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, INFO, tag, msg + '\n' + getStackTraceString(tr));
     }
 
     /**
@@ -161,7 +161,7 @@
      * @param msg The message you would like logged.
      */
     public static int w(String tag, String msg) {
-        return println(WARN, tag, msg);
+        return println_native(LOG_ID_MAIN, WARN, tag, msg);
     }
 
     /**
@@ -172,7 +172,7 @@
      * @param tr An exception to log
      */
     public static int w(String tag, String msg, Throwable tr) {
-        return println(WARN, tag, msg + '\n' + getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, WARN, tag, msg + '\n' + getStackTraceString(tr));
     }
 
     /**
@@ -202,7 +202,7 @@
      * @param tr An exception to log
      */
     public static int w(String tag, Throwable tr) {
-        return println(WARN, tag, getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, WARN, tag, getStackTraceString(tr));
     }
 
     /**
@@ -212,7 +212,7 @@
      * @param msg The message you would like logged.
      */
     public static int e(String tag, String msg) {
-        return println(ERROR, tag, msg);
+        return println_native(LOG_ID_MAIN, ERROR, tag, msg);
     }
 
     /**
@@ -223,7 +223,7 @@
      * @param tr An exception to log
      */
     public static int e(String tag, String msg, Throwable tr) {
-        return println(ERROR, tag, msg + '\n' + getStackTraceString(tr));
+        return println_native(LOG_ID_MAIN, ERROR, tag, msg + '\n' + getStackTraceString(tr));
     }
 
     /**
@@ -258,7 +258,7 @@
      */
     public static int wtf(String tag, String msg, Throwable tr) {
         tr = new TerribleFailure(msg, tr);
-        int bytes = println(ASSERT, tag, getStackTraceString(tr));
+        int bytes = println_native(LOG_ID_MAIN, ASSERT, tag, getStackTraceString(tr));
         RuntimeInit.wtf(tag, tr);
         return bytes;
     }
@@ -285,5 +285,15 @@
      * @param msg The message you would like logged.
      * @return The number of bytes written.
      */
-    public static native int println(int priority, String tag, String msg);
+    public static int println(int priority, String tag, String msg) {
+        return println_native(LOG_ID_MAIN, priority, tag, msg);
+    }
+
+    /** @hide */ public static final int LOG_ID_MAIN = 0;
+    /** @hide */ public static final int LOG_ID_RADIO = 1;
+    /** @hide */ public static final int LOG_ID_EVENTS = 2;
+    /** @hide */ public static final int LOG_ID_SYSTEM = 3;
+
+    /** @hide */ public static native int println_native(int bufID,
+            int priority, String tag, String msg);
 }
diff --git a/core/java/android/util/LogPrinter.java b/core/java/android/util/LogPrinter.java
index 643b8d3..68f64d0 100644
--- a/core/java/android/util/LogPrinter.java
+++ b/core/java/android/util/LogPrinter.java
@@ -23,6 +23,7 @@
 public class LogPrinter implements Printer {
     private final int mPriority;
     private final String mTag;
+    private final int mBuffer;
     
     /**
      * Create a new Printer that sends to the log with the given priority
@@ -39,9 +40,20 @@
     public LogPrinter(int priority, String tag) {
         mPriority = priority;
         mTag = tag;
+        mBuffer = Log.LOG_ID_MAIN;
+    }
+
+    /**
+     * @hide
+     * Same as above, but buffer is one of the LOG_ID_ constants from android.util.Log.
+     */
+    public LogPrinter(int priority, String tag, int buffer) {
+        mPriority = priority;
+        mTag = tag;
+        mBuffer = buffer;
     }
     
     public void println(String x) {
-        Log.println(mPriority, mTag, x);
+        Log.println_native(mBuffer, mPriority, mTag, x);
     }
 }
diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java
new file mode 100644
index 0000000..ecf5ea1
--- /dev/null
+++ b/core/java/android/util/Slog.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2006 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.util;
+
+import com.android.internal.os.RuntimeInit;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * @hide
+ */
+public final class Slog {
+
+    private Slog() {
+    }
+
+    public static int v(String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag, msg);
+    }
+
+    public static int v(String tag, String msg, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.VERBOSE, tag,
+                msg + '\n' + Log.getStackTraceString(tr));
+    }
+
+    public static int d(String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.DEBUG, tag, msg);
+    }
+
+    public static int d(String tag, String msg, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.DEBUG, tag,
+                msg + '\n' + Log.getStackTraceString(tr));
+    }
+
+    public static int i(String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.INFO, tag, msg);
+    }
+
+    public static int i(String tag, String msg, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.INFO, tag,
+                msg + '\n' + Log.getStackTraceString(tr));
+    }
+
+    public static int w(String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag, msg);
+    }
+
+    public static int w(String tag, String msg, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag,
+                msg + '\n' + Log.getStackTraceString(tr));
+    }
+
+    public static int w(String tag, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.WARN, tag, Log.getStackTraceString(tr));
+    }
+
+    public static int e(String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.ERROR, tag, msg);
+    }
+
+    public static int e(String tag, String msg, Throwable tr) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, Log.ERROR, tag,
+                msg + '\n' + Log.getStackTraceString(tr));
+    }
+
+    public static int println(int priority, String tag, String msg) {
+        return Log.println_native(Log.LOG_ID_SYSTEM, priority, tag, msg);
+    }
+}
+
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index b055d51..fabe5c8 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -45,41 +45,76 @@
     }
     
     /**
-     * @return index of this display.
+     * Returns the index of this display.  This is currently undefined; do
+     * not use.
      */
     public int getDisplayId() {
         return mDisplay;
     }
 
     /**
-     * @return the number of displays connected to the device.
+     * Returns the number of displays connected to the device.  This is
+     * currently undefined; do not use.
      */
     native static int getDisplayCount();
     
     /**
-     * @return width of this display in pixels.
+     * Returns the raw width of the display, in pixels.  Note that this
+     * should <em>not</em> generally be used for computing layouts, since
+     * a device will typically have screen decoration (such as a status bar)
+     * along the edges of the display that reduce the amount of application
+     * space available from the raw size returned here.  This value is
+     * adjusted for you based on the current rotation of the display.
      */
     native public int getWidth();
     
     /**
-     * @return height of this display in pixels.
+     * Returns the raw height of the display, in pixels.  Note that this
+     * should <em>not</em> generally be used for computing layouts, since
+     * a device will typically have screen decoration (such as a status bar)
+     * along the edges of the display that reduce the amount of application
+     * space available from the raw size returned here.  This value is
+     * adjusted for you based on the current rotation of the display.
      */
     native public int getHeight();
 
     /**
+     * Returns the rotation of the screen from its "natural" orientation.
+     * The returned value may be {@link Surface#ROTATION_0 Surface.ROTATION_0}
+     * (no rotation), {@link Surface#ROTATION_90 Surface.ROTATION_90},
+     * {@link Surface#ROTATION_180 Surface.ROTATION_180}, or
+     * {@link Surface#ROTATION_270 Surface.ROTATION_270}.  For
+     * example, if a device has a naturally tall screen, and the user has
+     * turned it on its side to go into a landscape orientation, the value
+     * returned here may be either {@link Surface#ROTATION_90 Surface.ROTATION_90}
+     * or {@link Surface#ROTATION_270 Surface.ROTATION_270} depending on
+     * the direction it was turned.  The angle is the rotation of the drawn
+     * graphics on the screen, which is the opposite direction of the physical
+     * rotation of the device.  For example, if the device is rotated 90
+     * degrees counter-clockwise, to compensate rendering will be rotated by
+     * 90 degrees clockwise and thus the returned value here will be
+     * {@link Surface#ROTATION_90 Surface.ROTATION_90}.
+     */
+    public int getRotation() {
+        return getOrientation();
+    }
+    
+    /**
+     * @deprecated use {@link #getRotation}
      * @return orientation of this display.
      */
-    native public int getOrientation();
+    @Deprecated native public int getOrientation();
 
     /**
-     * @return pixel format of this display.
+     * Return the native pixel format of the display.  The returned value
+     * may be one of the constants int {@link android.graphics.PixelFormat}.
      */
     public int getPixelFormat() {
         return mPixelFormat;
     }
     
     /**
-     * @return refresh rate of this display in frames per second.
+     * Return the refresh rate of this display in frames per second.
      */
     public float getRefreshRate() {
         return mRefreshRate;
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index b85667b..183fce3 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -182,7 +182,18 @@
             int pid, int display, int w, int h, int format, int flags)
         throws OutOfResourcesException {
         mCanvas = new CompatibleCanvas();
-        init(s,pid,display,w,h,format,flags);
+        init(s,pid,null,display,w,h,format,flags);
+    }
+
+    /**
+     * create a surface with a name
+     * {@hide}
+     */
+    public Surface(SurfaceSession s,
+            int pid, String name, int display, int w, int h, int format, int flags)
+        throws OutOfResourcesException {
+        mCanvas = new CompatibleCanvas();
+        init(s,pid,name,display,w,h,format,flags);
     }
 
     /**
@@ -400,7 +411,7 @@
     }
     
     private native void init(SurfaceSession s,
-            int pid, int display, int w, int h, int format, int flags)
+            int pid, String name, int display, int w, int h, int format, int flags)
             throws OutOfResourcesException;
 
     private native void init(Parcel source);
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index d7f2539..0722699 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -320,8 +320,14 @@
      * <p>Calling this overrides any previous call to {@link #setZOrderMediaOverlay}.
      */
     public void setZOrderOnTop(boolean onTop) {
-        mWindowType = onTop ? WindowManager.LayoutParams.TYPE_APPLICATION_PANEL
-                : WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+        if (onTop) {
+            mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
+            // ensures the surface is placed below the IME
+            mLayout.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+        } else {
+            mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
+            mLayout.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
+        }
     }
     
     /**
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 03b569d..abbab0e 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1507,6 +1507,13 @@
     private static final int PREPRESSED             = 0x02000000;
     
     /**
+     * Indicates whether the view is temporarily detached.
+     *
+     * @hide
+     */
+    static final int CANCEL_NEXT_UP_EVENT = 0x04000000;
+    
+    /**
      * Always allow a user to overscroll this view, provided it is a
      * view that can scroll.
      */
@@ -2276,7 +2283,7 @@
             scrollabilityCache.scrollBar = new ScrollBarDrawable();
         }
         
-        final boolean fadeScrollbars = a.getBoolean(R.styleable.View_fadeScrollbars, false);
+        final boolean fadeScrollbars = a.getBoolean(R.styleable.View_fadeScrollbars, true);
 
         if (!fadeScrollbars) {
             scrollabilityCache.state = ScrollabilityCache.ON;
@@ -3668,6 +3675,7 @@
      */
     public void onStartTemporaryDetach() {
         removeUnsetPressCallback();
+        mPrivateFlags |= CANCEL_NEXT_UP_EVENT;
     }
 
     /**
@@ -5913,6 +5921,7 @@
      * @see #onAttachedToWindow()
      */
     protected void onDetachedFromWindow() {
+        mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
         removeUnsetPressCallback();
         removeLongPressCallback();
         destroyDrawingCache();
@@ -6484,7 +6493,7 @@
      * Create a snapshot of the view into a bitmap.  We should probably make
      * some form of this public, but should think about the API.
      */
-    Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor) {
+    Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {
         int width = mRight - mLeft;
         int height = mBottom - mTop;
 
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 616485e..8311bdc 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -23,9 +23,12 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Rect;
 import android.os.Environment;
 import android.os.Debug;
+import android.os.RemoteException;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.BufferedWriter;
 import java.io.FileWriter;
@@ -345,6 +348,7 @@
     private static final String REMOTE_COMMAND_INVALIDATE = "INVALIDATE";
     private static final String REMOTE_COMMAND_REQUEST_LAYOUT = "REQUEST_LAYOUT";
     private static final String REMOTE_PROFILE = "PROFILE";
+    private static final String REMOTE_COMMAND_CAPTURE_LAYERS = "CAPTURE_LAYERS";
 
     private static HashMap<Class<?>, Field[]> sFieldsForClasses;
     private static HashMap<Class<?>, Method[]> sMethodsForClasses;
@@ -846,6 +850,8 @@
 
         if (REMOTE_COMMAND_DUMP.equalsIgnoreCase(command)) {
             dump(view, clientStream);
+        } else if (REMOTE_COMMAND_CAPTURE_LAYERS.equalsIgnoreCase(command)) {
+            captureLayers(view, new DataOutputStream(clientStream));
         } else {
             final String[] params = parameters.split(" ");
             if (REMOTE_COMMAND_CAPTURE.equalsIgnoreCase(command)) {
@@ -1017,24 +1023,109 @@
         return duration[0];
     }
 
+    private static void captureLayers(View root, final DataOutputStream clientStream)
+            throws IOException {
+
+        try {
+            Rect outRect = new Rect();
+            try {
+                root.mAttachInfo.mSession.getDisplayFrame(root.mAttachInfo.mWindow, outRect);
+            } catch (RemoteException e) {
+                // Ignore
+            }
+    
+            clientStream.writeInt(outRect.width());
+            clientStream.writeInt(outRect.height());
+    
+            captureViewLayer(root, clientStream);
+            
+            clientStream.write(2);
+        } finally {
+            clientStream.close();
+        }
+    }
+
+    private static void captureViewLayer(View view, DataOutputStream clientStream)
+            throws IOException {
+
+        if ((view.mPrivateFlags & View.SKIP_DRAW) != View.SKIP_DRAW) {
+            final int id = view.getId();
+            String name = view.getClass().getSimpleName();
+            if (id != View.NO_ID) {
+                name = resolveId(view.getContext(), id).toString();
+            }
+    
+            clientStream.write(1);
+            clientStream.writeUTF(name);
+            clientStream.writeByte(view.getVisibility() == View.VISIBLE ? 1 : 0);
+    
+            int[] position = new int[2];
+            // XXX: Should happen on the UI thread
+            view.getLocationInWindow(position);
+    
+            clientStream.writeInt(position[0]);
+            clientStream.writeInt(position[1]);
+            clientStream.flush();
+    
+            Bitmap b = performViewCapture(view, true);
+            if (b != null) {
+                ByteArrayOutputStream arrayOut = new ByteArrayOutputStream(b.getWidth() *
+                        b.getHeight() * 2);
+                b.compress(Bitmap.CompressFormat.PNG, 100, arrayOut);
+                clientStream.writeInt(arrayOut.size());
+                arrayOut.writeTo(clientStream);
+            }
+            clientStream.flush();
+        }
+
+        if (view instanceof ViewGroup) {
+            ViewGroup group = (ViewGroup) view;
+            int count = group.getChildCount();
+
+            for (int i = 0; i < count; i++) {
+                captureViewLayer(group.getChildAt(i), clientStream);
+            }
+        }
+    }
+
     private static void capture(View root, final OutputStream clientStream, String parameter)
             throws IOException {
 
         final View captureView = findView(root, parameter);
+        Bitmap b = performViewCapture(captureView, false);
+       
+        if (b != null) {
+            BufferedOutputStream out = null;
+            try {
+                out = new BufferedOutputStream(clientStream, 32 * 1024);
+                b.compress(Bitmap.CompressFormat.PNG, 100, out);
+                out.flush();
+            } finally {
+                if (out != null) {
+                    out.close();
+                }
+                b.recycle();
+            }
+        } else {
+            Log.w("View", "Failed to create capture bitmap!");
+            clientStream.close();
+        }
+    }
 
+    private static Bitmap performViewCapture(final View captureView, final boolean skpiChildren) {
         if (captureView != null) {
             final CountDownLatch latch = new CountDownLatch(1);
             final Bitmap[] cache = new Bitmap[1];
 
-            root.post(new Runnable() {
+            captureView.post(new Runnable() {
                 public void run() {
                     try {
                         cache[0] = captureView.createSnapshot(
-                                Bitmap.Config.ARGB_8888, 0);
+                                Bitmap.Config.ARGB_8888, 0, skpiChildren);
                     } catch (OutOfMemoryError e) {
                         try {
                             cache[0] = captureView.createSnapshot(
-                                    Bitmap.Config.ARGB_4444, 0);
+                                    Bitmap.Config.ARGB_4444, 0, skpiChildren);
                         } catch (OutOfMemoryError e2) {
                             Log.w("View", "Out of memory for bitmap");
                         }
@@ -1046,28 +1137,14 @@
 
             try {
                 latch.await(CAPTURE_TIMEOUT, TimeUnit.MILLISECONDS);
-
-                if (cache[0] != null) {
-                    BufferedOutputStream out = null;
-                    try {
-                        out = new BufferedOutputStream(clientStream, 32 * 1024);
-                        cache[0].compress(Bitmap.CompressFormat.PNG, 100, out);
-                        out.flush();
-                    } finally {
-                        if (out != null) {
-                            out.close();
-                        }
-                        cache[0].recycle();
-                    }
-                } else {
-                    Log.w("View", "Failed to create capture bitmap!");
-                    clientStream.close();
-                }
+                return cache[0];
             } catch (InterruptedException e) {
                 Log.w("View", "Could not complete the capture of the view " + captureView);
                 Thread.currentThread().interrupt();
             }
         }
+        
+        return null;
     }
 
     private static void dump(View root, OutputStream clientStream) throws IOException {
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index d05416d..597d583 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -859,6 +859,7 @@
                             final float xc = scrolledXFloat - child.mLeft;
                             final float yc = scrolledYFloat - child.mTop;
                             ev.setLocation(xc, yc);
+                            child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
                             if (child.dispatchTouchEvent(ev))  {
                                 // Event handled, we have a target now.
                                 mMotionTarget = child;
@@ -889,6 +890,10 @@
             // We don't have a target, this means we're handling the
             // event as a regular view.
             ev.setLocation(xf, yf);
+            if ((mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) {
+                ev.setAction(MotionEvent.ACTION_CANCEL);
+                mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
+            }
             return super.dispatchTouchEvent(ev);
         }
 
@@ -897,6 +902,7 @@
         if (!disallowIntercept && onInterceptTouchEvent(ev)) {
             final float xc = scrolledXFloat - (float) target.mLeft;
             final float yc = scrolledYFloat - (float) target.mTop;
+            mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
             ev.setAction(MotionEvent.ACTION_CANCEL);
             ev.setLocation(xc, yc);
             if (!target.dispatchTouchEvent(ev)) {
@@ -921,6 +927,12 @@
         final float yc = scrolledYFloat - (float) target.mTop;
         ev.setLocation(xc, yc);
 
+        if ((target.mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) {
+            ev.setAction(MotionEvent.ACTION_CANCEL);
+            target.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
+            mMotionTarget = null;
+        }
+
         return target.dispatchTouchEvent(ev);
     }
 
@@ -1260,6 +1272,19 @@
         }
     }
 
+    @Override
+    Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {
+        int oldCount = mChildrenCount;
+        if (skipChildren) {
+            mChildrenCount = 0;
+        }
+
+        Bitmap b = super.createSnapshot(quality, backgroundColor, skipChildren);
+        mChildrenCount = oldCount;
+
+        return b;
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 3f1672a..1c0d55f 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -407,7 +407,8 @@
                         }
                     }
                 }
-                CacheManager.trimCacheIfNeeded();
+                WebViewWorker.getHandler().sendEmptyMessage(
+                        WebViewWorker.MSG_TRIM_CACHE);
                 break;
             }
 
diff --git a/core/java/android/webkit/CacheManager.java b/core/java/android/webkit/CacheManager.java
index 647556b..1c59c10 100644
--- a/core/java/android/webkit/CacheManager.java
+++ b/core/java/android/webkit/CacheManager.java
@@ -25,10 +25,11 @@
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 
@@ -200,9 +201,9 @@
             // the cache database. The directory could be recreated
             // because the system flushed all the data/cache directories
             // to free up disk space.
-            WebViewCore.endCacheTransaction();
-            mDataBase.clearCache();
-            WebViewCore.startCacheTransaction();
+            // delete rows in the cache database
+            WebViewWorker.getHandler().sendEmptyMessage(
+                    WebViewWorker.MSG_CLEAR_CACHE);
             return true;
         }
         return false;
@@ -223,7 +224,6 @@
      * 
      * @param disabled true to disable the cache
      */
-    // only called from WebCore thread
     static void setCacheDisabled(boolean disabled) {
         if (disabled == mDisabled) {
             return;
@@ -243,7 +243,7 @@
         return mDisabled;
     }
 
-    // only called from WebCore thread
+    // only called from WebViewWorkerThread
     // make sure to call enableTransaction/disableTransaction in pair
     static boolean enableTransaction() {
         if (++mRefCount == 1) {
@@ -253,12 +253,9 @@
         return false;
     }
 
-    // only called from WebCore thread
+    // only called from WebViewWorkerThread
     // make sure to call enableTransaction/disableTransaction in pair
     static boolean disableTransaction() {
-        if (mRefCount == 0) {
-            Log.e(LOGTAG, "disableTransaction is out of sync");
-        }
         if (--mRefCount == 0) {
             mDataBase.endCacheTransaction();
             return true;
@@ -266,15 +263,15 @@
         return false;
     }
 
-    // only called from WebCore thread
-    // make sure to call startCacheTransaction/endCacheTransaction in pair
-    public static boolean startCacheTransaction() {
+    // only called from WebViewWorkerThread
+    // make sure to call startTransaction/endTransaction in pair
+    static boolean startTransaction() {
         return mDataBase.startCacheTransaction();
     }
 
-    // only called from WebCore thread
-    // make sure to call startCacheTransaction/endCacheTransaction in pair
-    public static boolean endCacheTransaction() {
+    // only called from WebViewWorkerThread
+    // make sure to call startTransaction/endTransaction in pair
+    static boolean endTransaction() {
         boolean ret = mDataBase.endCacheTransaction();
         if (++mTrimCacheCount >= TRIM_CACHE_INTERVAL) {
             mTrimCacheCount = 0;
@@ -283,6 +280,26 @@
         return ret;
     }
 
+    // only called from WebCore Thread
+    // make sure to call startCacheTransaction/endCacheTransaction in pair
+    /**
+     * @deprecated
+     */
+    @Deprecated
+    public static boolean startCacheTransaction() {
+        return false;
+    }
+
+    // only called from WebCore Thread
+    // make sure to call startCacheTransaction/endCacheTransaction in pair
+    /**
+     * @deprecated
+     */
+    @Deprecated
+    public static boolean endCacheTransaction() {
+        return false;
+    }
+
     /**
      * Given a url, returns the CacheResult if exists. Otherwise returns null.
      * If headers are provided and a cache needs validation,
@@ -291,13 +308,11 @@
      * 
      * @return the CacheResult for a given url
      */
-    // only called from WebCore thread
     public static CacheResult getCacheFile(String url,
             Map<String, String> headers) {
         return getCacheFile(url, 0, headers);
     }
 
-    // only called from WebCore thread
     static CacheResult getCacheFile(String url, long postIdentifier,
             Map<String, String> headers) {
         if (mDisabled) {
@@ -368,14 +383,12 @@
      * @hide - hide createCacheFile since it has a parameter of type headers, which is
      * in a hidden package.
      */
-    // only called from WebCore thread
     public static CacheResult createCacheFile(String url, int statusCode,
             Headers headers, String mimeType, boolean forceCache) {
         return createCacheFile(url, statusCode, headers, mimeType, 0,
                 forceCache);
     }
 
-    // only called from WebCore thread
     static CacheResult createCacheFile(String url, int statusCode,
             Headers headers, String mimeType, long postIdentifier,
             boolean forceCache) {
@@ -435,12 +448,10 @@
      * Save the info of a cache file for a given url to the CacheMap so that it
      * can be reused later
      */
-    // only called from WebCore thread
     public static void saveCacheFile(String url, CacheResult cacheRet) {
         saveCacheFile(url, 0, cacheRet);
     }
 
-    // only called from WebCore thread
     static void saveCacheFile(String url, long postIdentifier,
             CacheResult cacheRet) {
         try {
@@ -489,7 +500,6 @@
      * 
      * @return true if it succeeds
      */
-    // only called from WebCore thread
     static boolean removeAllCacheFiles() {
         // Note, this is called before init() when the database is
         // created or upgraded.
@@ -499,7 +509,10 @@
             mClearCacheOnInit = true;
             return true;
         }
-        // delete cache in a separate thread to not block UI.
+        // delete rows in the cache database
+        WebViewWorker.getHandler().sendEmptyMessage(
+                WebViewWorker.MSG_CLEAR_CACHE);
+        // delete cache files in a separate thread to not block UI.
         final Runnable clearCache = new Runnable() {
             public void run() {
                 // delete all cache files
@@ -517,8 +530,6 @@
                 } catch (SecurityException e) {
                     // Ignore SecurityExceptions.
                 }
-                // delete database
-                mDataBase.clearCache();
             }
         };
         new Thread(clearCache).start();
@@ -528,15 +539,13 @@
     /**
      * Return true if the cache is empty.
      */
-    // only called from WebCore thread
     static boolean cacheEmpty() {
         return mDataBase.hasCache();
     }
 
-    // only called from WebCore thread
     static void trimCacheIfNeeded() {
         if (mDataBase.getCacheTotalSize() > CACHE_THRESHOLD) {
-            ArrayList<String> pathList = mDataBase.trimCache(CACHE_TRIM_AMOUNT);
+            List<String> pathList = mDataBase.trimCache(CACHE_TRIM_AMOUNT);
             int size = pathList.size();
             for (int i = 0; i < size; i++) {
                 File f = new File(mBaseDir, pathList.get(i));
@@ -544,9 +553,34 @@
                     Log.e(LOGTAG, f.getPath() + " delete failed.");
                 }
             }
+            // remove the unreferenced files in the cache directory
+            final List<String> fileList = mDataBase.getAllCacheFileNames();
+            if (fileList == null) return;
+            String[] toDelete = mBaseDir.list(new FilenameFilter() {
+                public boolean accept(File dir, String filename) {
+                    if (fileList.contains(filename)) {
+                        return false;
+                    } else {
+                        return true;
+                    }
+                }
+            });
+            if (toDelete == null) return;
+            size = toDelete.length;
+            for (int i = 0; i < size; i++) {
+                File f = new File(mBaseDir, toDelete[i]);
+                if (!f.delete()) {
+                    Log.e(LOGTAG, f.getPath() + " delete failed.");
+                }
+            }
         }
     }
 
+    static void clearCache() {
+        // delete database
+        mDataBase.clearCache();
+    }
+
     private static boolean checkCacheRedirect(int statusCode) {
         if (statusCode == 301 || statusCode == 302 || statusCode == 307) {
             // as 303 can't be cached, we do not return true
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 61a2d2ef..a013a9b 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -69,6 +69,8 @@
     private volatile int mLatestProgress = 100;
     // Back/Forward list
     private final WebBackForwardList mBackForwardList;
+    // Back/Forward list client
+    private volatile WebBackForwardListClient mWebBackForwardListClient;
     // Used to call startActivity during url override.
     private final Context mContext;
 
@@ -107,6 +109,8 @@
     private static final int RECEIVED_TOUCH_ICON_URL             = 132;
     private static final int GET_VISITED_HISTORY                 = 133;
     private static final int OPEN_FILE_CHOOSER                   = 134;
+    private static final int ADD_HISTORY_ITEM                    = 135;
+    private static final int HISTORY_INDEX_CHANGED               = 136;
 
     // Message triggered by the client to resume execution
     private static final int NOTIFY                              = 200;
@@ -137,7 +141,7 @@
         // Used to start a default activity.
         mContext = context;
         mWebView = w;
-        mBackForwardList = new WebBackForwardList();
+        mBackForwardList = new WebBackForwardList(this);
     }
 
     /**
@@ -190,6 +194,14 @@
         return mBackForwardList;
     }
 
+    void setWebBackForwardListClient(WebBackForwardListClient client) {
+        mWebBackForwardListClient = client;
+    }
+
+    WebBackForwardListClient getWebBackForwardListClient() {
+        return mWebBackForwardListClient;
+    }
+
     /**
      * Called by the UI side.  Calling overrideUrlLoading from the WebCore
      * side will post a message to call this method.
@@ -700,6 +712,20 @@
                     mWebChromeClient.openFileChooser((UploadFile) msg.obj);
                 }
                 break;
+
+            case ADD_HISTORY_ITEM:
+                if (mWebBackForwardListClient != null) {
+                    mWebBackForwardListClient.onNewHistoryItem(
+                            (WebHistoryItem) msg.obj);
+                }
+                break;
+
+            case HISTORY_INDEX_CHANGED:
+                if (mWebBackForwardListClient != null) {
+                    mWebBackForwardListClient.onIndexChanged(
+                            (WebHistoryItem) msg.obj, msg.arg1);
+                }
+                break;
         }
     }
 
@@ -1400,4 +1426,20 @@
         }
         return uploadFile.getResult();
     }
+
+    void onNewHistoryItem(WebHistoryItem item) {
+        if (mWebBackForwardListClient == null) {
+            return;
+        }
+        Message msg = obtainMessage(ADD_HISTORY_ITEM, item);
+        sendMessage(msg);
+    }
+
+    void onIndexChanged(WebHistoryItem item, int index) {
+        if (mWebBackForwardListClient == null) {
+            return;
+        }
+        Message msg = obtainMessage(HISTORY_INDEX_CHANGED, index, 0, item);
+        sendMessage(msg);
+    }
 }
diff --git a/core/java/android/webkit/FrameLoader.java b/core/java/android/webkit/FrameLoader.java
index b13c405..dacb33f 100644
--- a/core/java/android/webkit/FrameLoader.java
+++ b/core/java/android/webkit/FrameLoader.java
@@ -110,7 +110,13 @@
                 return false;
             }
             mNetwork = Network.getInstance(mListener.getContext());
-            return handleHTTPLoad();
+            if (mListener.isSynchronous()) {
+                handleHTTPLoad();
+            } else {
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_ADD_HTTPLOADER, this).sendToTarget();
+            }
+            return true;
         } else if (handleLocalFile(url, mListener, mSettings)) {
             return true;
         }
@@ -142,24 +148,33 @@
         }
         if (URLUtil.isAssetUrl(url)) {
             // load asset in a separate thread as it involves IO
-            new FileLoader(url, loadListener, FileLoader.TYPE_ASSET, true)
-                    .enqueue();
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_ADD_STREAMLOADER,
+                    new FileLoader(url, loadListener, FileLoader.TYPE_ASSET,
+                            true)).sendToTarget();
             return true;
         } else if (URLUtil.isResourceUrl(url)) {
             // load resource in a separate thread as it involves IO
-            new FileLoader(url, loadListener, FileLoader.TYPE_RES, true)
-                    .enqueue();
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_ADD_STREAMLOADER,
+                    new FileLoader(url, loadListener, FileLoader.TYPE_RES,
+                            true)).sendToTarget();
             return true;
         } else if (URLUtil.isFileUrl(url)) {
             // load file in a separate thread as it involves IO
-            new FileLoader(url, loadListener, FileLoader.TYPE_FILE, settings
-                    .getAllowFileAccess()).enqueue();
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_ADD_STREAMLOADER,
+                    new FileLoader(url, loadListener, FileLoader.TYPE_FILE,
+                            settings.getAllowFileAccess())).sendToTarget();
             return true;
         } else if (URLUtil.isContentUrl(url)) {
             // Send the raw url to the ContentLoader because it will do a
             // permission check and the url has to match.
             // load content in a separate thread as it involves IO
-            new ContentLoader(loadListener.url(), loadListener).enqueue();
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_ADD_STREAMLOADER,
+                    new ContentLoader(loadListener.url(), loadListener))
+                    .sendToTarget();
             return true;
         } else if (URLUtil.isDataUrl(url)) {
             // load data in the current thread to reduce the latency
@@ -172,8 +187,8 @@
         }
         return false;
     }
-    
-    private boolean handleHTTPLoad() {
+
+    boolean handleHTTPLoad() {
         if (mHeaders == null) {
             mHeaders = new HashMap<String, String>();
         }
@@ -229,7 +244,9 @@
         CacheLoader cacheLoader =
                 new CacheLoader(mListener, result);
         mListener.setCacheLoader(cacheLoader);
-        cacheLoader.load();
+        // Load the cached file in a separate thread
+        WebViewWorker.getHandler().obtainMessage(
+                WebViewWorker.MSG_ADD_STREAMLOADER, cacheLoader).sendToTarget();
     }
 
     /*
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index 85f1d5c..42e1539 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -131,6 +131,7 @@
                     mTimer = null;
                     mCurrentProxy.playbackEnded();
                     mCurrentProxy = null;
+                    mVideoView.stopPlayback();
                     mLayout.removeView(mVideoView);
                     mVideoView = null;
                     if (mProgressView != null) {
@@ -218,11 +219,10 @@
         }
 
         public static void onPrepared() {
-            mTimer.schedule(new TimeupdateTask(mCurrentProxy), TIMEUPDATE_PERIOD, TIMEUPDATE_PERIOD);
-
             if (mProgressView == null || mLayout == null) {
                 return;
             }
+            mTimer.schedule(new TimeupdateTask(mCurrentProxy), TIMEUPDATE_PERIOD, TIMEUPDATE_PERIOD);
             mProgressView.setVisibility(View.GONE);
             mLayout.removeView(mProgressView);
             mProgressView = null;
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index cdc6608..115499f 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -101,7 +101,6 @@
     private boolean  mCancelled;  // The request has been cancelled.
     private boolean  mAuthFailed;  // indicates that the prev. auth failed
     private CacheLoader mCacheLoader;
-    private CacheManager.CacheResult mCacheResult;
     private boolean  mFromCache = false;
     private HttpAuthHeader mAuthHeader;
     private int      mErrorID = OK;
@@ -301,6 +300,12 @@
      */
     public void headers(Headers headers) {
         if (DebugFlags.LOAD_LISTENER) Log.v(LOGTAG, "LoadListener.headers");
+        // call db (setCookie) in the non-WebCore thread
+        if (mCancelled) return;
+        ArrayList<String> cookies = headers.getSetCookie();
+        for (int i = 0; i < cookies.size(); ++i) {
+            CookieManager.getInstance().setCookie(mUri, cookies.get(i));
+        }
         sendMessageInternal(obtainMessage(MSG_CONTENT_HEADERS, headers));
     }
 
@@ -316,11 +321,6 @@
         if (mCancelled) return;
         mHeaders = headers;
 
-        ArrayList<String> cookies = headers.getSetCookie();
-        for (int i = 0; i < cookies.size(); ++i) {
-            CookieManager.getInstance().setCookie(mUri, cookies.get(i));
-        }
-
         long contentLength = headers.getContentLength();
         if (contentLength != Headers.NO_CONTENT_LENGTH) {
             mContentLength = contentLength;
@@ -454,12 +454,19 @@
             if (!mFromCache && mRequestHandle != null
                     && (!mRequestHandle.getMethod().equals("POST")
                             || mPostIdentifier != 0)) {
-                mCacheResult = CacheManager.createCacheFile(mUrl, mStatusCode,
-                        headers, mMimeType, mPostIdentifier, false);
+                WebViewWorker.CacheCreateData data = new WebViewWorker.CacheCreateData();
+                data.mListener = this;
+                data.mUrl = mUrl;
+                data.mMimeType = mMimeType;
+                data.mStatusCode = mStatusCode;
+                data.mPostId = mPostIdentifier;
+                data.mHeaders = headers;
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_CREATE_CACHE, data).sendToTarget();
             }
-            if (mCacheResult != null) {
-                mCacheResult.encoding = mEncoding;
-            }
+            WebViewWorker.CacheEncoding ce = new WebViewWorker.CacheEncoding();
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_UPDATE_CACHE_ENCODING, ce).sendToTarget();
         }
         commitHeadersCheckRedirect();
     }
@@ -649,7 +656,10 @@
                 // ask for it, so make sure we have a valid CacheLoader
                 // before calling it.
                 if (mCacheLoader != null) {
-                    mCacheLoader.load();
+                    // Load the cached file in a separate thread
+                    WebViewWorker.getHandler().obtainMessage(
+                            WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
+                            .sendToTarget();
                     mFromCache = true;
                     if (DebugFlags.LOAD_LISTENER) {
                         Log.v(LOGTAG, "LoadListener cache load url=" + url());
@@ -708,8 +718,10 @@
                     Log.v(LOGTAG, "FrameLoader: HTTP URL in cache " +
                             "and usable: " + url());
                 }
-                // Load the cached file
-                mCacheLoader.load();
+                // Load the cached file in a separate thread
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_ADD_STREAMLOADER, mCacheLoader)
+                        .sendToTarget();
                 mFromCache = true;
                 return true;
             }
@@ -934,12 +946,9 @@
      * WebCore.
      */
     void downloadFile() {
-        // Setting the Cache Result to null ensures that this
-        // content is not added to the cache
-        if (mCacheResult != null) {
-            CacheManager.cleanupCacheFile(mCacheResult);
-            mCacheResult = null;
-        }
+        // remove the cache
+        WebViewWorker.getHandler().obtainMessage(
+                WebViewWorker.MSG_REMOVE_CACHE, this).sendToTarget();
 
         // Inform the client that they should download a file
         mBrowserFrame.getCallbackProxy().onDownloadStart(url(), 
@@ -1021,6 +1030,13 @@
             return;
         }
 
+        // If the response is an authentication and we've resent the
+        // request with some credentials then don't commit the headers
+        // of this response; wait for the response to the request with the
+        // credentials.
+        if (mAuthHeader != null)
+            return;
+
         // Commit the headers to WebCore
         int nativeResponse = createNativeResponse();
         // The native code deletes the native response object.
@@ -1098,24 +1114,15 @@
             if (c == null) break;
 
             if (c.mLength != 0) {
-                if (mCacheResult != null) {
-                    mCacheResult.contentLength += c.mLength;
-                    if (mCacheResult.contentLength > CacheManager.CACHE_MAX_SIZE) {
-                        CacheManager.cleanupCacheFile(mCacheResult);
-                        mCacheResult = null;
-                    } else {
-                        try {
-                            mCacheResult.outStream
-                                    .write(c.mArray, 0, c.mLength);
-                        } catch (IOException e) {
-                            CacheManager.cleanupCacheFile(mCacheResult);
-                            mCacheResult = null;
-                        }
-                    }
-                }
                 nativeAddData(c.mArray, c.mLength);
+                WebViewWorker.CacheData data = new WebViewWorker.CacheData();
+                data.mListener = this;
+                data.mChunk = c;
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_APPEND_CACHE, data).sendToTarget();
+            } else {
+                c.release();
             }
-            c.release();
             checker.responseAlert("res nativeAddData");
         }
     }
@@ -1125,18 +1132,16 @@
      * cancellation or errors during the load.
      */
     void tearDown() {
-        if (mCacheResult != null) {
-            if (getErrorID() == OK) {
-                CacheManager.saveCacheFile(mUrl, mPostIdentifier, mCacheResult);
-            } else {
-                CacheManager.cleanupCacheFile(mCacheResult);
-            }
-
-            // we need to reset mCacheResult to be null
-            // resource loader's tearDown will call into WebCore's
-            // nativeFinish, which in turn calls loader.cancel().
-            // If we don't reset mCacheFile, the file will be deleted.
-            mCacheResult = null;
+        if (getErrorID() == OK) {
+            WebViewWorker.CacheSaveData data = new WebViewWorker.CacheSaveData();
+            data.mListener = this;
+            data.mUrl = mUrl;
+            data.mPostId = mPostIdentifier;
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_SAVE_CACHE, data).sendToTarget();
+        } else {
+            WebViewWorker.getHandler().obtainMessage(
+                    WebViewWorker.MSG_REMOVE_CACHE, this).sendToTarget();
         }
         if (mNativeLoader != 0) {
             PerfChecker checker = new PerfChecker();
@@ -1194,10 +1199,8 @@
             mRequestHandle = null;
         }
 
-        if (mCacheResult != null) {
-            CacheManager.cleanupCacheFile(mCacheResult);
-            mCacheResult = null;
-        }
+        WebViewWorker.getHandler().obtainMessage(
+                WebViewWorker.MSG_REMOVE_CACHE, this).sendToTarget();
         mCancelled = true;
 
         clearNativeLoader();
@@ -1258,14 +1261,16 @@
             }
 
             // Cache the redirect response
-            if (mCacheResult != null) {
-                if (getErrorID() == OK) {
-                    CacheManager.saveCacheFile(mUrl, mPostIdentifier,
-                            mCacheResult);
-                } else {
-                    CacheManager.cleanupCacheFile(mCacheResult);
-                }
-                mCacheResult = null;
+            if (getErrorID() == OK) {
+                WebViewWorker.CacheSaveData data = new WebViewWorker.CacheSaveData();
+                data.mListener = this;
+                data.mUrl = mUrl;
+                data.mPostId = mPostIdentifier;
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_SAVE_CACHE, data).sendToTarget();
+            } else {
+                WebViewWorker.getHandler().obtainMessage(
+                        WebViewWorker.MSG_REMOVE_CACHE, this).sendToTarget();
             }
 
             // This will strip the anchor
diff --git a/core/java/android/webkit/SslErrorHandler.java b/core/java/android/webkit/SslErrorHandler.java
index d99c2c0..1b0afaf 100644
--- a/core/java/android/webkit/SslErrorHandler.java
+++ b/core/java/android/webkit/SslErrorHandler.java
@@ -51,10 +51,9 @@
      */
     private Bundle mSslPrefTable;
 
-    /**
-     * Flag indicating that a client reponse is pending.
-     */
-    private boolean mResponsePending;
+    // These are only used in the client facing SslErrorHandler.
+    private final SslErrorHandler mOriginHandler;
+    private final LoadListener mLoadListener;
 
     // Message id for handling the response
     private static final int HANDLE_RESPONSE = 100;
@@ -64,9 +63,12 @@
         switch (msg.what) {
             case HANDLE_RESPONSE:
                 LoadListener loader = (LoadListener) msg.obj;
-                handleSslErrorResponse(loader, loader.sslError(),
-                        msg.arg1 == 1);
-                fastProcessQueuedSslErrors();
+                synchronized (SslErrorHandler.this) {
+                    handleSslErrorResponse(loader, loader.sslError(),
+                            msg.arg1 == 1);
+                    mLoaderQueue.remove(loader);
+                    fastProcessQueuedSslErrors();
+                }
                 break;
         }
     }
@@ -77,6 +79,18 @@
     /* package */ SslErrorHandler() {
         mLoaderQueue = new LinkedList<LoadListener>();
         mSslPrefTable = new Bundle();
+
+        // These are used by client facing SslErrorHandlers.
+        mOriginHandler = null;
+        mLoadListener = null;
+    }
+
+    /**
+     * Create a new error handler that will be passed to the client.
+     */
+    private SslErrorHandler(SslErrorHandler origin, LoadListener listener) {
+        mOriginHandler = origin;
+        mLoadListener = listener;
     }
 
     /**
@@ -196,8 +210,7 @@
             // if we do not have information on record, ask
             // the user (display a dialog)
             CallbackProxy proxy = loader.getFrame().getCallbackProxy();
-            mResponsePending = true;
-            proxy.onReceivedSslError(this, error);
+            proxy.onReceivedSslError(new SslErrorHandler(this, loader), error);
         }
 
         // the queue must be empty, stop
@@ -208,11 +221,9 @@
      * Proceed with the SSL certificate.
      */
     public void proceed() {
-        if (mResponsePending) {
-            mResponsePending = false;
-            sendMessage(obtainMessage(HANDLE_RESPONSE, 1, 0,
-                        mLoaderQueue.poll()));
-        }
+        mOriginHandler.sendMessage(
+                mOriginHandler.obtainMessage(
+                        HANDLE_RESPONSE, 1, 0, mLoadListener));
     }
 
     /**
@@ -220,11 +231,9 @@
      * the error.
      */
     public void cancel() {
-        if (mResponsePending) {
-            mResponsePending = false;
-            sendMessage(obtainMessage(HANDLE_RESPONSE, 0, 0,
-                        mLoaderQueue.poll()));
-        }
+        mOriginHandler.sendMessage(
+                mOriginHandler.obtainMessage(
+                        HANDLE_RESPONSE, 0, 0, mLoadListener));
     }
 
     /**
diff --git a/core/java/android/webkit/StreamLoader.java b/core/java/android/webkit/StreamLoader.java
index 4c32997..7bcd50d 100644
--- a/core/java/android/webkit/StreamLoader.java
+++ b/core/java/android/webkit/StreamLoader.java
@@ -20,8 +20,6 @@
 import android.net.http.EventHandler;
 import android.net.http.Headers;
 import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
 import android.os.Message;
 
 import java.io.IOException;
@@ -61,11 +59,6 @@
     // Handler which will be initialized in the thread where load() is called.
     private Handler mHandler;
 
-    // Handler which will be used to load StreamLoader in a separate thread
-    private static StreamQueueHandler sStreamQueueHandler;
-
-    private static final Object sStreamQueueLock = new Object();
-
     /**
      * Constructor. Although this class calls the LoadListener, it only calls
      * the EventHandler Interface methods. LoadListener concrete class is used
@@ -97,26 +90,6 @@
     abstract protected void buildHeaders(Headers headers);
 
     /**
-     * Calling this method to load this StreamLoader in a separate
-     * "StreamLoadingThread".
-     */
-    final void enqueue() {
-        synchronized (sStreamQueueLock) {
-            if (sStreamQueueHandler == null) {
-                HandlerThread thread = new HandlerThread(
-                        StreamQueueHandler.THREAD_NAME,
-                        android.os.Process.THREAD_PRIORITY_DEFAULT +
-                        android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE);
-                thread.start();
-                sStreamQueueHandler = new StreamQueueHandler(thread.getLooper());
-            }
-        }
-
-        sStreamQueueHandler.obtainMessage(StreamQueueHandler.MSG_ADD_LOADER,
-                this).sendToTarget();
-    }
-
-    /**
      * Calling this method starts the load of the content for this StreamLoader.
      * This method simply creates a Handler in the current thread and posts a
      * message to send the status and returns immediately.
@@ -228,22 +201,4 @@
         }
         mLoadListener.endData();
     }
-
-    private static class StreamQueueHandler extends Handler {
-        private static final String THREAD_NAME = "StreamLoadingThread";
-
-        private static final int MSG_ADD_LOADER = 101;
-
-        StreamQueueHandler(Looper looper) {
-            super(looper);
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_ADD_LOADER) {
-                StreamLoader loader = (StreamLoader) msg.obj;
-                loader.load();
-            }
-        }
-    }
 }
diff --git a/core/java/android/webkit/WebBackForwardList.java b/core/java/android/webkit/WebBackForwardList.java
index 62a5531..79e634e 100644
--- a/core/java/android/webkit/WebBackForwardList.java
+++ b/core/java/android/webkit/WebBackForwardList.java
@@ -31,13 +31,16 @@
     private ArrayList<WebHistoryItem> mArray;
     // Flag to indicate that the list is invalid
     private boolean mClearPending;
+    // CallbackProxy to issue client callbacks.
+    private final CallbackProxy mCallbackProxy;
 
     /**
      * Construct a back/forward list used by clients of WebView.
      */
-    /*package*/ WebBackForwardList() {
+    /*package*/ WebBackForwardList(CallbackProxy proxy) {
         mCurrentIndex = -1;
         mArray = new ArrayList<WebHistoryItem>();
+        mCallbackProxy = proxy;
     }
 
     /**
@@ -116,6 +119,9 @@
         }
         // Add the item to the list.
         mArray.add(item);
+        if (mCallbackProxy != null) {
+            mCallbackProxy.onNewHistoryItem(item);
+        }
     }
 
     /**
@@ -152,7 +158,7 @@
      * webkit package classes.
      */
     protected synchronized WebBackForwardList clone() {
-        WebBackForwardList l = new WebBackForwardList();
+        WebBackForwardList l = new WebBackForwardList(null);
         if (mClearPending) {
             // If a clear is pending, return a copy with only the current item.
             l.addHistoryItem(getCurrentItem());
@@ -174,6 +180,9 @@
      */
     /*package*/ synchronized void setCurrentIndex(int newIndex) {
         mCurrentIndex = newIndex;
+        if (mCallbackProxy != null) {
+            mCallbackProxy.onIndexChanged(getItemAtIndex(newIndex), newIndex);
+        }
     }
 
     /**
diff --git a/core/java/android/webkit/WebBackForwardListClient.java b/core/java/android/webkit/WebBackForwardListClient.java
new file mode 100644
index 0000000..7fe9281
--- /dev/null
+++ b/core/java/android/webkit/WebBackForwardListClient.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2010 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;
+
+/**
+ * Interface to receive notifications when items are added to the
+ * {@link WebBackForwardList}.
+ * {@hide}
+ */
+public abstract class WebBackForwardListClient {
+
+    /**
+     * Notify the client that <var>item</var> has been added to the
+     * WebBackForwardList.
+     * @param item The newly created WebHistoryItem
+     */
+    public void onNewHistoryItem(WebHistoryItem item) { }
+
+    /**
+     * Notify the client that the <var>item</var> at <var>index</var> is now
+     * the current history item.
+     * @param item A WebHistoryItem
+     * @param index The new history index
+     */
+    public void onIndexChanged(WebHistoryItem item, int index) { }
+}
diff --git a/core/java/android/webkit/WebHistoryItem.java b/core/java/android/webkit/WebHistoryItem.java
index abd8237..428a59c 100644
--- a/core/java/android/webkit/WebHistoryItem.java
+++ b/core/java/android/webkit/WebHistoryItem.java
@@ -41,6 +41,8 @@
     private byte[] mFlattenedData;
     // The apple-touch-icon url for use when adding the site to the home screen
     private String mTouchIconUrl;
+    // Custom client data that is not flattened or read by native code.
+    private Object mCustomData;
 
     /**
      * Basic constructor that assigns a unique id to the item. Called by JNI
@@ -137,6 +139,28 @@
     }
 
     /**
+     * Return the custom data provided by the client.
+     * @hide
+     */
+    public Object getCustomData() {
+        return mCustomData;
+    }
+
+    /**
+     * Set the custom data field.
+     * @param data An Object containing any data the client wishes to associate
+     *             with the item.
+     * @hide
+     */
+    public void setCustomData(Object data) {
+        // NOTE: WebHistoryItems are used in multiple threads. However, the
+        // public facing apis are all getters with the exception of this one
+        // api. Since this api is exclusive to clients, we don't make any
+        // promises about thread safety.
+        mCustomData = data;
+    }
+
+    /**
      * Set the favicon.
      * @param icon A Bitmap containing the favicon for this history item.
      * Note: The VM ensures 32-bit atomic read/write operations so we don't have
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index d1ad61f..39edcad 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -304,15 +304,16 @@
     public void onEditorAction(int actionCode) {
         switch (actionCode) {
         case EditorInfo.IME_ACTION_NEXT:
-            // Since the cursor will no longer be in the same place as the
-            // focus, set the focus controller back to inactive
-            mWebView.setFocusControllerInactive();
-            mWebView.nativeMoveCursorToNextTextInput();
-            // Preemptively rebuild the WebTextView, so that the action will
-            // be set properly.
-            mWebView.rebuildWebTextView();
-            setDefaultSelection();
-            mWebView.invalidate();
+            if (mWebView.nativeMoveCursorToNextTextInput()) {
+                // Since the cursor will no longer be in the same place as the
+                // focus, set the focus controller back to inactive
+                mWebView.setFocusControllerInactive();
+                // Preemptively rebuild the WebTextView, so that the action will
+                // be set properly.
+                mWebView.rebuildWebTextView();
+                setDefaultSelection();
+                mWebView.invalidate();
+            }
             break;
         case EditorInfo.IME_ACTION_DONE:
             super.onEditorAction(actionCode);
@@ -821,8 +822,9 @@
                 break;
             case 1: // TEXT_AREA
                 single = false;
-                inputType |= EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
+                inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
                         | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES
+                        | EditorInfo.TYPE_CLASS_TEXT
                         | EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT;
                 imeOptions |= EditorInfo.IME_ACTION_NONE;
                 break;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index d29d6f3..0739735 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2069,6 +2069,8 @@
             boolean force) {
         if (scale < mMinZoomScale) {
             scale = mMinZoomScale;
+            // set mInZoomOverview for non mobile sites
+            if (scale < mDefaultScale) mInZoomOverview = true;
         } else if (scale > mMaxZoomScale) {
             scale = mMaxZoomScale;
         }
@@ -2478,20 +2480,30 @@
      */
     public int findAll(String find) {
         if (0 == mNativeClass) return 0; // client isn't initialized
-        if (mFindIsUp == false) {
-            recordNewContentSize(mContentWidth, mContentHeight + mFindHeight,
-                    false);
-            mFindIsUp = true;
-        }
-        int result = nativeFindAll(find.toLowerCase(), find.toUpperCase());
+        int result = find != null ? nativeFindAll(find.toLowerCase(),
+                find.toUpperCase()) : 0;
         invalidate();
         mLastFind = find;
         return result;
     }
 
+    /**
+     * @hide
+     */
+    public void setFindIsUp(boolean isUp) {
+        mFindIsUp = isUp;
+        if (isUp) {
+            recordNewContentSize(mContentWidth, mContentHeight + mFindHeight,
+                    false);
+        }
+        if (0 == mNativeClass) return; // client isn't initialized
+        nativeSetFindIsUp(isUp);
+    }
+
     // Used to know whether the find dialog is open.  Affects whether
     // or not we draw the highlights for matches.
     private boolean mFindIsUp;
+
     private int mFindHeight;
     // Keep track of the last string sent, so we can search again after an
     // orientation change or the dismissal of the soft keyboard.
@@ -2551,14 +2563,21 @@
      * Clear the highlighting surrounding text matches created by findAll.
      */
     public void clearMatches() {
+        mLastFind = "";
         if (mNativeClass == 0)
             return;
-        if (mFindIsUp) {
-            recordNewContentSize(mContentWidth, mContentHeight - mFindHeight,
-                    false);
-            mFindIsUp = false;
-        }
-        nativeSetFindIsUp();
+        nativeSetFindIsEmpty();
+        invalidate();
+    }
+
+    /**
+     * @hide
+     */
+    public void notifyFindDialogDismissed() {
+        clearMatches();
+        setFindIsUp(false);
+        recordNewContentSize(mContentWidth, mContentHeight - mFindHeight,
+                false);
         // Now that the dialog has been removed, ensure that we scroll to a
         // location that is not beyond the end of the page.
         pinScrollTo(mScrollX, mScrollY, false, 0);
@@ -2858,6 +2877,25 @@
     }
 
     /**
+     * Set the back/forward list client. This is an implementation of
+     * WebBackForwardListClient for handling new items and changes in the
+     * history index.
+     * @param client An implementation of WebBackForwardListClient.
+     * {@hide}
+     */
+    public void setWebBackForwardListClient(WebBackForwardListClient client) {
+        mCallbackProxy.setWebBackForwardListClient(client);
+    }
+
+    /**
+     * Gets the WebBackForwardListClient.
+     * {@hide}
+     */
+    public WebBackForwardListClient getWebBackForwardListClient() {
+        return mCallbackProxy.getWebBackForwardListClient();
+    }
+
+    /**
      * Set the Picture listener. This is an interface used to receive
      * notifications of a new Picture.
      * @param listener An implementation of WebView.PictureListener.
@@ -3131,6 +3169,9 @@
         metrics.mScrollY = computeVerticalScrollOffset();
         metrics.mWidth = getWidth();
         metrics.mHeight = getHeight() - getVisibleTitleHeight();
+        if (mFindIsUp) {
+            metrics.mHeight -= mFindHeight;
+        }
         metrics.mInvScale = mInvActualScale;
         return metrics;
     }
@@ -4017,6 +4058,10 @@
                 // still want to send the notification over to webkit.
                 mWebView.setNewZoomScale(mWebView.mActualScale,
                         mUpdateTextWrap, true);
+                // update the zoom buttons as the scale can be changed
+                if (mWebView.getSettings().getBuiltInZoomControls()) {
+                    mWebView.updateZoomButtonsEnabled();
+                }
             }
         }
     }
@@ -4072,9 +4117,14 @@
     protected void onScrollChanged(int l, int t, int oldl, int oldt) {
         super.onScrollChanged(l, t, oldl, oldt);
         sendOurVisibleRect();
+        // update WebKit if visible title bar height changed. The logic is same
+        // as getVisibleTitleHeight.
+        int titleHeight = getTitleHeight();
+        if (Math.max(titleHeight - t, 0) != Math.max(titleHeight - oldt, 0)) {
+            sendViewSizeZoom();
+        }
     }
 
-
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         boolean dispatch = true;
@@ -4444,12 +4494,12 @@
             y = getViewHeightWithTitle() - 1;
         }
 
-        // pass the touch events from UI thread to WebCore thread
-        if (mForwardTouchEvents
-                && (action != MotionEvent.ACTION_MOVE || eventTime
-                        - mLastSentTouchTime > mCurrentTouchInterval)
-                && (action == MotionEvent.ACTION_DOWN
-                        || mPreventDrag != PREVENT_DRAG_CANCEL)) {
+        // pass the touch events, except ACTION_MOVE which will be handled
+        // later, from UI thread to WebCore thread
+        if (mFullScreenHolder != null || (mForwardTouchEvents
+                && action != MotionEvent.ACTION_MOVE
+                && (action == MotionEvent.ACTION_DOWN || mPreventDrag
+                        != PREVENT_DRAG_CANCEL))) {
             WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
             ted.mAction = action;
             ted.mX = viewToContentX((int) x + mScrollX);
@@ -4540,6 +4590,21 @@
                     if ((deltaX * deltaX + deltaY * deltaY) < mTouchSlopSquare) {
                         break;
                     }
+
+                    // pass the first ACTION_MOVE from UI thread to WebCore
+                    // thread after the distance is confirmed that it is a drag
+                    if (mFullScreenHolder == null && mForwardTouchEvents
+                            && mPreventDrag != PREVENT_DRAG_CANCEL) {
+                        WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
+                        ted.mAction = action;
+                        ted.mX = viewToContentX((int) x + mScrollX);
+                        ted.mY = viewToContentY((int) y + mScrollY);
+                        ted.mEventTime = eventTime;
+                        ted.mMetaState = ev.getMetaState();
+                        mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
+                        mLastSentTouchTime = eventTime;
+                    }
+
                     if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
                         // track mLastTouchTime as we may need to do fling at
                         // ACTION_UP
@@ -4596,6 +4661,20 @@
                                     Toast.LENGTH_LONG).show();
                         }
                     }
+                } else {
+                    // pass the touch events from UI thread to WebCore thread
+                    if (mFullScreenHolder == null && mForwardTouchEvents
+                            && eventTime - mLastSentTouchTime > mCurrentTouchInterval
+                            && mPreventDrag != PREVENT_DRAG_CANCEL) {
+                        WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
+                        ted.mAction = action;
+                        ted.mX = viewToContentX((int) x + mScrollX);
+                        ted.mY = viewToContentY((int) y + mScrollY);
+                        ted.mEventTime = eventTime;
+                        ted.mMetaState = ev.getMetaState();
+                        mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted);
+                        mLastSentTouchTime = eventTime;
+                    }
                 }
 
                 // do pan
@@ -4740,6 +4819,14 @@
                             if (mFullScreenHolder == null
                                     && (computeHorizontalScrollExtent() < computeHorizontalScrollRange()
                                     || computeVerticalScrollExtent() < computeVerticalScrollRange())) {
+                                // remove the pending TOUCH_EVENT and send a
+                                // cancel
+                                mWebViewCore
+                                        .removeMessages(EventHub.TOUCH_EVENT);
+                                WebViewCore.TouchEventData ted = new WebViewCore.TouchEventData();
+                                ted.mAction = MotionEvent.ACTION_CANCEL;
+                                mWebViewCore.sendMessage(EventHub.TOUCH_EVENT,
+                                        ted);
                                 // we will not rewrite drag code here, but we
                                 // will try fling if it applies.
                                 WebViewCore.reducePriority();
@@ -6807,7 +6894,7 @@
     private native void     nativeHideCursor();
     private native String   nativeImageURI(int x, int y);
     private native void     nativeInstrumentReport();
-    /* package */ native void nativeMoveCursorToNextTextInput();
+    /* package */ native boolean nativeMoveCursorToNextTextInput();
     // return true if the page has been scrolled
     private native boolean  nativeMotionUp(int x, int y, int slop);
     // returns false if it handled the key
@@ -6822,7 +6909,8 @@
     private native void     nativeRecordButtons(boolean focused,
             boolean pressed, boolean invalidate);
     private native void     nativeSelectBestAt(Rect rect);
-    private native void     nativeSetFindIsUp();
+    private native void     nativeSetFindIsEmpty();
+    private native void     nativeSetFindIsUp(boolean isUp);
     private native void     nativeSetFollowedLink(boolean followed);
     private native void     nativeSetHeightCanMeasure(boolean measure);
     private native void     nativeSetRootLayer(int layer);
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 361ec56..71f69fe 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -587,13 +587,6 @@
         private static final int INITIALIZE = 0;
         private static final int REDUCE_PRIORITY = 1;
         private static final int RESUME_PRIORITY = 2;
-        private static final int CACHE_TICKER = 3;
-        private static final int BLOCK_CACHE_TICKER = 4;
-        private static final int RESUME_CACHE_TICKER = 5;
-
-        private static final int CACHE_TICKER_INTERVAL = 60 * 1000; // 1 minute
-
-        private static boolean mCacheTickersBlocked = true;
 
         public void run() {
             Looper.prepare();
@@ -619,28 +612,6 @@
                                 Process.setThreadPriority(
                                         Process.THREAD_PRIORITY_DEFAULT);
                                 break;
-
-                            case CACHE_TICKER:
-                                if (!mCacheTickersBlocked) {
-                                    CacheManager.endCacheTransaction();
-                                    CacheManager.startCacheTransaction();
-                                    sendMessageDelayed(
-                                            obtainMessage(CACHE_TICKER),
-                                            CACHE_TICKER_INTERVAL);
-                                }
-                                break;
-
-                            case BLOCK_CACHE_TICKER:
-                                if (CacheManager.endCacheTransaction()) {
-                                    mCacheTickersBlocked = true;
-                                }
-                                break;
-
-                            case RESUME_CACHE_TICKER:
-                                if (CacheManager.startCacheTransaction()) {
-                                    mCacheTickersBlocked = false;
-                                }
-                                break;
                         }
                     }
                 };
@@ -1092,23 +1063,15 @@
                             Process.setThreadPriority(mTid,
                                     Process.THREAD_PRIORITY_BACKGROUND);
                             pauseTimers();
-                            if (CacheManager.disableTransaction()) {
-                                WebCoreThread.mCacheTickersBlocked = true;
-                                sWebCoreHandler.removeMessages(
-                                        WebCoreThread.CACHE_TICKER);
-                            }
+                            WebViewWorker.getHandler().sendEmptyMessage(
+                                    WebViewWorker.MSG_PAUSE_CACHE_TRANSACTION);
                             break;
 
                         case RESUME_TIMERS:
                             Process.setThreadPriority(mTid, mSavedPriority);
                             resumeTimers();
-                            if (CacheManager.enableTransaction()) {
-                                WebCoreThread.mCacheTickersBlocked = false;
-                                sWebCoreHandler.sendMessageDelayed(
-                                        sWebCoreHandler.obtainMessage(
-                                        WebCoreThread.CACHE_TICKER),
-                                        WebCoreThread.CACHE_TICKER_INTERVAL);
-                            }
+                            WebViewWorker.getHandler().sendEmptyMessage(
+                                    WebViewWorker.MSG_RESUME_CACHE_TRANSACTION);
                             break;
 
                         case ON_PAUSE:
@@ -1851,16 +1814,6 @@
                 .obtainMessage(WebCoreThread.RESUME_PRIORITY));
     }
 
-    static void startCacheTransaction() {
-        sWebCoreHandler.sendMessage(sWebCoreHandler
-                .obtainMessage(WebCoreThread.RESUME_CACHE_TICKER));
-    }
-
-    static void endCacheTransaction() {
-        sWebCoreHandler.sendMessage(sWebCoreHandler
-                .obtainMessage(WebCoreThread.BLOCK_CACHE_TICKER));
-    }
-
     static void pauseUpdatePicture(WebViewCore core) {
         // Note: there is one possible failure mode. If pauseUpdatePicture() is
         // called from UI thread while WEBKIT_DRAW is just pulled out of the
@@ -1992,9 +1945,10 @@
         sendUpdateTextEntry();
         // as CacheManager can behave based on database transaction, we need to
         // call tick() to trigger endTransaction
-        sWebCoreHandler.removeMessages(WebCoreThread.CACHE_TICKER);
-        sWebCoreHandler.sendMessage(sWebCoreHandler
-                .obtainMessage(WebCoreThread.CACHE_TICKER));
+        WebViewWorker.getHandler().removeMessages(
+                WebViewWorker.MSG_CACHE_TRANSACTION_TICKER);
+        WebViewWorker.getHandler().sendEmptyMessage(
+                WebViewWorker.MSG_CACHE_TRANSACTION_TICKER);
         contentDraw();
     }
 
@@ -2446,6 +2400,9 @@
         // ensures the view system knows the view can redraw itself
         pluginView.setWillNotDraw(false);
 
+        if(pluginView instanceof SurfaceView)
+            ((SurfaceView)pluginView).setZOrderOnTop(true);
+
         ViewManager.ChildView view = mWebView.mViewManager.createView();
         view.mView = pluginView;
         view.attachView(x, y, width, height);
diff --git a/core/java/android/webkit/WebViewDatabase.java b/core/java/android/webkit/WebViewDatabase.java
index 110e4f8..a870931 100644
--- a/core/java/android/webkit/WebViewDatabase.java
+++ b/core/java/android/webkit/WebViewDatabase.java
@@ -19,6 +19,7 @@
 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;
 
@@ -234,6 +235,13 @@
             }
 
             if (mCacheDatabase != null) {
+                // use read_uncommitted to speed up READ
+                mCacheDatabase.execSQL("PRAGMA read_uncommitted = true;");
+                // as only READ can be called in the non-WebViewWorkerThread,
+                // and read_uncommitted is used, we can turn off database lock
+                // to use transaction.
+                mCacheDatabase.setLockingEnabled(false);
+
                 // use InsertHelper for faster insertion
                 mCacheInserter = new DatabaseUtils.InsertHelper(mCacheDatabase,
                         "cache");
@@ -548,19 +556,33 @@
     }
 
     //
-    // cache functions, can only be called from WebCoreThread
+    // cache functions
     //
 
+    // only called from WebViewWorkerThread
     boolean startCacheTransaction() {
         if (++mCacheTransactionRefcount == 1) {
+            if (!Thread.currentThread().equals(
+                    WebViewWorker.getHandler().getLooper().getThread())) {
+                Log.w(LOGTAG, "startCacheTransaction should be called from "
+                        + "WebViewWorkerThread instead of from "
+                        + Thread.currentThread().getName());
+            }
             mCacheDatabase.beginTransaction();
             return true;
         }
         return false;
     }
 
+    // only called from WebViewWorkerThread
     boolean endCacheTransaction() {
         if (--mCacheTransactionRefcount == 0) {
+            if (!Thread.currentThread().equals(
+                    WebViewWorker.getHandler().getLooper().getThread())) {
+                Log.w(LOGTAG, "endCacheTransaction should be called from "
+                        + "WebViewWorkerThread instead of from "
+                        + Thread.currentThread().getName());
+            }
             try {
                 mCacheDatabase.setTransactionSuccessful();
             } finally {
@@ -684,7 +706,7 @@
         return size;
     }
 
-    ArrayList<String> trimCache(long amount) {
+    List<String> trimCache(long amount) {
         ArrayList<String> pathList = new ArrayList<String>(100);
         Cursor cursor = mCacheDatabase.rawQuery(
                 "SELECT contentlength, filepath FROM cache ORDER BY expires ASC",
@@ -727,6 +749,20 @@
         return pathList;
     }
 
+    List<String> getAllCacheFileNames() {
+        ArrayList<String> pathList = null;
+        Cursor cursor = mCacheDatabase.rawQuery("SELECT filepath FROM cache",
+                null);
+        if (cursor != null && cursor.moveToFirst()) {
+            pathList = new ArrayList<String>(cursor.getCount());
+            do {
+                pathList.add(cursor.getString(0));
+            } while (cursor.moveToNext());
+        }
+        cursor.close();
+        return pathList;
+    }
+
     //
     // password functions
     //
diff --git a/core/java/android/webkit/WebViewWorker.java b/core/java/android/webkit/WebViewWorker.java
new file mode 100644
index 0000000..c488150
--- /dev/null
+++ b/core/java/android/webkit/WebViewWorker.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2010 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.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import android.net.http.Headers;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+
+/**
+ * WebViewWorker executes in a separate thread other than UI and WebViewCore. To
+ * avoid blocking UI or WebKit's execution, the caller can send a message to
+ * WebViewWorker.getHandler() and it will be handled in the WebViewWorkerThread.
+ */
+final class WebViewWorker extends Handler {
+
+    private static final String THREAD_NAME = "WebViewWorkerThread";
+
+    private static WebViewWorker sWorkerHandler;
+
+    private static Map<LoadListener, CacheManager.CacheResult> mCacheResultMap
+            = new HashMap<LoadListener, CacheManager.CacheResult>();
+
+    /**
+     * Package level class to be used while creating a cache entry.
+     */
+    static class CacheCreateData {
+        LoadListener mListener;
+        String mUrl;
+        String mMimeType;
+        int mStatusCode;
+        long mPostId;
+        Headers mHeaders;
+    }
+
+    /**
+     * Package level class to be used while saving a cache entry.
+     */
+    static class CacheSaveData {
+        LoadListener mListener;
+        String mUrl;
+        long mPostId;
+    }
+
+    /**
+     * Package level class to be used while updating a cache entry's encoding.
+     */
+    static class CacheEncoding {
+        LoadListener mListener;
+        String mEncoding;
+    }
+
+    /**
+     * Package level class to be used while appending data to a cache entry.
+     */
+    static class CacheData {
+        LoadListener mListener;
+        ByteArrayBuilder.Chunk mChunk;
+    }
+
+    static synchronized WebViewWorker getHandler() {
+        if (sWorkerHandler == null) {
+            HandlerThread thread = new HandlerThread(THREAD_NAME,
+                    android.os.Process.THREAD_PRIORITY_DEFAULT
+                            + android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE);
+            thread.start();
+            sWorkerHandler = new WebViewWorker(thread.getLooper());
+        }
+        return sWorkerHandler;
+    }
+
+    private WebViewWorker(Looper looper) {
+        super(looper);
+    }
+
+    // trigger transaction once a minute
+    private static final int CACHE_TRANSACTION_TICKER_INTERVAL = 60 * 1000;
+
+    private static boolean mCacheTickersBlocked = true;
+
+    // message ids
+    static final int MSG_ADD_STREAMLOADER = 101;
+    static final int MSG_ADD_HTTPLOADER = 102;
+    static final int MSG_CREATE_CACHE = 103;
+    static final int MSG_UPDATE_CACHE_ENCODING = 104;
+    static final int MSG_APPEND_CACHE = 105;
+    static final int MSG_SAVE_CACHE = 106;
+    static final int MSG_REMOVE_CACHE = 107;
+    static final int MSG_TRIM_CACHE = 108;
+    static final int MSG_CLEAR_CACHE = 109;
+    static final int MSG_CACHE_TRANSACTION_TICKER = 110;
+    static final int MSG_PAUSE_CACHE_TRANSACTION = 111;
+    static final int MSG_RESUME_CACHE_TRANSACTION = 112;
+
+    @Override
+    public void handleMessage(Message msg) {
+        switch(msg.what) {
+            case MSG_ADD_STREAMLOADER: {
+                StreamLoader loader = (StreamLoader) msg.obj;
+                loader.load();
+                break;
+            }
+            case MSG_ADD_HTTPLOADER: {
+                FrameLoader loader = (FrameLoader) msg.obj;
+                loader.handleHTTPLoad();
+                break;
+            }
+            case MSG_CREATE_CACHE: {
+                CacheCreateData data = (CacheCreateData) msg.obj;
+                CacheManager.CacheResult cache = CacheManager.createCacheFile(
+                        data.mUrl, data.mStatusCode, data.mHeaders,
+                        data.mMimeType, data.mPostId, false);
+                if (cache != null) {
+                    mCacheResultMap.put(data.mListener, cache);
+                } else {
+                    mCacheResultMap.remove(data.mListener);
+                }
+                break;
+            }
+            case MSG_UPDATE_CACHE_ENCODING: {
+                CacheEncoding data = (CacheEncoding) msg.obj;
+                CacheManager.CacheResult cache = mCacheResultMap
+                        .get(data.mListener);
+                if (cache != null) {
+                    cache.encoding = data.mEncoding;
+                }
+                break;
+            }
+            case MSG_APPEND_CACHE: {
+                CacheData data = (CacheData) msg.obj;
+                CacheManager.CacheResult cache = mCacheResultMap
+                        .get(data.mListener);
+                if (cache != null) {
+                    cache.contentLength += data.mChunk.mLength;
+                    if (cache.contentLength > CacheManager.CACHE_MAX_SIZE) {
+                        CacheManager.cleanupCacheFile(cache);
+                        mCacheResultMap.remove(data.mListener);
+                    } else {
+                        try {
+                            cache.outStream.write(data.mChunk.mArray, 0,
+                                    data.mChunk.mLength);
+                        } catch (IOException e) {
+                            CacheManager.cleanupCacheFile(cache);
+                            mCacheResultMap.remove(data.mListener);
+                        }
+                    }
+                }
+                data.mChunk.release();
+                break;
+            }
+            case MSG_SAVE_CACHE: {
+                CacheSaveData data = (CacheSaveData) msg.obj;
+                CacheManager.CacheResult cache = mCacheResultMap
+                        .get(data.mListener);
+                if (cache != null) {
+                    CacheManager.saveCacheFile(data.mUrl, data.mPostId, cache);
+                    mCacheResultMap.remove(data.mListener);
+                }
+                break;
+            }
+            case MSG_REMOVE_CACHE: {
+                LoadListener listener = (LoadListener) msg.obj;
+                CacheManager.CacheResult cache = mCacheResultMap.get(listener);
+                if (cache != null) {
+                    CacheManager.cleanupCacheFile(cache);
+                    mCacheResultMap.remove(listener);
+                }
+                break;
+            }
+            case MSG_TRIM_CACHE: {
+                CacheManager.trimCacheIfNeeded();
+                break;
+            }
+            case MSG_CLEAR_CACHE: {
+                CacheManager.clearCache();
+                break;
+            }
+            case MSG_CACHE_TRANSACTION_TICKER: {
+                if (!mCacheTickersBlocked) {
+                    CacheManager.endTransaction();
+                    CacheManager.startTransaction();
+                    sendEmptyMessageDelayed(MSG_CACHE_TRANSACTION_TICKER,
+                            CACHE_TRANSACTION_TICKER_INTERVAL);
+                }
+                break;
+            }
+            case MSG_PAUSE_CACHE_TRANSACTION: {
+                if (CacheManager.disableTransaction()) {
+                    mCacheTickersBlocked = true;
+                    removeMessages(MSG_CACHE_TRANSACTION_TICKER);
+                }
+                break;
+            }
+            case MSG_RESUME_CACHE_TRANSACTION: {
+                if (CacheManager.enableTransaction()) {
+                    mCacheTickersBlocked = false;
+                    sendEmptyMessageDelayed(MSG_CACHE_TRANSACTION_TICKER,
+                            CACHE_TRANSACTION_TICKER_INTERVAL);
+                }
+                break;
+            }
+        }
+    }
+}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index bec62b1..a555ae4 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -4017,6 +4017,10 @@
          * View type for this view, as returned by
          * {@link android.widget.Adapter#getItemViewType(int) }
          */
+        @ViewDebug.ExportedProperty(mapping = {
+            @ViewDebug.IntToString(from = ITEM_VIEW_TYPE_IGNORE, to = "ITEM_VIEW_TYPE_IGNORE"),
+            @ViewDebug.IntToString(from = ITEM_VIEW_TYPE_HEADER_OR_FOOTER, to = "ITEM_VIEW_TYPE_HEADER_OR_FOOTER")
+        })
         int viewType;
 
         /**
@@ -4025,8 +4029,20 @@
          * been added to the list view and whether they should be treated as
          * recycled views or not.
          */
+        @ViewDebug.ExportedProperty
         boolean recycledHeaderFooter;
 
+        /**
+         * When an AbsListView is measured with an AT_MOST measure spec, it needs
+         * to obtain children views to measure itself. When doing so, the children
+         * are not attached to the window, but put in the recycler which assumes
+         * they've been attached before. Setting this flag will force the reused
+         * view to be attached to the window rather than just attached to the
+         * parent.
+         */
+        @ViewDebug.ExportedProperty
+        boolean forceAdd;
+
         public LayoutParams(Context c, AttributeSet attrs) {
             super(c, attrs);
         }
@@ -4224,7 +4240,9 @@
             // into the scrap heap
             int viewType = lp.viewType;
             if (!shouldRecycleViewType(viewType)) {
-                removeDetachedView(scrap, false);
+                if (viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
+                    removeDetachedView(scrap, false);
+                }
                 return;
             }
 
@@ -4258,9 +4276,11 @@
 
                     activeViews[i] = null;
 
-                    if (whichScrap == AdapterView.ITEM_VIEW_TYPE_IGNORE) {
-                        removeDetachedView(victim, false);
+                    if (!shouldRecycleViewType(whichScrap)) {
                         // Do not move views that should be ignored
+                        if (whichScrap != ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
+                            removeDetachedView(victim, false);
+                        }
                         continue;
                     }
 
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index a4b20da..9cc8bd5 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -482,18 +482,21 @@
         return mAdapter;
     }
     
+    private boolean isHeaderOrFooterPosition(int position) {
+        final int footerViewsStart = mItemCount - getFooterViewsCount();
+        return (position < getHeaderViewsCount() || position >= footerViewsStart);
+    }
+
     @Override
     public boolean performItemClick(View v, int position, long id) {
         // Ignore clicks in header/footers
-        final int headerViewsCount = getHeaderViewsCount();
-        final int footerViewsStart = mItemCount - getFooterViewsCount();
-
-        if (position < headerViewsCount || position >= footerViewsStart) {
+        if (isHeaderOrFooterPosition(position)) {
             // Clicked on a header/footer, so ignore pass it on to super
             return super.performItemClick(v, position, id);
         }
         
         // Internally handle the item click
+        final int headerViewsCount = getHeaderViewsCount();
         return handleItemClick(v, position - headerViewsCount, id);
     }
     
@@ -544,9 +547,10 @@
                 
                 final int groupPos = posMetadata.position.groupPos;
                 final int groupFlatPos = posMetadata.position.flatListPos;
-                
-                smoothScrollToPosition(groupFlatPos + mAdapter.getChildrenCount(groupPos),
-                        groupFlatPos);
+
+                final int shiftedGroupPosition = groupFlatPos + getHeaderViewsCount(); 
+                smoothScrollToPosition(shiftedGroupPosition + mAdapter.getChildrenCount(groupPos),
+                        shiftedGroupPosition);
             }
 
             returnValue = true;
@@ -689,8 +693,8 @@
     }
     
     /**
-     * Converts a flat list position (the raw position of an item (child or
-     * group) in the list) to an group and/or child position (represented in a
+     * Converts a flat list position (the raw position of an item (child or group)
+     * in the list) to an group and/or child position (represented in a
      * packed position). This is useful in situations where the caller needs to
      * use the underlying {@link ListView}'s methods. Use
      * {@link ExpandableListView#getPackedPositionType} ,
@@ -699,10 +703,16 @@
      * 
      * @param flatListPosition The flat list position to be converted.
      * @return The group and/or child position for the given flat list position
-     *         in packed position representation.
+     *         in packed position representation. #PACKED_POSITION_VALUE_NULL if
+     *         the position corresponds to a header or a footer item.
      */
     public long getExpandableListPosition(int flatListPosition) {
-        PositionMetadata pm = mConnector.getUnflattenedPos(flatListPosition);
+        if (isHeaderOrFooterPosition(flatListPosition)) {
+            return PACKED_POSITION_VALUE_NULL;
+        }
+
+        final int shiftedPosition = flatListPosition - getHeaderViewsCount();
+        PositionMetadata pm = mConnector.getUnflattenedPos(shiftedPosition);
         long packedPos = pm.position.getPackedPosition();
         pm.recycle();
         return packedPos;
@@ -724,7 +734,7 @@
                 .obtainPosition(packedPosition));
         int retValue = pm.position.flatListPos;
         pm.recycle();
-        return retValue;
+        return retValue + getHeaderViewsCount();
     }
 
     /**
@@ -732,12 +742,13 @@
      * its type). Can return {@link #PACKED_POSITION_VALUE_NULL} if no selection.
      * 
      * @return A packed position containing the currently selected group or
-     *         child's position and type. #PACKED_POSITION_VALUE_NULL if no selection.
+     *         child's position and type. #PACKED_POSITION_VALUE_NULL if no selection
+     *         or if selection is on a header or a footer item.
      */
     public long getSelectedPosition() {
         final int selectedPos = getSelectedItemPosition();
-        if (selectedPos == -1) return PACKED_POSITION_VALUE_NULL;
-        
+
+        // The case where there is no selection (selectedPos == -1) is also handled here.
         return getExpandableListPosition(selectedPos);
     }
     
@@ -921,13 +932,12 @@
 
     @Override
     ContextMenuInfo createContextMenuInfo(View view, int flatListPosition, long id) {
-        // Adjust for and handle for header views
-        final int adjustedPosition = flatListPosition - getHeaderViewsCount();
-        if (adjustedPosition < 0) {
-            // Return normal info for header view context menus
+        if (isHeaderOrFooterPosition(flatListPosition)) {
+            // Return normal info for header/footer view context menus
             return new AdapterContextMenuInfo(view, flatListPosition, id);
         }
 
+        final int adjustedPosition = flatListPosition - getHeaderViewsCount();
         PositionMetadata pm = mConnector.getUnflattenedPos(adjustedPosition);
         ExpandableListPosition pos = pm.position;
         pm.recycle();
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 6b669d8..54c4b36 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -28,6 +28,7 @@
 import android.os.SystemClock;
 import android.util.TypedValue;
 import android.view.MotionEvent;
+import android.widget.AbsListView.OnScrollListener;
 
 /**
  * Helper class for AbsListView to draw and control the Fast Scroll thumb
@@ -430,6 +431,7 @@
                 }
                 if (mList != null) {
                     mList.requestDisallowInterceptTouchEvent(true);
+                    mList.reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
                 }
 
                 cancelFling();
@@ -442,6 +444,7 @@
                     // be other classes that don't properly reset on touch-up,
                     // so do this explicitly just in case.
                     mList.requestDisallowInterceptTouchEvent(false);
+                    mList.reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
                 }
                 setState(STATE_VISIBLE);
                 final Handler handler = mHandler;
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index 9e930a5..be633be 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -938,6 +938,7 @@
                 child.setLayoutParams(p);
             }
             p.viewType = mAdapter.getItemViewType(0);
+            p.forceAdd = true;
 
             int childHeightSpec = getChildMeasureSpec(
                     MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 0, p.height);
@@ -1257,9 +1258,10 @@
         }
         p.viewType = mAdapter.getItemViewType(position);
 
-        if (recycled) {
+        if (recycled && !p.forceAdd) {
             attachViewToParent(child, where, p);
         } else {
+            p.forceAdd = false;
             addViewInLayout(child, where, p, true);
         }
 
diff --git a/core/java/android/widget/HeaderViewListAdapter.java b/core/java/android/widget/HeaderViewListAdapter.java
index b0e5f7e..981996a 100644
--- a/core/java/android/widget/HeaderViewListAdapter.java
+++ b/core/java/android/widget/HeaderViewListAdapter.java
@@ -34,6 +34,8 @@
 
     private ListAdapter mAdapter;
 
+    // These two ArrayList are assumed to NOT be null.
+    // They are indeed created when declared in ListView and then shared. 
     ArrayList<ListView.FixedViewInfo> mHeaderViewInfos;
     ArrayList<ListView.FixedViewInfo> mFooterViewInfos;
     boolean mAreAllFixedViewsSelectable;
@@ -55,11 +57,11 @@
     }
 
     public int getHeadersCount() {
-        return mHeaderViewInfos == null ? 0 : mHeaderViewInfos.size();
+        return mHeaderViewInfos.size();
     }
 
     public int getFootersCount() {
-        return mFooterViewInfos == null ? 0 : mFooterViewInfos.size();
+        return mFooterViewInfos.size();
     }
 
     public boolean isEmpty() {
@@ -132,12 +134,12 @@
         if (mAdapter != null && position >= numHeaders) {
             int adjPosition = position - numHeaders;
             int adapterCount = mAdapter.getCount();
-            if (adjPosition >= adapterCount && mFooterViewInfos != null) {
+            if (adjPosition >= adapterCount) {
                 return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable;
             } else {
                 return mAdapter.isEnabled(adjPosition);
             }
-        } else if (position < numHeaders && mHeaderViewInfos != null) {
+        } else if (position < numHeaders) {
             return mHeaderViewInfos.get(position).isSelectable;
         }
         return true;
@@ -148,12 +150,12 @@
         if (mAdapter != null && position >= numHeaders) {
             int adjPosition = position - numHeaders;
             int adapterCount = mAdapter.getCount();
-            if (adjPosition >= adapterCount && mFooterViewInfos != null) {
+            if (adjPosition >= adapterCount) {
                 return mFooterViewInfos.get(adjPosition - adapterCount).data;
             } else {
                 return mAdapter.getItem(adjPosition);
             }
-        } else if (position < numHeaders && mHeaderViewInfos != null) {
+        } else if (position < numHeaders) {
             return mHeaderViewInfos.get(position).data;
         }
         return null;
@@ -184,9 +186,7 @@
             int adjPosition = position - numHeaders;
             int adapterCount = mAdapter.getCount();
             if (adjPosition >= adapterCount) {
-                if (mFooterViewInfos != null) {
-                    return mFooterViewInfos.get(adjPosition - adapterCount).view;
-                }
+                return mFooterViewInfos.get(adjPosition - adapterCount).view;
             } else {
                 return mAdapter.getView(adjPosition, convertView, parent);
             }
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 233ce30..c81a907 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -183,6 +183,7 @@
             int scale = alpha + (alpha >> 7);
             if (mViewAlphaScale != scale) {
                 mViewAlphaScale = scale;
+                mColorMod = true;
                 applyColorMod();
             }
             return true;
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index 912dd5e..e3eb6db 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -140,6 +140,9 @@
     // allocating these thingies too often.
     private final ArrowScrollFocusResult mArrowScrollFocusResult = new ArrowScrollFocusResult();
 
+    // Keeps focused children visible through resizes
+    private FocusSelector mFocusSelector;
+    
     public ListView(Context context) {
         this(context, null);
     }
@@ -243,7 +246,7 @@
      * added. Views added using this call can take focus if they want.
      * <p>
      * NOTE: Call this before calling setAdapter. This is so ListView can wrap
-     * the supplied cursor with one that that will also account for header
+     * the supplied cursor with one that will also account for header and footer
      * views.
      *
      * @param v The view to add.
@@ -270,7 +273,7 @@
      * added. Views added using this call can take focus if they want.
      * <p>
      * NOTE: Call this before calling setAdapter. This is so ListView can wrap
-     * the supplied cursor with one that that will also account for header
+     * the supplied cursor with one that will also account for header and footer
      * views.
      *
      * @param v The view to add.
@@ -321,7 +324,7 @@
      * added. Views added using this call can take focus if they want.
      * <p>
      * NOTE: Call this before calling setAdapter. This is so ListView can wrap
-     * the supplied cursor with one that that will also account for header
+     * the supplied cursor with one that will also account for header and footer
      * views.
      *
      * @param v The view to add.
@@ -347,7 +350,7 @@
      * than once, the views will appear in the order they were added. Views added using
      * this call can take focus if they want.
      * <p>NOTE: Call this before calling setAdapter. This is so ListView can wrap the supplied
-     * cursor with one that that will also account for header views.
+     * cursor with one that will also account for header and footer views.
      *
      *
      * @param v The view to add.
@@ -1017,6 +1020,39 @@
         return sel;
     }
 
+    private class FocusSelector implements Runnable {
+        private int mPosition;
+        private int mPositionTop;
+        
+        public FocusSelector setup(int position, int top) {
+            mPosition = position;
+            mPositionTop = top;
+            return this;
+        }
+        
+        public void run() {
+            setSelectionFromTop(mPosition, mPositionTop);
+        }
+    }
+    
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        if (getChildCount() > 0) {
+            View focusedChild = getFocusedChild();
+            if (focusedChild != null) {
+                final int childPosition = mFirstPosition + indexOfChild(focusedChild);
+                final int childBottom = focusedChild.getBottom();
+                final int offset = Math.max(0, childBottom - (h - mPaddingTop));
+                final int top = focusedChild.getTop() - offset;
+                if (mFocusSelector == null) {
+                    mFocusSelector = new FocusSelector();
+                }
+                post(mFocusSelector.setup(childPosition, top));
+            }
+        }
+        super.onSizeChanged(w, h, oldw, oldh);
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         // Sets up mListPadding
@@ -1073,6 +1109,7 @@
             child.setLayoutParams(p);
         }
         p.viewType = mAdapter.getItemViewType(position);
+        p.forceAdd = true;
 
         int childWidthSpec = ViewGroup.getChildMeasureSpec(widthMeasureSpec,
                 mListPadding.left + mListPadding.right, p.width);
@@ -1707,10 +1744,11 @@
         }
         p.viewType = mAdapter.getItemViewType(position);
 
-        if (recycled || (p.recycledHeaderFooter &&
+        if ((recycled && !p.forceAdd) || (p.recycledHeaderFooter &&
                 p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)) {
             attachViewToParent(child, flowDown ? -1 : 0, p);
         } else {
+            p.forceAdd = false;
             if (p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
                 p.recycledHeaderFooter = true;
             }
diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java
index b11caa1..8469c8b 100644
--- a/core/java/android/widget/OverScroller.java
+++ b/core/java/android/widget/OverScroller.java
@@ -394,4 +394,56 @@
     public float getCurrVelocity() {
         return mCurrScroller.getCurrVelocity();
     }
+    
+    /**
+     * Extend the scroll animation. This allows a running animation to scroll
+     * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}.
+     *
+     * @param extend Additional time to scroll in milliseconds.
+     * @see #setFinalX(int)
+     * @see #setFinalY(int)
+     */
+    public void extendDuration(int extend) {
+        if (mScrollMode == MODE_DEFAULT) {
+            mDefaultScroller.extendDuration(extend);
+        }
+    }
+    
+    /**
+     * Sets the final position (X) for this scroller.
+     *
+     * @param newX The new X offset as an absolute distance from the origin.
+     * @see #extendDuration(int)
+     * @see #setFinalY(int)
+     */
+    public void setFinalX(int newX) {
+        if (mScrollMode == MODE_DEFAULT) {
+            if (newX < mMinimumX) {
+                mMinimumX = newX;
+            }
+            if (newX > mMaximumX) {
+                mMaximumX = newX;
+            }
+            mDefaultScroller.setFinalX(newX);
+        }
+    }
+    
+    /**
+     * Sets the final position (Y) for this scroller.
+     *
+     * @param newY The new Y offset as an absolute distance from the origin.
+     * @see #extendDuration(int)
+     * @see #setFinalX(int)
+     */
+    public void setFinalY(int newY) {
+        if (mScrollMode == MODE_DEFAULT) {
+            if (newY < mMinimumY) {
+                mMinimumY = newY;
+            }
+            if (newY > mMaximumY) {
+                mMaximumY = newY;
+            }
+            mDefaultScroller.setFinalY(newY);
+        }
+    }
 }
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index d4d9063..02cd6a8 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -204,7 +204,7 @@
         // If this is a custom view, then do not draw the bottom strips for
         // the tab indicators.
         if (tabSpec.mIndicatorStrategy instanceof ViewIndicatorStrategy) {
-            mTabWidget.setDrawBottomStrips(false);
+            mTabWidget.setStripEnabled(false);
         }
         mTabWidget.addView(tabIndicator);
         mTabSpecs.add(tabSpec);
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index aa47e6d..3328c13 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -16,6 +16,7 @@
 
 package android.widget;
 
+import android.R;
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
@@ -28,8 +29,6 @@
 import android.view.ViewGroup;
 import android.view.View.OnFocusChangeListener;
 
-
-
 /**
  *
  * Displays a list of tab labels representing each page in the parent's tab
@@ -41,17 +40,26 @@
  * handler, and manage callbacks. You might call this object to iterate the list
  * of tabs, or to tweak the layout of the tab list, but most methods should be
  * called on the containing TabHost object.
+ * 
+ * @attr ref android.R.styleable#TabWidget_divider
+ * @attr ref android.R.styleable#TabWidget_stripEnabled
+ * @attr ref android.R.styleable#TabWidget_stripLeft
+ * @attr ref android.R.styleable#TabWidget_stripRight
  */
 public class TabWidget extends LinearLayout implements OnFocusChangeListener {
-
-
     private OnTabSelectionChanged mSelectionChangedListener;
+
     private int mSelectedTab = 0;
+
     private Drawable mBottomLeftStrip;
     private Drawable mBottomRightStrip;
-    private boolean mStripMoved;
-    private Drawable mDividerDrawable;
+
     private boolean mDrawBottomStrips = true;
+    private boolean mStripMoved;
+
+    private Drawable mDividerDrawable;
+
+    private final Rect mBounds = new Rect();
 
     public TabWidget(Context context) {
         this(context, null);
@@ -63,13 +71,19 @@
 
     public TabWidget(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs);
-        initTabWidget();
 
         TypedArray a =
             context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TabWidget,
                     defStyle, 0);
 
+        mDrawBottomStrips = a.getBoolean(R.styleable.TabWidget_stripEnabled, true);
+        mDividerDrawable = a.getDrawable(R.styleable.TabWidget_divider);
+        mBottomLeftStrip = a.getDrawable(R.styleable.TabWidget_stripLeft);
+        mBottomRightStrip = a.getDrawable(R.styleable.TabWidget_stripRight);
+
         a.recycle();
+
+        initTabWidget();
     }
 
     @Override
@@ -100,19 +114,26 @@
         
         if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) {
             // Donut apps get old color scheme
-            mBottomLeftStrip = resources.getDrawable(
-                    com.android.internal.R.drawable.tab_bottom_left_v4);
-            mBottomRightStrip = resources.getDrawable(
-                    com.android.internal.R.drawable.tab_bottom_right_v4); 
+            if (mBottomLeftStrip == null) {
+                mBottomLeftStrip = resources.getDrawable(
+                        com.android.internal.R.drawable.tab_bottom_left_v4);
+            }
+            if (mBottomRightStrip == null) {
+                mBottomRightStrip = resources.getDrawable(
+                        com.android.internal.R.drawable.tab_bottom_right_v4);
+            }
         } else {
             // Use modern color scheme for Eclair and beyond
-            mBottomLeftStrip = resources.getDrawable(
-                    com.android.internal.R.drawable.tab_bottom_left);
-            mBottomRightStrip = resources.getDrawable(
-                    com.android.internal.R.drawable.tab_bottom_right); 
+            if (mBottomLeftStrip == null) {
+                mBottomLeftStrip = resources.getDrawable(
+                        com.android.internal.R.drawable.tab_bottom_left);
+            }
+            if (mBottomRightStrip == null) {
+                mBottomRightStrip = resources.getDrawable(
+                        com.android.internal.R.drawable.tab_bottom_right);
+            }
         }
 
-
         // Deal with focus, as we don't want the focus to go by default
         // to a tab other than the current tab
         setFocusable(true);
@@ -156,6 +177,8 @@
      */
     public void setDividerDrawable(Drawable drawable) {
         mDividerDrawable = drawable;
+        requestLayout();
+        invalidate();
     }
 
     /**
@@ -165,17 +188,73 @@
      */
     public void setDividerDrawable(int resId) {
         mDividerDrawable = mContext.getResources().getDrawable(resId);
+        requestLayout();
+        invalidate();
+    }
+    
+    /**
+     * Sets the drawable to use as the left part of the strip below the
+     * tab indicators.
+     * @param drawable the left strip drawable
+     */
+    public void setLeftStripDrawable(Drawable drawable) {
+        mBottomLeftStrip = drawable;
+        requestLayout();
+        invalidate();
     }
 
     /**
+     * Sets the drawable to use as the left part of the strip below the
+     * tab indicators.
+     * @param resId the resource identifier of the drawable to use as the
+     * left strip drawable
+     */
+    public void setLeftStripDrawable(int resId) {
+        mBottomLeftStrip = mContext.getResources().getDrawable(resId);
+        requestLayout();
+        invalidate();
+    }
+
+    /**
+     * Sets the drawable to use as the left part of the strip below the
+     * tab indicators.
+     * @param drawable the left strip drawable
+     */
+    public void setRightStripDrawable(Drawable drawable) {
+        mBottomLeftStrip = drawable;
+        requestLayout();
+        invalidate();    }
+
+    /**
+     * Sets the drawable to use as the left part of the strip below the
+     * tab indicators.
+     * @param resId the resource identifier of the drawable to use as the
+     * left strip drawable
+     */
+    public void setRightStripDrawable(int resId) {
+        mBottomLeftStrip = mContext.getResources().getDrawable(resId);
+        requestLayout();
+        invalidate();
+    }
+    
+    /**
      * Controls whether the bottom strips on the tab indicators are drawn or
      * not.  The default is to draw them.  If the user specifies a custom
      * view for the tab indicators, then the TabHost class calls this method
      * to disable drawing of the bottom strips.
-     * @param drawBottomStrips true if the bottom strips should be drawn.
+     * @param stripEnabled true if the bottom strips should be drawn.
      */
-    void setDrawBottomStrips(boolean drawBottomStrips) {
-        mDrawBottomStrips = drawBottomStrips;
+    public void setStripEnabled(boolean stripEnabled) {
+        mDrawBottomStrips = stripEnabled;
+        invalidate();
+    }
+
+    /**
+     * Indicates whether the bottom strips on the tab indicators are drawn
+     * or not.
+     */
+    public boolean isStripEnabled() {
+        return mDrawBottomStrips;
     }
 
     @Override
@@ -201,33 +280,28 @@
             return;
         }
 
-        View selectedChild = getChildTabViewAt(mSelectedTab);
+        final View selectedChild = getChildTabViewAt(mSelectedTab);
 
-        mBottomLeftStrip.setState(selectedChild.getDrawableState());
-        mBottomRightStrip.setState(selectedChild.getDrawableState());
+        final Drawable leftStrip = mBottomLeftStrip;
+        final Drawable rightStrip = mBottomRightStrip;
+
+        leftStrip.setState(selectedChild.getDrawableState());
+        rightStrip.setState(selectedChild.getDrawableState());
 
         if (mStripMoved) {
-            Rect selBounds = new Rect(); // Bounds of the selected tab indicator
-            selBounds.left = selectedChild.getLeft();
-            selBounds.right = selectedChild.getRight();
+            final Rect bounds = mBounds;
+            bounds.left = selectedChild.getLeft();
+            bounds.right = selectedChild.getRight();
             final int myHeight = getHeight();
-            mBottomLeftStrip.setBounds(
-                    Math.min(0, selBounds.left
-                                 - mBottomLeftStrip.getIntrinsicWidth()),
-                    myHeight - mBottomLeftStrip.getIntrinsicHeight(),
-                    selBounds.left,
-                    getHeight());
-            mBottomRightStrip.setBounds(
-                    selBounds.right,
-                    myHeight - mBottomRightStrip.getIntrinsicHeight(),
-                    Math.max(getWidth(),
-                            selBounds.right + mBottomRightStrip.getIntrinsicWidth()),
-                    myHeight);
+            leftStrip.setBounds(Math.min(0, bounds.left - leftStrip.getIntrinsicWidth()),
+                    myHeight - leftStrip.getIntrinsicHeight(), bounds.left, myHeight);
+            rightStrip.setBounds(bounds.right, myHeight - rightStrip.getIntrinsicHeight(),
+                    Math.max(getWidth(), bounds.right + rightStrip.getIntrinsicWidth()), myHeight);
             mStripMoved = false;
         }
 
-        mBottomLeftStrip.draw(canvas);
-        mBottomRightStrip.draw(canvas);
+        leftStrip.draw(canvas);
+        rightStrip.draw(canvas);
     }
 
     /**
diff --git a/core/java/com/android/internal/app/RingtonePickerActivity.java b/core/java/com/android/internal/app/RingtonePickerActivity.java
index 5a0fea3..ddddabe 100644
--- a/core/java/com/android/internal/app/RingtonePickerActivity.java
+++ b/core/java/com/android/internal/app/RingtonePickerActivity.java
@@ -276,6 +276,7 @@
     public void run() {
         
         if (mSampleRingtonePos == mSilentPos) {
+            mRingtoneManager.stopPreviousRingtone();
             return;
         }
         
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 1956b4e..d6b0808 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -16,7 +16,7 @@
 
 package com.android.internal.widget;
 
-import android.app.DevicePolicyManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.RemoteException;
diff --git a/common/java/com/android/common/ui/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
similarity index 99%
rename from common/java/com/android/common/ui/PointerLocationView.java
rename to core/java/com/android/internal/widget/PointerLocationView.java
index 7bdb0bc..999b27d 100644
--- a/common/java/com/android/common/ui/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -1,4 +1,4 @@
-package com.android.common.ui;
+package com.android.internal.widget;
 
 import android.content.Context;
 import android.graphics.Canvas;
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 8586aca..5546666 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -1036,7 +1036,7 @@
 
     result = vm->AttachCurrentThread(pEnv, (void*) &args);
     if (result != JNI_OK)
-        LOGE("ERROR: thread attach failed\n");
+        LOGI("NOTE: attach of thread '%s' failed\n", threadName);
 
     return result;
 }
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index 26d0e86..b93311b 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -63,6 +63,26 @@
 
 static jfieldID offset_db_handle;
 
+static void sqlLogger(void *databaseName, int iErrCode, const char *zMsg) {
+    LOGI("sqlite returned: error code = %d, msg = %s\n", iErrCode, zMsg);
+}
+
+// register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called.
+static void registerLoggingFunc() {
+    static bool loggingFuncSet = false;
+    if (loggingFuncSet) {
+        return;
+    }
+
+    LOGV("Registering sqlite logging func \n");
+    int err = sqlite3_config(SQLITE_CONFIG_LOG, &sqlLogger, 0);
+    if (err != SQLITE_OK) {
+        LOGE("sqlite_config failed error_code = %d. THIS SHOULD NEVER occur.\n", err);
+        return;
+    }
+    loggingFuncSet = true;
+}
+
 /* public native void dbopen(String path, int flags, String locale); */
 static void dbopen(JNIEnv* env, jobject object, jstring pathString, jint flags)
 {
@@ -72,6 +92,9 @@
     char const * path8 = env->GetStringUTFChars(pathString, NULL);
     int sqliteFlags;
 
+    // register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called.
+    registerLoggingFunc();
+
     // convert our flags into the sqlite flags
     if (flags & CREATE_IF_NECESSARY) {
         sqliteFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
@@ -143,7 +166,21 @@
     if (handle != NULL) sqlite3_close(handle);
 }
 
-void sqlTrace(void *databaseName, const char *sql) {
+static char *getDatabaseName(JNIEnv* env, sqlite3 * handle, jstring databaseName) {
+    char const *path = env->GetStringUTFChars(databaseName, NULL);
+    if (path == NULL) {
+        LOGE("Failure in getDatabaseName(). VM ran out of memory?\n");
+        return NULL; // VM would have thrown OutOfMemoryError
+    }
+    int len = strlen(path);
+    char *dbNameStr = (char *)malloc(len + 1);
+    strncpy(dbNameStr, path, len);
+    dbNameStr[len-1] = NULL;
+    env->ReleaseStringUTFChars(databaseName, path);
+    return dbNameStr;
+}
+
+static void sqlTrace(void *databaseName, const char *sql) {
     LOGI("sql_statement|%s|%s\n", (char *)databaseName, sql);
 }
 
@@ -151,21 +188,10 @@
 static void enableSqlTracing(JNIEnv* env, jobject object, jstring databaseName)
 {
     sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle);
-    char const *path = env->GetStringUTFChars(databaseName, NULL);
-    if (path == NULL) {
-        LOGE("Failure in enableSqlTracing(). VM ran out of memory?\n");
-        return; // VM would have thrown OutOfMemoryError
-    }
-    int len = strlen(path);
-    char *traceFuncArg = (char *)malloc(len + 1);
-    strncpy(traceFuncArg, path, len);
-    traceFuncArg[len-1] = NULL;
-    env->ReleaseStringUTFChars(databaseName, path);
-    sqlite3_trace(handle, &sqlTrace, (void *)traceFuncArg);
-    LOGI("will be printing all sql statements executed on database = %s\n", traceFuncArg);
+    sqlite3_trace(handle, &sqlTrace, (void *)getDatabaseName(env, handle, databaseName));
 }
 
-void sqlProfile(void *databaseName, const char *sql, sqlite3_uint64 tm) {
+static void sqlProfile(void *databaseName, const char *sql, sqlite3_uint64 tm) {
     double d = tm/1000000.0;
     LOGI("elapsedTime4Sql|%s|%.3f ms|%s\n", (char *)databaseName, d, sql);
 }
@@ -174,21 +200,10 @@
 static void enableSqlProfiling(JNIEnv* env, jobject object, jstring databaseName)
 {
     sqlite3 * handle = (sqlite3 *)env->GetIntField(object, offset_db_handle);
-    char const *path = env->GetStringUTFChars(databaseName, NULL);
-    if (path == NULL) {
-        LOGE("Failure in enableSqlProfiling(). VM ran out of memory?\n");
-        return; // VM would have thrown OutOfMemoryError
-    }
-    int len = strlen(path);
-    char *traceFuncArg = (char *)malloc(len + 1);
-    strncpy(traceFuncArg, path, len);
-    traceFuncArg[len-1] = NULL;
-    env->ReleaseStringUTFChars(databaseName, path);
-    sqlite3_profile(handle, &sqlProfile, (void *)traceFuncArg);
-    LOGI("will be printing execution time of all sql statements executed on database = %s\n",
-            traceFuncArg);
+    sqlite3_profile(handle, &sqlProfile, (void *)getDatabaseName(env, handle, databaseName));
 }
 
+
 /* public native void close(); */
 static void dbclose(JNIEnv* env, jobject object)
 {
diff --git a/core/jni/android_util_Log.cpp b/core/jni/android_util_Log.cpp
index 8316b03..6b97951 100644
--- a/core/jni/android_util_Log.cpp
+++ b/core/jni/android_util_Log.cpp
@@ -98,10 +98,10 @@
 
 /*
  * In class android.util.Log:
- *  public static native int println(int priority, String tag, String msg)
+ *  public static native int println_native(int buffer, int priority, String tag, String msg)
  */
-static jint android_util_Log_println(JNIEnv* env, jobject clazz,
-    jint priority, jstring tagObj, jstring msgObj)
+static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
+        jint bufID, jint priority, jstring tagObj, jstring msgObj)
 {
     const char* tag = NULL;
     const char* msg = NULL;
@@ -116,11 +116,21 @@
         return -1;
     }
 
+    if (bufID < 0 || bufID >= LOG_ID_MAX) {
+        jclass npeClazz;
+
+        npeClazz = env->FindClass("java/lang/NullPointerException");
+        assert(npeClazz != NULL);
+
+        env->ThrowNew(npeClazz, "bad bufID");
+        return -1;
+    }
+
     if (tagObj != NULL)
         tag = env->GetStringUTFChars(tagObj, NULL);
     msg = env->GetStringUTFChars(msgObj, NULL);
 
-    int res = android_writeLog((android_LogPriority) priority, tag, msg);
+    int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
 
     if (tag != NULL)
         env->ReleaseStringUTFChars(tagObj, tag);
@@ -135,7 +145,7 @@
 static JNINativeMethod gMethods[] = {
     /* name, signature, funcPtr */
     { "isLoggable",      "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },
-    { "println",      "(ILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println },
+    { "println_native",  "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
 };
 
 int register_android_util_Log(JNIEnv* env)
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 723205a..060ca50 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -185,7 +185,8 @@
 
 static void Surface_init(
         JNIEnv* env, jobject clazz, 
-        jobject session, jint pid, jint dpy, jint w, jint h, jint format, jint flags)
+        jobject session,
+        jint pid, jstring jname, jint dpy, jint w, jint h, jint format, jint flags)
 {
     if (session == NULL) {
         doThrow(env, "java/lang/NullPointerException");
@@ -195,7 +196,16 @@
     SurfaceComposerClient* client =
             (SurfaceComposerClient*)env->GetIntField(session, sso.client);
 
-    sp<SurfaceControl> surface(client->createSurface(pid, dpy, w, h, format, flags));
+    sp<SurfaceControl> surface;
+    if (jname == NULL) {
+        surface = client->createSurface(pid, dpy, w, h, format, flags);
+    } else {
+        const jchar* str = env->GetStringCritical(jname, 0);
+        const String8 name(str, env->GetStringLength(jname));
+        env->ReleaseStringCritical(jname, str);
+        surface = client->createSurface(pid, name, dpy, w, h, format, flags);
+    }
+
     if (surface == 0) {
         doThrow(env, OutOfResourcesException);
         return;
@@ -620,7 +630,7 @@
 
 static JNINativeMethod gSurfaceMethods[] = {
     {"nativeClassInit",     "()V",  (void*)nativeClassInit },
-    {"init",                "(Landroid/view/SurfaceSession;IIIIII)V",  (void*)Surface_init },
+    {"init",                "(Landroid/view/SurfaceSession;ILjava/lang/String;IIIII)V",  (void*)Surface_init },
     {"init",                "(Landroid/os/Parcel;)V",  (void*)Surface_initParcel },
     {"destroy",             "()V",  (void*)Surface_destroy },
     {"release",             "()V",  (void*)Surface_release },
diff --git a/core/res/res/drawable-hdpi/ic_jog_dial_vibrate_on.png b/core/res/res/drawable-hdpi/ic_jog_dial_vibrate_on.png
new file mode 100644
index 0000000..86caa07
--- /dev/null
+++ b/core/res/res/drawable-hdpi/ic_jog_dial_vibrate_on.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_search_dialog_voice_default.9.png b/core/res/res/drawable-mdpi/btn_search_dialog_voice_default.9.png
index 437fbc7..42be225 100644
--- a/core/res/res/drawable-mdpi/btn_search_dialog_voice_default.9.png
+++ b/core/res/res/drawable-mdpi/btn_search_dialog_voice_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_search_dialog_voice_pressed.9.png b/core/res/res/drawable-mdpi/btn_search_dialog_voice_pressed.9.png
index a679426..9984096 100644
--- a/core/res/res/drawable-mdpi/btn_search_dialog_voice_pressed.9.png
+++ b/core/res/res/drawable-mdpi/btn_search_dialog_voice_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_search_dialog_voice_selected.9.png b/core/res/res/drawable-mdpi/btn_search_dialog_voice_selected.9.png
index eb95f22..de2b030 100644
--- a/core/res/res/drawable-mdpi/btn_search_dialog_voice_selected.9.png
+++ b/core/res/res/drawable-mdpi/btn_search_dialog_voice_selected.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_jog_dial_vibrate_on.png b/core/res/res/drawable-mdpi/ic_jog_dial_vibrate_on.png
new file mode 100644
index 0000000..9aa9b13
--- /dev/null
+++ b/core/res/res/drawable-mdpi/ic_jog_dial_vibrate_on.png
Binary files differ
diff --git a/core/res/res/layout/google_web_content_helper_layout.xml b/core/res/res/layout/google_web_content_helper_layout.xml
deleted file mode 100644
index f16ffc9..0000000
--- a/core/res/res/layout/google_web_content_helper_layout.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:foregroundGravity="center"
-        android:measureAllChildren="false">
-        
-    <LinearLayout android:id="@+id/progressContainer"
-                  android:orientation="horizontal"
-                  android:layout_gravity="center"
-                  android:layout_width="wrap_content"
-                  android:layout_height="wrap_content"
-                  android:baselineAligned="false"
-                  android:paddingLeft="8dip"
-                  android:paddingTop="10dip"
-                  android:paddingRight="8dip"
-                  android:paddingBottom="10dip">
-
-        <ProgressBar android:id="@android:id/progress"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:max="10000"
-            android:layout_marginRight="12dip" />
-
-        <TextView android:id="@+id/message"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical" />
-    </LinearLayout>
-            
-    <WebView
-            android:id="@+id/web"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:visibility="invisible"
-            />
-    
-    <TextView
-            android:id="@+id/text"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:visibility="gone"
-            android:padding="10dip"
-            />
-    
-</FrameLayout> 
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 22cdd2c..16facee 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Umožňuje aplikaci povolit ladění jiné aplikace. Škodlivé aplikace mohou pomocí tohoto nastavení ukončit jiné aplikace."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"změna vašeho nastavení uživatelského rozhraní"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Umožňuje aplikaci změnit aktuální konfiguraci, např. národní prostředí či obecnou velikost písma."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"aktivovat režim V autě"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Umožňuje aplikaci aktivovat režim V autě."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"ukončit procesy na pozadí"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Umožňuje aplikaci ukončit procesy jiných aplikací běžící na pozadí i v případě, kdy je dostatek paměti."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"vynutit zastavení jiných aplikací"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Umožňuje aplikaci vynutit zastavení jiných aplikací."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"vynucení zavření aplikace"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Umožňuje aplikaci vynutit zavření a přesunutí libovolné činnosti v popředí na pozadí. Běžné aplikace by toto nastavení neměly nikdy využívat."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"načtení interního stavu systému"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Umožňuje změnu shromážděných statistických údajů o baterii. Není určeno pro běžné aplikace."</string>
     <string name="permlab_backup" msgid="470013022865453920">"ovládání zálohování a obnovy systému"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Umožňuje aplikaci ovládat systémový mechanizmus pro zálohování a obnovu dat. Není určeno pro běžné aplikace."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"zálohování a obnovení dat aplikace"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Umožňuje aplikaci podílet se na systémovém mechanizmu zálohování a obnovení."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"zobrazení nepovolených oken"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Umožňuje vytvoření oken, která mají být použita interním systémem uživatelského rozhraní. Běžné aplikace toto nastavení nepoužívají."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"zobrazení upozornění systémové úrovně"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Umožňuje držiteli vázat se na nejvyšší úroveň rozhraní pro zadávání dat. Běžné aplikace by toto nastavení nikdy neměly využívat."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vazba na tapetu"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Umožňuje držiteli navázat se na nejvyšší úroveň rozhraní tapety. Běžné aplikace by toto oprávnění nikdy neměly potřebovat."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"komunikovat se správcem zařízení"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Umožňuje držiteli oprávnění odesílat informace správci zařízení. Běžné aplikace by toto oprávnění nikdy neměly požadovat."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"změna orientace obrazovky"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Umožňuje aplikaci kdykoli změnit orientaci obrazovky. Běžné aplikace by toto nastavení nikdy neměly využívat."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"odeslání signálů Linux aplikacím"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Umožňuje aplikaci nainstalovat nové či aktualizované balíčky systému Android. Škodlivé aplikace mohou pomocí tohoto nastavení přidat nové aplikace s libovolnými oprávněními."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"smazání všech dat v mezipaměti aplikace"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Umožňuje aplikaci uvolnit paměť telefonu smazáním souborů v adresáři mezipaměti aplikace. Přístup je velmi omezený, většinou pouze pro systémové procesy."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"čtení systémových souborů protokolu"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Umožňuje aplikaci číst různé systémové soubory protokolů. Toto nastavení aplikaci umožní získat obecné informace o činnostech s telefonem, ale neměly by obsahovat žádné osobní či soukromé informace."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"čtení nebo zápis do prostředků funkce diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Umožňuje aplikaci změnit informace o vlastníkovi telefonu uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit informace o vlastníkovi."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"čtení informací o vlastníkovi"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Umožňuje aplikaci číst informace o vlastníkovi telefonu uložená v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení načíst informace o vlastníkovi."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"čtení dat kalendáře"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Umožňuje aplikaci načíst všechny události kalendáře uložené ve vašem telefonu. Škodlivé aplikace poté mohou dalším lidem odeslat události z vašeho kalendáře."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"zápis dat kalendáře"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Umožňuje aplikaci změnit události kalendáře uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit vaše data v kalendáři."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"simulace zdrojů polohy pro účely testování"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Vytváří simulované zdroje polohy pro účely testování. Škodlivé aplikace mohou pomocí tohoto nastavení změnit polohu či stav vrácený zdroji skutečné polohy, jako je např. jednotka GPS či poskytovatelé sítě."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"přístup k dalším příkazům poskytovatele polohy"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Umožňuje aplikaci připojit či odpojit souborové systémy ve vyměnitelných úložištích."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formátovat externí úložiště"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Umožňuje aplikaci formátovat vyměnitelná úložiště."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"získat informace o zabezpečeném úložišti"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Umožňuje aplikaci získat informace o zabezpečeném úložišti."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"vytvořit zabezpečené úložiště"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Umožňuje aplikaci vytvořit zabezpečené úložiště."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"zničit zabezpečené úložiště"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Umožňuje aplikaci zničit zabezpečené úložiště."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"připojit nebo odpojit zabezpečené úložiště"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Umožňuje aplikaci připojit nebo odpojit zabezpečené úložiště."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"přejmenovat zabezpečené úložiště"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Umožňuje aplikaci přejmenovat zabezpečeného úložiště."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"ovládání vibrací"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Umožňuje aplikaci ovládat vibrace."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"ovládání kontrolky"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Umožňuje aplikaci nastavit nápovědu pro velikost tapety systému."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"obnovení továrního nastavení systému"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Umožňuje aplikaci kompletně obnovit systém do továrního nastavení a vymazat všechna data, konfiguraci a nainstalované aplikace."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"nastavit čas"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Umožňuje aplikaci změnit čas hodin v telefonu."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"nastavení časového pásma"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Umožňuje aplikaci změnit časové pásmo telefonu."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"role služby AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"zápis nastavení názvu přístupového bodu (APN)"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Umožňuje aplikaci změnit nastavení APN, jako je například proxy či port APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"změna připojení k síti"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Umožňuje aplikaci změnit stav připojení k síti."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Umožňuje aplikaci změnit stav připojení k síti."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"změnit sdílené datové připojení"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Umožňuje aplikaci změnit stav sdíleného datového připojení k síti."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"změnit nastavení použití dat na pozadí"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Umožňuje aplikaci změnit nastavení použití dat na pozadí."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"zobrazení stavu WiFi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Umožní aplikaci zapisovat nová slova do uživatelského slovníku."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"změna/smazání obsahu karty SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umožní aplikaci zápis na kartu SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"přistupovat do souborového systému mezipaměti"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Umožňuje aplikaci číst a zapisovat do souborového systému mezipaměti."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Omezení hesla"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Omezuje typ hesel, která lze použít."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Sledování pokusů o přihlášení"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Sleduje nezdařené pokusy o přihlášení do zařízení a umožňuje provedení určité akce."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Obnovení hesla"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Vynutí nastavení hesla na novou hodnotu, kterou vám před přihlášením musí sdělit správce."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Vynucení uzamčení"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Určuje, kdy dojde k uzamčení zařízení a bude požadováno opětovné zadání hesla."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Vymazání všech dat"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Bez dalšího potvrzení obnoví výchozí nastavení z výroby a smaže všechna data."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Domů"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"pomocí <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> pomocí <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Zadejte kód PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Zadejte heslo pro odblokování"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Nesprávný kód PIN"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Chcete-li telefon odemknout, stiskněte Menu a poté 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Číslo tísňové linky"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Telefon odemknete stisknutím tlačítka Menu."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Odblokujte pomocí gesta"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Tísňové volání"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Správně!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Zkuste to prosím znovu"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Nabíjení (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odemknout"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Zapnout zvuk"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Vypnout zvuk"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Vymazat"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky Prohlížeče."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zápis do historie a záložek Prohlížeče"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umožní aplikaci změnit historii či záložky prohlížeče uložené v telefonu. Škodlivé aplikace mohou pomocí tohoto nastavení vymazat či pozměnit data Prohlížeče."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Změnit oprávnění prohlížeče poskytovat informace o zeměpisné poloze"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Umožňuje aplikaci změnit oprávnění prohlížeče poskytovat informace o zeměpisné poloze. Škodlivé aplikace mohou toto nastavení použít k odesílání informací o umístění na libovolné webové stránky."</string>
     <string name="save_password_message" msgid="767344687139195790">"Chcete, aby si prohlížeč zapamatoval toto heslo?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Nyní ne"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Zapamatovat"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"před 1 hodinou"</item>
     <item quantity="other" msgid="2467273239587587569">"před <xliff:g id="COUNT">%d</xliff:g> hod."</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"včera"</item>
     <item quantity="other" msgid="2479586466153314633">"před <xliff:g id="COUNT">%d</xliff:g> dny"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Nejsou vyžadována žádná oprávnění"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Skrýt"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Zobrazit vše"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Načítání..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Úložiště USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB připojeno"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Připojili jste svůj telefon k počítači pomocí USB. Vyberte možnost Připojit, chcete-li zkopírovat soubory mezi vaším počítačem a kartou SD v telefonu."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Připojit"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Nepřipojovat"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Připojili jste svůj telefon k počítači pomocí USB. Chcete-li kopírovat soubory z počítače na kartu SD v zařízení Android či obráceně, vyberte následující tlačítko."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Zapnout úložiště USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Při používání vaší karty SD jako úložiště USB došlo k problému."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB připojeno"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Vyberte, chcete-li kopírovat soubory do nebo z počítače."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Vypnout úložiště USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Vyberte, chcete-li vypnout úložiště USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Vypnout úložiště USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Před vypnutím úložiště USB se přesvědčte, zda byl hostitel USB odpojen. Úložiště USB vypnete volbou Vypnout."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Vypnout"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Zrušit"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Při vypínání úložiště USB došlo k problémům. Zkontrolujte, zda byl hostitel USB odpojen, a zkuste to znovu."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Úložiště USB je používáno"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Před vypnutím úložiště USB zkontrolujte, zda jste odpojili (vyjmuli) kartu SD zařízení Android z počítače."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Vypnout úložiště USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Při vypínání úložiště USB došlo k problémům. Zkontrolujte, zda byl hostitel USB odpojen, a zkuste to znovu."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formátovat kartu SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Opravdu chcete kartu SD naformátovat? Všechna data na kartě budou ztracena."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formátovat"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Nebyly nalezeny žádné odpovídající aktivity."</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"aktualizovat statistiku použití součástí"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Umožňuje změnu shromážděných statistických údajů o použití součástí. Není určeno pro běžné aplikace."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Umožňuje volat výchozí službu kontejneru ke zkopírování obsahu. Běžné aplikace by toto oprávnění neměly používat."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Umožňuje volat výchozí službu kontejneru ke zkopírování obsahu. Běžné aplikace by toto oprávnění neměly používat."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Poklepáním můžete ovládat přiblížení"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Chyba při spouštění widgetu"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Přejít"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Vytvořit kontakt"\n"pro <xliff:g id="NUMBER">%s</xliff:g>."</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"Zaškrtnuto"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"Nezaškrtnuto"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Následující aplikace požadují oprávnění k přístupu do vašeho účtu (nyní i v budoucnu)."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Chcete tento požadavek povolit?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Požadavek na přístup"</string>
     <string name="allow" msgid="7225948811296386551">"Povolit"</string>
     <string name="deny" msgid="2081879885755434506">"Odepřít"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Požadováno oprávnění"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protokol L2TP (Layer 2 Tunneling Protocol)"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Síť VPN L2TP/IPSec s předsdíleným klíčem"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Síť VPN L2TP/IPSec s certifikátem"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Zvolit soubor"</string>
+    <string name="reset" msgid="2448168080964209908">"Resetovat"</string>
+    <string name="submit" msgid="1602335572089911941">"Odeslat"</string>
+    <string name="description_star" msgid="2654319874908576133">"oblíbené"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Sdílené datové připojení prostřednictvím portu USB je k dispozici"</string>
+    <string name="tether_message" msgid="554549994538298101">"Chcete-li sdílet datové připojení telefonu s počítačem, vyberte možnost Sdílet datové připojení."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Sdílet datové připojení"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Zrušit"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Při sdílení datového připojení došlo k chybě."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Sdílené datové připojení prostřednictvím portu USB je k dispozici"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Tuto možnost vyberte, chcete-li sdílet datové připojení telefonu s počítačem."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Zrušit sdílení datového připojení"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Výběrem této možnost zrušíte sdílení datového připojení s počítačem."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Odpojit sdílené datové připojení"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Mobilní datové připojení telefonu je sdíleno s počítačem. Chcete-li sdílení prostřednictvím portu  USB zrušit, vyberte možnost Odpojit."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Odpojit"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Zrušit"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Při ukončování sdíleného datového připojení došlo k chybě. Zkuste to prosím znovu."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4e49363..35ab012 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillader, at et program slår fejlretning af andet program til. Ondsindede programmer kan bruge dette til at standse andre programmer."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"skift indstillinger for brugergrænsefladen"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillader, at et program ændrer den nuværende konfiguration, f.eks. den lokale eller overordnede skrifttypestørrelse."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"aktivere biltilstand"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillader et program at aktivere biltilstand."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"standse baggrundsprocesser"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillader et program at standse andre programmers baggrundsprocesser, selvom der ikke er mangel på hukommelse."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"tvangsstandse andre programmer"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillader, at et program tvangsstopper andre programmer."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"tving programmet til at lukke"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Tillader, at et program tvinger alle programmer, der er i forgrunden, til at lukke og køre i baggrunden. Bør aldrig være nødvendigt til normale programmer."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"hent intern systemtilstand"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Tillader ændring af indsamlede batteristatistikker. Ikke til brug for normale programmer."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontroller sikkerhedskopiering af system, og gendan"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Tillader, at et program kontrollerer systemets sikkerhedskopierings- og gendannelsesfunktion. Ikke til brug til normale programmer."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"sikkerhedskopier og gendan programmets data"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Tillader, at et program deltager i systemets sikkerhedskopierings- og gendannelsesfunktion."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserede vinduer"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillader oprettelse af vinduer, der er beregnet til at blive brugt af den interne systembrugergrænseflade. Ikke til brug for normale programmer."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vis underretninger på systemniveau"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tillader, at brugeren forpligter sig til en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"forpligt til et tapet"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Tillader, at brugeren forpligter sig til et tapets grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommunikere med en enhedsadministrator"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillader brugeren at sende hensigter til en enhedsadministrator. Bør aldrig være nødvendigt for almindelige programmer."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"skift skærmretning"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Tillader, at et program ændrer rotationen af skærmen når som helst. Bør aldrig være nødvendigt til normale programmer."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"send Linux-signaler til programmer"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Tillader, at et program installerer nye eller opdaterede Android-pakker. Ondsindede programmer kan bruge dette til at tilføje nye programmer med vilkårlige, effektive tilladelser."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"slet alle cachedata for programmet"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Tillader, at et program frigør plads på telefonen ved at slette filer i programmets cachemappe. Adgang er normalt meget begrænset til systemprocesser."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"læs systemlogfiler"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Tillader, at et program læser fra systemets forskellige logfiler. Dermed kan generelle oplysninger om, hvad du laver med telefonen, registreres, men logfilerne bør ikke indeholde personlige eller private oplysninger."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"læs/skriv til ressourcer ejet af diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Tillader, at et program ændrer rtelefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre ejerdata."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"læs ejerdata"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Tillader, at et program læser telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at læse ejerdata."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"læs kalenderdata"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Tillader, at et program læser alle kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine kalenderbegivenheder til andre mennesker."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"skriv kalenderdata"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Tillader, at et program ændrer de kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kalenderdata."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"imiterede placeringskilder til test"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Opret imiterede placeringskilder til testning. Ondsindede programmer kan bruge dette til at tilsidesætte den returnerede placering og/eller status fra rigtige placeringskilder som f.eks. GPS eller netværksudbydere."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få adgang til ekstra kommandoer for placeringsudbyder"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Tillader, at programmet monterer eller demonterer filsystemer til flytbar lagring."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formater ekstern lagring"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Tillader, at et program formaterer flytbart lager."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"hente oplysninger om sikkert lager"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Tillader programmet at få oplysninger om sikkert lager."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"opret sikkert lager"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Tillader programmet at oprette sikkert lager."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"ødelægge sikkert lager"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Tillader programmet at ødelægge sikkert lager."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montere/demontere sikkert lager"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Tillader programmet at montere/demontere sikkert lager."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"omdøbe sikkert lager"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Tillader programmet at omdøbe sikkert lager."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontroller vibrator"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Lader programmet kontrollere vibratoren."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kontroller lommelygte"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Tillader, at programmet opsætter størrelsestip for systemets tapet."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"nulstil system til fabriksstandarder"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Tillader, at et program nulstiller systemet fuldstændig til fabriksindstillingerne, sletter alle data, konfigurationer og installerede programmer."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"angive tid"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Tillader, at et program ændrer telefonens klokkeslæt."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"angiv tidszone"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Tillader, at et program ændrer telefonens tidszone."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"fungerer som kontoadministrationstjeneste"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"skriv indstillinger for adgangspunktnavn"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Tillader, at et program ændrer APN-indstillingerne, f.eks. enhver APNs Proxy og Port."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"skift netværksforbindelse"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Tillader, at et program ændrer netværksforbindelsens tilstand."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Tillader, at et program ændrer netværksforbindelsens tilstand."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"skifte tethering-forbindelse"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Tillader, at et program ændrer tilstand for et bundet netværk."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"skift brugerindstilling for baggrundsdata"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Tillader, at et program ændrer brugerindstillingerne for baggrundsdata."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"vis Wi-Fi-tilstand"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Tillader, at et program skriver nye ord i brugerordbogen."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"ret/slet indholdet på SD-kortet"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Tillader, at et program skriver til SD-kortet."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"få adgang til cache-filsystemet"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillader, at et program læser og skriver til cache-filsystemet."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Begræns adgangskode"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Begræns de adgangskodetyper, du har tilladelse til at bruge."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Vis forsøg på at logge ind"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Overvåg mislykkede forsøg på at logge ind på enheden for at foretage en handling."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Nulstil adgangskode"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Tving din adgangskode til en ny værdi. Dette kræver, at administratoren giver den til dig, før du kan kogge ind."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Tvangslås"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Kontrol når enheden låses, så du skal indtaste adgangskoden igen."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Slet alle data"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Foretag en fabriksnulstilling, der sletter alle dine data uden bekræftelse."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Hjem"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Indtast PIN-kode"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Indtast adgangskode for at låse op"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Forkert PIN-kode!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Tryk på Menu og dernæst på 0 for at låse op."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nødnummer"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryk på Menu for at låse op."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn oplåsningsmønster"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Nødopkald"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Rigtigt!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Beklager! Prøv igen"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Oplader (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås op"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd slået til"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Lyd slået fra"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ryd"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillader, at programmet læser alle de webadresser, browseren har besøgt, og alle browserens bogmærker."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skriv browserens oversigt og bogmærker"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Tillader, at et program ændrer browseroversigten eller bogmærker, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre din browsers data."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Skift browsertilladelser for geografisk placering"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Giver et program tilladelse til at ændre browserens tilladelser for geografisk placering. Skadelige programmer kan bruge dette til at tillade, at placeringsoplysninger sendes til vilkårlige websteder."</string>
     <string name="save_password_message" msgid="767344687139195790">"Ønsker du, at browseren skal huske denne adgangskode?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Ikke nu"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Husk"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"For 1 time siden"</item>
     <item quantity="other" msgid="2467273239587587569">"For <xliff:g id="COUNT">%d</xliff:g> timer siden"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"i går"</item>
     <item quantity="other" msgid="2479586466153314633">"For <xliff:g id="COUNT">%d</xliff:g> dage siden"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Der kræves ingen tilladelser"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Skjul"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Vis alle"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Indlæser ..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-masselagring"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB er tilsluttet"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Du har forbundet din telefon til din computer via USB. Vælg \"Monter\", hvis du ønsker at kopiere filer mellem din computer og din telefons SD-kort."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Monter"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Indsæt ikke"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Du har forbundet din telefon til din computer via USB. Vælg knappen nedenfor, hvis du ønsker at kopiere filer mellem din computer og din Androids SD-kort."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Slå USB-lagringen til"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Der opstod et problem med at bruge dit SD-kort til USB-lagring."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB er tilsluttet"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Vælg for at kopiere filer til/fra din computer."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Slå USB-lagringen fra"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Vælg for at slå USB-lagring fra."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Slå USB-lagring fra"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Inden du slår USB-lagringen fra, skal du sørge for, at USB-værten er demonteret. Vælg \"Slå fra\" for at slå USB-lagringen fra."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Slå fra"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Annuller"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Der opstod et problem med at slå USB-lagringen fra. Sørg for, at du har demonteret USB-værten, og prøv så igen."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-lager i brug"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Sørg for, at du har demonteret (\"udskubbet\") din Androids SD-kort fra computeren, før du slår USB-lagring fra."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Slå USB-lagring fra"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Der opstod et problem med at slå USB-lagringen fra. Sørg for, at du har demonteret USB-værten, og prøv så igen."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formater SD-kort"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Er du sikker på, du ønsker at formatere SD-kortet? Alle data på kortet mistes."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formater"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Der blev ikke fundet nogen matchende aktiviteter"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"opdater brugerstatistikker for komponenter"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Tillader ændring af indsamlede brugerstatistikker for komponenter. Ikke til brug til normale programmer."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Tillader kald af standardcontainertjeneste for at kopiere indhold. Ikke til brug for almindelige programmer."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Tillader kald af standardcontainertjeneste for at kopiere indhold. Ikke til brug for almindelige programmer."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tryk to gange for zoomkontrol"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Der opstod en fejl under forøgelsen af widgetten"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Gå"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Opret kontakt"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"kontrolleret"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"ikke kontrolleret"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Følgende programmer anmoder om tilladelse til at få adgang til din konto nu og i fremtiden."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Vil du tillade denne anmodning?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Adgangsanmodning"</string>
     <string name="allow" msgid="7225948811296386551">"Tillad"</string>
     <string name="deny" msgid="2081879885755434506">"Afvis"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Der er anmodet om tilladelse"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Layer 2 Tunneling Protocol"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN baseret på forhåndsdelt nøglekodning"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certifikatbaseret L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Vælg fil"</string>
+    <string name="reset" msgid="2448168080964209908">"Nulstil"</string>
+    <string name="submit" msgid="1602335572089911941">"Send"</string>
+    <string name="description_star" msgid="2654319874908576133">"favorit"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-binding tilgængelig"</string>
+    <string name="tether_message" msgid="554549994538298101">"Vælg \"Tether\" hvis du vil dele telefonens dataforbindelse med computeren."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Bind"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Annuller"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Der er opstået et problem med tethering."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-binding tilgængelig"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Vælg tehtering af computeren og telefonen."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Fjern tethering"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Vælg at fjerne tethering fra computeren."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Afbryd binding"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Du har delt telefonens mobildataforbindelse med computeren. Vælg \"Afbryd\" for at afbryde USB-tethering."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Afbryd"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Annuller"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Der opstod et problem med at slå bindingen fra. Prøv igen."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index a52e8bf..f332937 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -130,8 +130,8 @@
     <string name="global_action_lock" msgid="2844945191792119712">"Bildschirmsperre"</string>
     <string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string>
     <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lautlos"</string>
-    <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ton ist bereits AUS"</string>
-    <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ton ist momentan AN"</string>
+    <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ton ist AUS"</string>
+    <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ton ist AN"</string>
     <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Flugmodus"</string>
     <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Flugmodus ist AN"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Flugmodus ist AUS"</string>
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Ermöglicht einer Anwendung, die Fehlerbeseitigung für eine andere Anwendung zu aktivieren. Schädliche Anwendungen können so andere Anwendungen löschen."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI-Einstellungen ändern"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Ermöglicht einer Anwendung, die aktuelle Konfiguration zu ändern, etwa das Gebietsschema oder die Schriftgröße."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"Automodus aktivieren"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Ermöglicht einer Anwendung, den Automodus zu aktivieren."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"Hintergrundprozesse beenden"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Ermöglicht einer Anwendung, Hintergrundprozesse anderer Anwendungen auch bei ausreichendem Speicher zu beenden."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"Beenden anderer Anwendungen erzwingen"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Ermöglicht einer Anwendung, das Beenden anderer Anwendungen zu erzwingen."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"Schließen von Anwendung erzwingen"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Ermöglicht einer Anwendung, alle Aktivitäten, die im Vordergrund ablaufen, zu beenden und in den Hintergrund zu schieben. Sollte nicht für normale Anwendungen benötigt werden."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"Systeminternen Status abrufen"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Ermöglicht die Änderung von gesammelten Akku-Daten. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_backup" msgid="470013022865453920">"Systemsicherung und -wiederherstellung kontrollieren"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Der Anwendung wird die Steuerung des Sicherungs- und Wiederherstellungsmechanismus des Systems ermöglicht. Nicht für normale Anwendungen vorgesehen."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"Anwendungsdaten sichern und wiederherstellen"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Der Anwendung wird die Teilnahme am Sicherungs- und Wiederherstellungsmechanismus des Systems ermöglicht."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"nicht autorisierte Fenster anzeigen"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Ermöglicht die Erstellung von Fenstern, die von der Benutzeroberfläche des internen Systems verwendet werden. Nicht für normale Anwendungen geeignet."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"Warnungen auf Systemebene anzeigen"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"An ein Hintergrundbild binden"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Ermöglicht dem Halter, sich an die Oberfläche einer Eingabemethode auf oberster Ebene zu binden. Sollte nie für normale Anwendungen benötigt werden."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"Interaktion mit einem Geräteadministrator"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Ermöglicht dem Halter, Intents an einen Geräteadministrator zu senden. Sollte nie für normale Anwendungen benötigt werden."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"Bildschirmausrichtung ändern"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Ermöglicht der Anwendung, die Bildschirmdrehung jederzeit zu ändern. Sollte nicht für normale Anwendungen benötigt werden."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Linux-Signale an Anwendungen senden"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Ermöglicht einer Anwendung, neue oder aktualisierte Android-Pakete zu installieren. Schädliche Anwendungen können so neue Anwendungen mit beliebig umfangreichen Berechtigungen hinzufügen."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"Alle Cache-Daten der Anwendung löschen"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Ermöglicht einer Anwendung, Telefonspeicher durch das Löschen von Dateien im Cache-Verzeichnis der Anwendung freizugeben. Der Zugriff beschränkt sich in der Regel auf Systemprozesse."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"System-Protokolldateien lesen"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Ermöglicht einer Anwendung, die verschiedenen Protokolldateien des Systems zu lesen. So können allgemeine Informationen zu den auf Ihrem Telefon durchgeführten Aktionen eingesehen werden, diese sollten jedoch keine persönlichen oder geheimen Daten enthalten."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"Lese-/Schreibberechtigung für zu Diagnosegruppe gehörige Elemente"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Ermöglicht einer Anwendung, die auf Ihrem Telefon gespeicherten Eigentümerdaten zu ändern. Schädliche Anwendungen können so Eigentümerdaten löschen oder verändern."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"Eigentümerdaten lesen"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Ermöglicht einer Anwendung, die auf Ihrem Telefon gespeicherten Eigentümerdaten zu lesen. Schädliche Anwendungen können so Eigentümerdaten lesen."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"Kalenderdaten lesen"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Ermöglicht einer Anwendung, alle auf Ihrem Telefon gespeicherten Kalenderereignisse zu lesen. Schädliche Anwendungen können so Ihre Kalenderereignisse an andere Personen senden."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"Kalenderdaten schreiben"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Ermöglicht einer Anwendung, die auf Ihrem Telefon gespeicherten Kalenderereignisse zu ändern. Schädliche Anwendungen können so Ihre Kalenderdaten löschen oder verändern."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"Falsche Standortquellen für Testzwecke"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Erstellt falsche Standortquellen für Testzwecke. Schädliche Anwendungen können so den von den echten Standortquellen wie GPS oder Netzwerkanbieter zurückgegebenen Standort und/oder Status überschreiben."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Auf zusätzliche Dienstanbieterbefehle für Standort zugreifen"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Ermöglicht der Anwendung, Dateisysteme für austauschbare Speicherplätze bereitzustellen oder die Bereitstellung aufzuheben."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"Externen Speicher formatieren"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Erlaubt der Anwendung, austauschbaren Speicher zu formatieren."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"Informationen zum sicheren Speicher abrufen"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Ermöglicht der Anwendung, Informationen zum sicheren Speicher abzurufen."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"Sicheren Speicher erstellen"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Ermöglicht der Anwendung, einen sicheren Speicher zu erstellen."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"Sicheren Speicher entfernen"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Ermöglicht der Anwendung, den sicheren Speicher zu entfernen."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"Sicheren Speicher bereitstellen/trennen"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Ermöglicht der Anwendung, sicheren Speicher bereitzustellen bzw. zu trennen."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"Sicheren Speicher umbenennen"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Ermöglicht der Anwendung, den sicheren Speicher umzubenennen."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"Vibrationsalarm steuern"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Ermöglicht der Anwendung, den Vibrationsalarm zu steuern."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"Lichtanzeige steuern"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Ermöglicht der Anwendung, die Größenhinweise für das Hintergrundbild festzulegen."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"System auf Werkseinstellung zurücksetzen"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Ermöglicht einer Anwendung, das System komplett auf Werkseinstellung zurückzusetzen. Hierbei werden alle Daten, Konfigurationen und installierten Anwendungen gelöscht."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"Zeit einstellen"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Ermöglicht einer Anwendung, die Uhrzeit des Telefons zu ändern."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"Zeitzone festlegen"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Ermöglicht einer Anwendung, die Zeitzone des Telefons zu ändern."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"Als Konto-Manager fungieren"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"Einstellungen für Zugriffspunktname schreiben"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Ermöglicht einer Anwendung, die APN-Einstellungen wie Proxy und Port eines Zugriffspunkts zu ändern."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"Netzwerkkonnektivität ändern"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Ermöglicht einer Anwendung, den Status der Netzwerkkonnektivität zu ändern."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Ermöglicht einer Anwendung, den Status der Netzwerkkonnektivität zu ändern."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"Tethering-Konnektivität ändern"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Ermöglicht einer Anwendung, den Status der Tethering-Konnektivität zu ändern."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"Einstellung zur Verwendung von Hintergrunddaten ändern"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Ermöglicht einer Anwendung, die Einstellung der Verwendung von Hintergrunddaten zu ändern."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"WLAN-Status anzeigen"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Erlaubt einer Anwendung, neue Wörter in das Wörterbuch des Nutzers zu schreiben."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD-Karten-Inhalt ändern/löschen"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Ermöglicht einer Anwendung, auf die SD-Karte zu schreiben"</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Zugriff auf das Cache-Dateisystem"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Gewährt einer Anwendung Lese- und Schreibzugriff auf das Cache-Dateisystem."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Passwort beschränken"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Beschränken der erlaubten Passworttypen"</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Anmeldeversuche überwachen"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Fehlgeschlagene Versuche·zum Anmelden/Durchführen einer Aktion überwachen"</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Passwort zurücksetzen"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Festlegen eines neuen Werts für Ihr Passwort, sodass der Administrator es Ihnen vor dem Anmelden übermitteln muss."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Sperren erzwingen"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Steuerung der Gerätesperre; erfordert die erneute Passworteingabe"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Alle Daten löschen"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Zurücksetzen auf die Werkseinstellungen. Dabei werden alle Ihre Daten ohne Nachfrage gelöscht."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Privat"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"über <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> über <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN-Code eingeben"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Passwort zum Entsperren eingeben"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Falscher PIN-Code!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Drücken Sie zum Entsperren die Menütaste und dann auf \"0\"."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Notrufnummer"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Zum Entsperren die Menütaste drücken"</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Schema für Entsperrung zeichnen"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Notruf"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Tut uns leid. Versuchen Sie es noch einmal."</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Wird geladen (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Entsperren"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ton ein"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Ton aus"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Löschen"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Ermöglicht der Anwendung, alle URLs, die mit dem Browser besucht wurden, sowie alle Lesezeichen des Browsers zu lesen."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Browserverlauf und Lesezeichen schreiben"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Ermöglicht einer Anwendung, den auf Ihrem Telefon gespeicherten Browserverlauf und die Lesezeichen zu ändern. Schädliche Anwendungen können so Ihre Browserdaten löschen oder ändern."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Geolokalisierungsberechtigungen des Browsers ändern"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Ermöglicht einer Anwendung, die Geolokalisierungsberechtigungen des Browsers zu ändern. Schädliche Anwendungen können dies nutzen, um das Senden von Standortinformationen an willkürliche Websites zuzulassen."</string>
     <string name="save_password_message" msgid="767344687139195790">"Möchten Sie, dass der Browser dieses Passwort speichert?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Nicht jetzt"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Speichern"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"Vor 1 Stunde"</item>
     <item quantity="other" msgid="2467273239587587569">"Vor <xliff:g id="COUNT">%d</xliff:g> Stunden"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"Gestern"</item>
     <item quantity="other" msgid="2479586466153314633">"Vor <xliff:g id="COUNT">%d</xliff:g> Tagen"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Keine Berechtigungen erforderlich"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ausblenden"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Alle anzeigen"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Ladevorgang läuft..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-Massenspeicher"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB-Verbindung"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Sie haben Ihr Telefon über einen USB-Anschluss mit Ihrem Computer verbunden. Wählen Sie \"Bereitstellen\", wenn Sie Dateien auf Ihren Computer oder die SD-Karte Ihres Telefons kopieren möchten."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Bereitstellen"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Nicht bereitstellen"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Sie haben Ihr Telefon über USB mit Ihrem Computer verbunden. Wählen Sie die Schaltfläche unten aus, wenn Sie Dateien auf Ihren Computer oder die SD-Karte Ihres Android-Geräts kopieren möchten."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB-Speicher aktivieren"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Bei der Verwendung Ihrer SD-Karte als USB-Speicher ist ein Problem aufgetreten."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-Verbindung"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Wählen Sie die Dateien aus, die von Ihrem oder auf Ihren Computer kopiert werden sollen."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB-Speicher deaktivieren"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Auswählen, um USB-Speicher zu deaktivieren."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"USB-Speicher deaktivieren"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Bevor Sie den USB-Speicher deaktivieren, stellen Sie sicher, dass Sie Ihn vom USB-Host getrennt haben. Wählen Sie \"Deaktivieren\", um den USB-Speicher zu deaktivieren."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Ausschalten"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Abbrechen"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Beim Deaktivieren des USB-Speichers wurde ein Problem festgestellt. Überprüfen Sie, ob Sie den USB-Host getrennt haben, und versuchen Sie es erneut."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-Speicher in Verwendung"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Stellen Sie vor dem Deaktivieren des USB-Speichers sicher, dass Sie Ihre Android-SD-Karte von Ihrem Computer getrennt (\"ausgeworfen\") haben."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB-Speicher deaktivieren"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Beim Deaktivieren des USB-Speichers ist ein Problem aufgetreten. Überprüfen Sie, ob Sie den USB-Host getrennt haben, und versuchen Sie es erneut."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"SD-Karte formatieren"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Möchten Sie die SD-Karte wirklich formatieren? Alle Daten auf Ihrer Karte gehen dann verloren."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Keine passenden Aktivitäten gefunden"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"Nutzungsstatistik der Komponente aktualisieren"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Ermöglicht die Änderung von gesammelten Nutzungsstatistiken der Komponente. Nicht für normale Anwendungen vorgesehen."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Ermöglicht das Aufrufen des Standard-Containerdienstes zum Kopieren von Inhalt. Keine Verwendung bei normalen Anwendungen."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Ermöglicht das Aufrufen des Standard-Containerdienstes zum Kopieren von Inhalt. Keine Verwendung bei normalen Anwendungen."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Für Zoomeinstellung zweimal berühren"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Fehler beim Vergrößern des Widgets"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Los"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Neuer Kontakt"\n"mit <xliff:g id="NUMBER">%s</xliff:g> erstellen"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"aktiviert"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"nicht aktiviert"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Die folgenden Anwendungen benötigen die Berechtigung zum aktuellen und zukünftigen Zugriff auf Ihr Konto."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Möchten Sie diese Anfrage zulassen?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Zugriffsanfrage"</string>
     <string name="allow" msgid="7225948811296386551">"Zulassen"</string>
     <string name="deny" msgid="2081879885755434506">"Ablehnen"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Berechtigung angefordert"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Layer-2-Tunneling-Protokoll"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec-VPN mit vorinstalliertem Schlüssel"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Zertifikat mit vorinstalliertem Schlüssel"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Datei auswählen"</string>
+    <string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string>
+    <string name="submit" msgid="1602335572089911941">"Senden"</string>
+    <string name="description_star" msgid="2654319874908576133">"Favorit"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-Tethering verfügbar"</string>
+    <string name="tether_message" msgid="554549994538298101">"Wählen Sie \"Tethering\" aus, wenn Sie die Datenverbindung Ihres Telefons für Ihren Computer freigeben möchten."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Tethering"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Abbrechen"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Beim Tethering ist ein Problem aufgetreten."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-Tethering verfügbar"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Auswählen, um Ihren Computer per Tethering an Ihr Telefon anzubinden"</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Tethering beenden"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Auswählen, um das Tethering mit Ihrem Computer zu beenden"</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Tethering-Verbindung trennen"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Sie haben die mobile Datenverbindung Ihres Telefons für Ihren Computer freigegeben. Wählen Sie \"Verbindung trennen\", um das USB-Tethering zu beenden."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Verbindung trennen"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Abbrechen"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Beim Beenden des Tetherings ist ein Problem aufgetreten. Bitte versuchen Sie es erneut."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index a55dded..8413224 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Επιτρέπει σε μια εφαρμογή να ενεργοποιήσει τον εντοπισμό σφαλμάτων για μια άλλη εφαρμογή. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να τερματίσουν άλλες εφαρμογές."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"αλλαγή των ρυθμίσεων του UI"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Επιτρέπει σε μια εφαρμογή την αλλαγή της τρέχουσας διαμόρφωσης, όπως οι τοπικές ρυθμίσεις ή το μέγεθος γραμματοσειράς γενικά."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"ενεργοποίηση λειτουργίας αυτοκινήτου"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Επιτρέπει σε μια εφαρμογή την ενεργοποίηση της λειτουργίας αυτοκινήτου."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"τερματισμός διεργασιών παρασκηνίου"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Επιτρέπει σε μια εφαρμογή τον τερματισμό των διεργασιών παρασκηνίου άλλων εφαρμογών, ακόμα και αν η μνήμη είναι επαρκής."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"επιβολή διακοπής άλλων εφαρμογών"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Επιτρέπει σε μια εφαρμογή να πραγματοποιεί αναγκαστική διακοπή άλλων εφαρμογών."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"αναγκαστικός τερματισμός εφαρμογής"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Επιτρέπει σε μια εφαρμογή να εξαναγκάσει οποιαδήποτε δραστηριότητα που βρίσκεται στο προσκήνιο να κλείσει και να μεταβεί στο φόντο. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"ανάκτηση εσωτερικής κατάστασης συστήματος"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Επιτρέπει την τροποποίηση στατιστικών μπαταρίας που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
     <string name="permlab_backup" msgid="470013022865453920">"αντίγραφο ασφαλείας και επαναφορά συστήματος"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Επιτρέπει στην εφαρμογή τον έλεγχο του μηχανισμού δημιουργίας αντιγράφων ασφαλείας και επαναφοράς του συστήματος. Δεν προορίζεται για χρήση από κανονικές εφαρμογές."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"δημιουργία αντιγράφων ασφαλείας και επαναφορά δεδομένων εφαρμογής"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Επιτρέπει στην εφαρμογή να συμμετέχει στον μηχανισμό δημιουργίας αντιγράφων ασφαλείας και επαναφοράς του συστήματος."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"προβολή μη εξουσιοδοτημένων παραθύρων"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Επιτρέπει τη δημιουργία παραθύρων που πρόκειται να χρησιμοποιηθούν από την εσωτερική διεπαφή χρήστη του συστήματος. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"εμφάνιση ειδοποιήσεων επιπέδου συστήματος"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας μεθόδου εισόδου. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"δέσμευση σε ταπετσαρία"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας ταπετσαρίας. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"επικοινωνία με έναν διαχειριστή συσκευής"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Επιτρέπει στον κάτοχο την αποστολή στόχων σε έναν διαχειριστή συσκευής. Δεν θα χρειαστεί ποτέ για κανονικές εφαρμογές."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"αλλαγή προσανατολισμού οθόνης"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Επιτρέπει σε μια εφαρμογή την αλλαγή της περιστροφής της οθόνης οποιαδήποτε στιγμή. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"αποστολή σημάτων Linux σε εφαρμογές"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Επιτρέπει σε μια εφαρμογή την εγκατάσταση νέων ή ενημερωμένων πακέτων Android. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να προσθέσουν νέες εφαρμογές με πολλές αυθαίρετες άδειες."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"διαγραφή όλων των δεδομένων προσωρινής μνήμης εφαρμογής"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Επιτρέπει σε μια εφαρμογή να αυξήσει τον ελεύθερο χώρο αποθήκευσης του τηλεφώνου διαγράφοντας αρχεία από τον κατάλογο προσωρινής μνήμης της εφαρμογής. Η πρόσβαση είναι συνήθως πολύ περιορισμένη στη διαδικασία συστήματος."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"ανάγνωση αρχείων καταγραφής συστήματος"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Επιτρέπει σε μια εφαρμογή να αναγνώσει τα αρχεία καταγραφής του συστήματος. Έτσι μπορεί να ανακαλύψει γενικές πληροφορίες σχετικά με τις δραστηριότητές σας στο τηλέφωνο, όμως δεν θα πρέπει να περιέχουν προσωπικές ή ιδιωτικές πληροφορίες."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"ανάγνωση/εγγραφή σε πόρους που ανήκουν στο διαγνωστικό"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει τα δεδομένα κατόχου τηλεφώνου στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να τροποποιήσουν τα δεδομένα κατόχου."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"ανάγνωση δεδομένων κατόχου"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των δεδομένων κατόχου τηλεφώνου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για την ανάγνωση δεδομένων κατόχου τηλεφώνου."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"ανάγνωση δεδομένων ημερολογίου"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Επιτρέπει σε μια εφαρμογή να αναγνώσει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να αποστείλουν συμβάντα ημερολογίου σε άλλους χρήστες."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"εγγραφή δεδομένων ημερολογίου"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των συμβάντων ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διαγράψουν ή για να τροποποιήσουν τα δεδομένα ημερολογίου σας."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"δημιουργία ψευδών πηγών τοποθεσίας για δοκιμή"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Δημιουργία εικονικών πηγών τοποθεσίας για δοκιμή. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να παρακάμψουν την τοποθεσία και/ή την κατάσταση που βρίσκουν πραγματικές πηγές τοποθεσίας, όπως πάροχοι GPS ή πάροχοι δικτύου."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Επιτρέπει στην εφαρμογή την προσάρτηση και αποπροσάρτηση συστημάτων αρχείων για αφαιρούμενο αποθηκευτικό χώρο."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"διαμόρφωση εξωτερικού αποθηκευτικού χώρου"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Επιτρέπει στην εφαρμογή τη διαμόρφωση αφαιρούμενου αποθηκευτικού χώρου."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"λήψη πληροφοριών στον ασφαλή χώρο αποθήκευσης"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Επιτρέπει στην εφαρμογή τη λήψη πληροφοριών στον ασφαλή χώρο αποθήκευσης."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"δημιουργία ασφαλούς χώρου αποθήκευσης"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Επιτρέπει στην εφαρμογή τη δημιουργία ασφαλούς χώρου αποθήκευσης."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"καταστροφή ασφαλούς χώρου αποθήκευσης"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Επιτρέπει στην εφαρμογή την καταστροφή του ασφαλούς χώρου αποθήκευσης."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"σύνδεση / αποσύνδεση ασφαλούς χώρου αποθήκευσης"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Επιτρέπει στην εφαρμογή τη σύνδεση / αποσύνδεση του ασφαλούς χώρου αποθήκευσης."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"μετονομασία ασφαλούς χώρου αποθήκευσης"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Επιτρέπει στην εφαρμογή τη μετονομασία του ασφαλούς χώρου αποθήκευσης."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"έλεγχος δόνησης"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Επιτρέπει στην εφαρμογή τον έλεγχο του δονητή."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"έλεγχος φακού"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Επιτρέπει στην εφαρμογή τον ορισμό συμβουλών μεγέθους ταπετσαρίας συστήματος."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"επαναφορά συστήματος στις εργοστασιακές προεπιλογές"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Επιτρέπει σε μια εφαρμογή να επαναφέρει πλήρως το σύστημα στις εργοστασιακές ρυθμίσεις, διαγράφοντας όλα τα δεδομένα, τις διαμορφώσεις και τις εγκατεστημένες εφαρμογές."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"ρύθμιση ώρας"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Επιτρέπει σε μια εφαρμογή την αλλαγή ώρας ρολογιού του τηλεφώνου."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"ορισμός ζώνης ώρας"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Επιτρέπει σε μια εφαρμογή την αλλαγή της ζώνης ώρας του τηλεφώνου."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"ενεργεί ως AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"εγγραφή ρυθμίσεων Ονόματος σημείου πρόσβασης (APN)"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει τις ρυθμίσεις APN, όπως Διακομιστής μεσολάβησης και Θύρα για ένα APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"αλλαγή συνδεσιμότητας δικτύου"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Επιτρέπει σε μια εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Επιτρέπει σε μια εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"αλλαγή συνδεσιμότητας μέσω σύνδεσης με κινητή συσκευή"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Επιτρέπει σε μια εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου μέσω σύνδεσης με κινητή συσκευή."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"αλλαγή ρύθμισης της χρήσης δεδομένων στο παρασκήνιο"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Επιτρέπει σε μια εφαρμογή την αλλαγή της ρύθμισης χρήσης δεδομένων φόντου."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"προβολή κατάστασης Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Επιτρέπει σε μια εφαρμογή την εγγραφή νέων λέξεων στο λεξικό χρήστη."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"τροποποίηση/διαγραφή περιεχομένων κάρτας SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"πρόσβαση στο σύστημα αρχείων προσωρινής μνήμης"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Επιτρέπει σε μια εφαρμογή την ανάγνωση και την εγγραφή του συστήματος αρχείων προσωρινής μνήμης."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Περιορισμός επιλογών κωδικού πρόσβασης"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Περιορισμός των τύπων κωδικού πρόσβασης που επιτρέπεται να χρησιμοποιείτε."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Παρακολούθηση προσπαθειών σύνδεσης"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Παρακολούθηση αποτυχημένων προσπαθειών σύνδεσης με τη συσκευή, για την εκτέλεσης κάποιας ενέργειας."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Επαναφορά κωδικού πρόσβασης"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Εφαρμογή του κωδικού πρόσβασής σας σε μια νέα τιμή, με την προϋπόθεση ότι σας παρέχεται από τον διαχειριστή για να μπορείτε να συνδεθείτε."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Εφαρμογή κλειδώματος"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Ελέγχει πότε κλειδώνει η συσκευή, απαιτώντας κωδικό πρόσβασης για επανείσοδο."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Διαγραφή όλων των δεδομένων"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Πραγματοποιείται επαναφορά εργοστασιακών ρυθμίσεων, με τη διαγραφή όλων των δεδομένων σας χωρίς επιβεβαίωση."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Οικία"</item>
     <item msgid="869923650527136615">"Κινητό"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"μέσω <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> μέσω <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Πληκτρολογήστε τον κωδικό αριθμό PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Εισαγάγετε τον κωδικό πρόσβασης για ξεκλείδωμα"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Εσφαλμένος κωδικός αριθμός PIN!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Για ξεκλείδωμα, πατήστε το πλήκτρο Menu και, στη συνέχεια, το πλήκτρο 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Αριθμός έκτακτης ανάγκης"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Πατήστε \"Μενού\" για ξεκλείδωμα."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Σχεδιασμός μοτίβου για ξεκλείδωμα"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Κλήση έκτακτης ανάγκης"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Σωστό!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Προσπαθήστε αργότερα"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Φόρτιση (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ξεκλείδωμα"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ενεργοποίηση ήχου"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Απενεργοποίηση ήχου"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Εκκαθάριση"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Επιτρέπει στην εφαρμογή την ανάγνωση όλων των διευθύνσεων URL που το πρόγραμμα περιήγησης έχει επισκεφθεί και όλων των σελιδοδεικτών του προγράμματος περιήγησης."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"εγγραφή ιστορικού και σελιδοδεικτών προγράμματος περιήγησης"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει το ιστορικό ή τους σελιδοδείκτες του προγράμματος περιήγησης που βρίσκονται αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν τα δεδομένα του προγράμματος περιήγησης."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Τροποποίηση δικαιωμάτων γεωγραφικής θέσης προγράμματος περιήγησης"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των δικαιωμάτων γεωγραφικής θέσης του προγράμματος περιήγησης. Οι κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να επιτρέψουν την αποστολή στοιχείων τοποθεσίας σε αυθαίρετους ιστότοπους."</string>
     <string name="save_password_message" msgid="767344687139195790">"Θέλετε το πρόγραμμα περιήγησης να διατηρήσει αυτόν τον κωδικό πρόσβασης;"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Να μην γίνει τώρα"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Διατήρηση"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"πριν από 1 ώρα"</item>
     <item quantity="other" msgid="2467273239587587569">"πριν από <xliff:g id="COUNT">%d</xliff:g> ώρες"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"χθες"</item>
     <item quantity="other" msgid="2479586466153314633">"πριν από <xliff:g id="COUNT">%d</xliff:g> ημέρες"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Δεν απαιτούνται άδειες"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Απόκρυψη"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Εμφάνιση όλων"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Φόρτωση..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Μαζική αποθήκευση USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Το USB είναι συνδεδεμένο"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Συνδέσατε το τηλέφωνό σας στον υπολογιστή μέσω USB. Επιλέξτε \"Προσάρτηση\" αν θέλετε να αντιγράψετε αρχεία μεταξύ του υπολογιστή και της κάρτας SD του τηλεφώνου."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Προσάρτηση"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Να μην γίνει προσάρτηση"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Συνδέσατε το τηλέφωνό σας στον υπολογιστή μέσω USB. Επιλέξτε το παρακάτω κουμπί αν θέλετε να αντιγράψετε αρχεία μεταξύ του υπολογιστή και της κάρτας SD του Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Ενεργοποίηση αποθηκευτικού χώρου USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Παρουσιάστηκε ένα πρόβλημα στη χρήση της κάρτας SD ως αποθηκευτικό χώρο USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Το USB είναι συνδεδεμένο"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Επιλέξτε για αντιγραφή προς/από τον υπολογιστή σας."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Απενεργοποίηση αποθηκευτικού χώρου USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Επιλογή για απενεργοποίηση αποθηκευτικού χώρου USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Απενεργοποίηση αποθηκευτικού χώρου USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Πριν από την απενεργοποίηση του αποθηκευτικού χώρου USB, βεβαιωθείτε ότι έχετε αποπροσαρτήσει την υποδοχή USB. Επιλέξτε \"Απενεργοποίηση\" για να απενεργοποιήσετε τον αποθηκευτικό χώρο USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Απενεργοποίηση"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Ακύρωση"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Παρουσιάστηκε ένα πρόβλημα κατά την απενεργοποίηση του αποθηκευτικού χώρου USB. Βεβαιωθείτε ότι έχετε αποσυνδέσει την υποδοχή USB και προσπαθήστε ξανά."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Χώρος αποθήκευσης USB σε χρήση"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Προτού απενεργοποιήσετε το χώρο αποθήκευσης USB, βεβαιωθείτε ότι έχετε αποσυνδέσει (“αφαιρέσει”) την κάρτα SD του Android από τον υπολογιστή σας."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Απενεργοποίηση χώρου αποθήκευσης USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Παρουσιάστηκε πρόβλημα κατά την απενεργοποίηση του αποθηκευτικού χώρου USB. Βεβαιωθείτε ότι έχετε αφαιρέσει την υποδοχή USB και προσπαθήστε ξανά."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Διαμόρφωση κάρτας SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Είστε βέβαιοι ότι θέλετε να διαμορφώσετε την κάρτα SD; Όλα τα δεδομένα στην κάρτα σας θα χαθούν."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Διαμόρφωση"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Δεν βρέθηκαν δραστηριότητες που να αντιστοιχούν"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"ενημέρωση στατιστικών χρήσης στοιχείου"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Επιτρέπει την τροποποίηση στατιστικών χρήσης στοιχείων που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Επιτρέπει την κλήση της προεπιλεγμένης υπηρεσίας κοντέινερ για την αντιγραφή περιεχομένου. Δεν χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Επιτρέπει την κλήση της προεπιλεγμένης υπηρεσίας κοντέινερ για την αντιγραφή περιεχομένου. Δεν χρησιμοποιείται από κανονικές εφαρμογές."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Πατήστε δύο φορές για έλεγχο εστίασης"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Σφάλμα αύξησης μεγέθους γραφικού στοιχείου"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Μετάβαση"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Δημιουργία επαφής"\n"με τη χρήση του <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"επιλεγμένο"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"δεν ελέγχθηκε"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Από την εφαρμογή ή τις εφαρμογές που ακολουθούν ζητούνται δικαιώματα πρόσβασης στο λογαριασμό σας, τώρα και στο μέλλον."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Θέλετε να επιτρέψετε αυτή την αίτηση;"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Αίτημα πρόσβασης"</string>
     <string name="allow" msgid="7225948811296386551">"Να επιτρέπεται"</string>
     <string name="deny" msgid="2081879885755434506">"Άρνηση"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Απαιτείται άδεια"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Πρωτόκολλο Layer 2 Tunneling Protocol (L2TP)"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Κλειδί pre-shared βάσει L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Πιστοποιητικό βάσει L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Επιλογή αρχείου"</string>
+    <string name="reset" msgid="2448168080964209908">"Επαναφορά"</string>
+    <string name="submit" msgid="1602335572089911941">"Υποβολή"</string>
+    <string name="description_star" msgid="2654319874908576133">"αγαπημένο"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Διαθέσιμη σύνδεση μέσω κινητής συσκευής με USB"</string>
+    <string name="tether_message" msgid="554549994538298101">"Επιλέξτε \"Σύνδεση μέσω κινητής συσκευής\" αν θέλετε να κάνετε κοινή χρήση της σύνδεσης δεδομένων του τηλεφώνου σας με τον υπολογιστή σας."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Σύνδεση μέσω κινητής συσκευής"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Ακύρωση"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Υπάρχει πρόβλημα σύνδεσης μέσω κινητής συσκευής."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Διαθέσιμη σύνδεση μέσω κινητής συσκευής με USB"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Συνδέστε τον υπολογιστή με το τηλέφωνό σας."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Κατάργηση σύνδεσης μέσω κινητής συσκευής"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Καταργήστε τη σύνδεση μέσω κινητής συσκευής του υπολογιστή σας."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Κατάργηση σύνδεσης μέσω κινητής συσκευής"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Κάνετε κοινή χρήση της σύνδεσης των δεδομένων του κινητού σας τηλεφώνου με τον υπολογιστή σας. Επιλέξτε \"Αποσύνδεση\" για να καταργήσετε τη σύνδεση μέσω κινητής συσκευής με USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Αποσύνδεση"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Ακύρωση"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Παρουσιάστηκε ένα πρόβλημα κατά την απενεργοποίηση της σύνδεσης μέσω κινητής συσκευής. Προσπαθήστε ξανά."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index b2aaa7d3..8a87fa1 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Admite una aplicación que activa la depuración en otra aplicación. Las aplicaciones maliciosas pueden utilizarlo para suprimir otras aplicaciones."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"cambiar tu configuración de la interfaz de usuario"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Admite una aplicación para cambiar la configuración actual, como el tamaño de fuente local o general."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"habilitar el modo de auto"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permite que una aplicación habilite el modo auto."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"eliminar los procesos de fondo"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permite que una aplicación elimine los procesos de fondo de otras aplicaciones, aun si la memoria no es baja."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"provocar la detención de otras aplicaciones"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permite que una aplicación provoque la detención de otras aplicaciones."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"provocar que la aplicación se acerque"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Admite una aplicación que provoca que cualquier actividad del fondo se acerque y vuelva a alejarse. Se debe evitar utilizarlo en aplicaciones normales."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"recuperar el estado interno del sistema"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Admite la modificación de estadísticas recopiladas sobre la batería. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_backup" msgid="470013022865453920">"copia de seguridad y restauración del sistema de control"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite a la aplicación controlar el mecanismo de restauración y copia de seguridad de los sistemas. No es para uso de las aplicaciones normales."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"hacer una copia de seguridad y restaurar los datos de aplicación"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Permite a la aplicación participar en la copia de seguridad del sistema y restaurar el mecanismo."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite la creación de ventanas que la interfaz interna del usuario del sistema pretenda utilizar. Las aplicaciones normales no deben utilizarlo."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"mostrar alertas a nivel del sistema"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite al propietario vincularse a la interfaz de nivel superior de un método de entrada. Se debe evitar utilizarlo en aplicaciones normales."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vincular a un fondo de pantalla"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite al propietario vincularse a la interfaz de nivel superior de un fondo de pantalla. Se debe evitar utilizarlo en aplicaciones normales."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con un administrador de dispositivo"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite que el propietario envíe sus intentos a un administrador de dispositivos. No se necesita para las aplicaciones normales."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"cambiar la orientación de la pantalla"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Admite una aplicación que cambia la rotación de la pantalla en cualquier momento. Se debe evitar utilizarlo en aplicaciones normales."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"enviar señales de Linux a las aplicaciones"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Admite una aplicación que instala paquetes de Android nuevos o actualizados. Las aplicaciones maliciosas pueden utilizarlo para agregar aplicaciones nuevas con permisos arbitrariamente potentes."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"eliminar todos los datos de memoria caché de la aplicación"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Admite una aplicación que libera espacio de almacenamiento en el teléfono al eliminar archivos del directorio de memoria caché de la aplicación. En general, el acceso es muy restringido para el proceso del sistema."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"leer archivos de registro del sistema"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Admite una aplicación que lee diversos archivos de registro del sistema. Esto le permite descubrir información general sobre lo que haces con el teléfono, pero no debe contener información personal ni privada."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"leer y escribir a recursos dentro del grupo de diagnóstico"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Admite una aplicación que modifica los datos del propietario del teléfono guardados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar los datos del propietario."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"leer datos del propietario"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Admite una aplicación que lee los datos del propietario del teléfono guardados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para leer los datos del propietario del teléfono."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"leer datos de calendario"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Admite que una aplicación lea todos los eventos de calendario almacenados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para enviar tus eventos de calendario a otras personas."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"escribir datos de calendario"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Admite una aplicación que modifica los eventos de calendario guardados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar tus datos de calendario."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"crear fuentes de ubicación de prueba"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Crea fuentes de ubicación de prueba. Las aplicaciones maliciosas pueden utilizarlo para invalidar la ubicación o el estado que arrojen las fuentes de ubicación real, como GPS o proveedores de red."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acceder a comandos adicionales del proveedor del lugar"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Admite que la aplicación monte y desmonte filesystems para obtener almacenamiento extraíble."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"espacio de almacenamiento externo del formato"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Admite que la aplicación formatee el espacio de almacenamiento extraíble."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"obtener información sobre el almacenamiento seguro"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Permite que una aplicación obtenga información en el almacenamiento seguro."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"crear almacenamiento seguro"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Permite que la aplicación cree un almacenamiento seguro."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"destruir el almacenamiento seguro"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permite que una aplicación destruya el almacenamiento seguro."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montar o desmontar almacenamiento seguro"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite que una aplicación monte o desmonte el almacenamiento seguro."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"cambie el nombre del almacenamiento seguro"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permite que una aplicación cambie el nombre de un almacenamiento seguro."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"vibrador de control"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Admite que la aplicación controle el vibrador."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controlar linterna"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Admite que la aplicación establezca las sugerencias de tamaño del papel tapiz del sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"restablecer el sistema a las configuraciones predeterminadas de fábrica"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Admite una aplicación que restablece el sistema completamente con su configuración de fábrica, y borra todos los datos, las configuraciones y las aplicaciones instaladas."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"establecer la hora"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Permite a una aplicación cambiar la hora del teléfono."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"establecer zona horaria"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Admite una aplicación que cambia la zona horaria del teléfono."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"actuar como cuenta, administrador o servicio"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"escribir configuración del Nombre del punto de acceso"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Admite una aplicación que modifica la configuración de APN, como el proxy y el puerto de cualquier APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"cambiar la conectividad de la red"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Admite una aplicación que cambia la conectividad de red del estado."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Permite que una aplicación cambie el estado de la conectividad de red."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"cambiar la conectividad de anclaje a red"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Permite que una aplicación cambie el estado de la conectividad de red del anclaje."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"cambiar la configuración del uso de datos del fondo"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Admite una aplicación que cambia la configuración del uso de datos del fondo."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"ver el estado de Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Admite una aplicación que escribe palabras nuevas en el diccionario del usuario."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/suprimir el contenido de la tarjeta SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Admite que una aplicación escriba en la tarjeta SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"Acceder al sistema de archivos caché"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que una aplicación lea y escriba el sistema de archivos caché."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limitar la contraseña"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Restringe los tipos de contraseñas que puedes utilizar."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Observar los intentos de acceso"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Intentos fallidos del control para acceder al dispositivo para realizar alguna acción."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Restablecer contraseña"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Forzar un nuevo valor para tu contraseña, el administrador deberá enviártelo antes de poder acceder."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Provocar el bloqueo"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Controlar cuando se bloquee el dispositivo, requiere que vuelvas a ingresar tu contraseña."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Borrar todos los datos"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Realizar un reestablecimiento de fábrica y borrar todos tus datos sin ninguna confirmación."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Página principal"</item>
     <item msgid="869923650527136615">"Celular"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"a través de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> a través de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ingresar el código de PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ingresar la contraseña para desbloquear"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"¡Código de PIN incorrecto!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, presiona el menú y luego 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergencia"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Presionar Menú para desbloquear."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Extraer el patrón para desbloquear"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Llamada de emergencia"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Lo sentimos, vuelve a intentarlo"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sonido encendido"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sonido apagado"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite a la aplicación leer todas las URL que ha visitado el navegador y todos los marcadores del navegador."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"escribir historial y marcadores del navegador"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Permite a una aplicación modificar el historial y los marcadores del navegador almacenados en tu teléfono. Las aplicaciones maliciosas pueden utilizarlo para borrar o modificar tus datos."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modificar los permisos de ubicación geográfica del navegador"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permite que una aplicación modifique los permisos de ubicación geográfica del navegador. Las aplicaciones maliciosas pueden utilizarlos para permitir el envío de información sobre la ubicación a sitos web de forma arbitraria."</string>
     <string name="save_password_message" msgid="767344687139195790">"¿Quieres recordar esta contraseña en el navegador?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Ahora no."</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Recuerda"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"hace 1 hora"</item>
     <item quantity="other" msgid="2467273239587587569">"hace <xliff:g id="COUNT">%d</xliff:g> horas"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"ayer"</item>
     <item quantity="other" msgid="2479586466153314633">"hace <xliff:g id="COUNT">%d</xliff:g> días"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"No se requieren permisos"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar todos"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Cargando…"</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Almacenamiento masivo USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"conectado al USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Has conectado tu teléfono a tu computadora a través de USB. Selecciona \"Montar\" si deseas copiar archivos entre tu computadora y la tarjeta SD de tu teléfono."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Montar"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"No montar"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Has conectado tu teléfono a tu computadora mediante USB. Selecciona el botón a continuación si deseas copiar los archivos entre tu computadora y la tarjeta SD de Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activar el almacenamiento USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Hay un problema para utilizar tu tarjeta SD en el almacenamiento USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"conectado al USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleccionar para copiar archivos desde o hacia tu computadora."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Apagar el almacenamiento USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleccionar para desactivar el almacenamiento USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Apagar el almacenamiento USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Antes de desactivar el almacenamiento USB, asegúrate de haberlo desmontado en el servidor USB al seleccionar \"Desactivar\"."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Apagar"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Cancelar"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Se ha producido un problema al desactivar el almacenamiento USB. Verifica para asegurarte de haber desmontado el servidor USB, luego vuelve a intentarlo."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Almacenamiento USB en uso"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Antes de desactivar el almacenamiento USB, asegúrate de haber desmontado (\"expulsado\") la tarjeta SD de Android de tu computadora."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desactivar el almacenamiento USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Se ha producido un problema al desactivar el almacenamiento USB. Asegúrate de haber desmontado el host USB, luego vuelve a intentarlo."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatear tarjeta SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"¿Estás seguro de que quieres formatear la tarjeta SD? Se perderán todos los datos de tu tarjeta."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"No se encontraron actividades coincidentes"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"actualizar la estadística de uso de los componentes"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Permite la modificación de estadísticas recopiladas sobre el uso de componentes. Las aplicaciones normales no deben utilizarlo."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Permite invocar el servicio de contenedor predeterminado para copiar el contenido. No se utiliza con las aplicaciones normales."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Permite invocar el servicio de contenedor predeterminado para copiar el contenido. No se utiliza con las aplicaciones normales."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Presiona dos veces para obtener el control del zoom"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Error al aumentar el control"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Crear contacto "\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"verificado"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"no verificado"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Las siguientes aplicaciones requieren autorización para acceder a tu cuenta ahora y en el futuro."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"¿Deseas permitir esta solicitud?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Solicitud de acceso"</string>
     <string name="allow" msgid="7225948811296386551">"Permitir"</string>
     <string name="deny" msgid="2081879885755434506">"Denegar"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Permiso solicitado"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de túnel de nivel 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Clave previamente compartida según L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificado según L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Elegir archivo"</string>
+    <string name="reset" msgid="2448168080964209908">"Restablecer"</string>
+    <string name="submit" msgid="1602335572089911941">"Enviar"</string>
+    <string name="description_star" msgid="2654319874908576133">"favorito"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Anclaje a red USB disponible"</string>
+    <string name="tether_message" msgid="554549994538298101">"Selecciona \"Anclar a red\" si deseas compartir la conexión de datos de tu teléfono con tu computadora."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Anclaje de red"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Cancelar"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Existe un problema en el anclaje a red."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Anclaje a red USB disponible"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Seleccionar el anclaje a red de tu computadora a tu teléfono"</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Desconectar el anclaje a red"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Seleccionar para desconectar de tu computadora del anclaje a red"</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Desconectar el anclaje a red"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Has estado compartiendo con tu computadora la conexión de datos del celular. Selecciona \"Desconectar\" para desconectar el anclaje a red USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Desconectar"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Cancelar"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Hemos encontrado un problema al desactivar el anclaje a red. Vuelve a intentarlo."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 032fbdc..441fd38 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite que una aplicación active la depuración de otra aplicación. Las aplicaciones malintencionadas pueden utilizar este permiso para desactivar otras aplicaciones."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"cambiar la configuración de la interfaz de usuario"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite que una aplicación cambie la configuración actual como, por ejemplo, la configuración local o el tamaño de fuente general."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"habilitar modo coche"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permite que una aplicación habilite el modo coche."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"interrumpir procesos en segundo plano"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permite interrumpir los procesos en segundo plano de otras aplicaciones, aunque no exista poco espacio en la memoria."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"forzar la detención de otras aplicaciones"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permite que una aplicación detenga de forma forzosa otras aplicaciones."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"forzar el cierre de la aplicación"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Permite que una aplicación fuerce a cualquier actividad en segundo plano a cerrarse y volver a la pantalla anterior. No debería ser necesario nunca para las aplicaciones normales."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"recuperar estado interno del sistema"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite la modificación de estadísticas recopiladas sobre la batería. No está destinado al uso por parte de aplicaciones normales."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar las copias de seguridad y las restauraciones del sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que la aplicación controle el mecanismo de copia de seguridad y restauración del sistema. Este permiso no está destinado a aplicaciones normales."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"crear una copia de seguridad de los datos de la aplicación y restaurarlos"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Permite que la aplicación participe en el mecanismo de copia de seguridad y restauración del sistema."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite la creación de ventanas destinadas al uso por parte de la interfaz de usuario interna del sistema. No está destinado al uso por parte de aplicaciones normales."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"mostrar alertas de nivel del sistema"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite enlazar con la interfaz de nivel superior de un método de introducción de texto. No debe ser necesario para las aplicaciones normales."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"enlazar con un fondo de pantalla"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite enlazar con la interfaz de nivel superior de un fondo de pantalla. No debe ser necesario para las aplicaciones normales."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactuar con el administrador de un dispositivo"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite enviar intentos a un administrador de dispositivos. Este permiso nunca debería ser necesario para las aplicaciones normales."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"cambiar orientación de la pantalla"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Permite que una aplicación cambie la rotación de la pantalla en cualquier momento. No debería ser necesario nunca para las aplicaciones normales."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"enviar señales Linux a aplicaciones"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permite que una aplicación instale paquetes Android nuevos o actualizados. Las aplicaciones malintencionadas pueden utilizar este permiso para añadir aplicaciones nuevas con permisos arbitrariamente potentes."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"eliminar todos los datos de caché de la aplicación"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Permite que una aplicación libere espacio de almacenamiento en el teléfono mediante la eliminación de archivos en el directorio de caché de la aplicación. El acceso al proceso del sistema suele estar muy restringido."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"leer archivos de registro del sistema"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Permite que una aplicación lea los distintos archivos de registro del sistema. Con este permiso, la aplicación puede ver información general sobre las acciones que realiza el usuario con el teléfono, pero los registros no deberían contener información personal o privada."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"leer/escribir en los recursos propiedad del grupo de diagnóstico"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Permite que una aplicación modifique los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos del propietario."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"leer datos del propietario"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Permite que una aplicación lea los datos del propietario del teléfono almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para leer los datos del propietario del teléfono."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"leer datos de calendario"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Permite que una aplicación lea todos los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para enviar tus eventos de calendario a otras personas."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"escribir datos de calendario"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Permite que una aplicación modifique los eventos de calendario almacenados en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar tus datos de calendario."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"simular fuentes de ubicación para prueba"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Crear fuentes de origen simuladas para realizar pruebas. Las aplicaciones malintencionadas pueden utilizar este permiso para sobrescribir la ubicación o el estado devueltos por orígenes de ubicación reales, tales como los proveedores de red o GPS."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acceder a comandos de proveedor de ubicación adicional"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permite que las aplicaciones activen y desactiven sistemas de archivos para un almacenamiento extraíble."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatear almacenamiento externo"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permite a la aplicación formatear un almacenamiento extraíble."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"obtener información sobre el almacenamiento seguro"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Permite que la aplicación obtenga información sobre el almacenamiento seguro."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"crear almacenamiento seguro"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Permite que la aplicación cree un almacenamiento seguro."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"destruir almacenamiento seguro"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permite que la aplicación destruya el almacenamiento seguro."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montar/desmontar almacenamiento seguro"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite que la aplicación monte o desmonte el almacenamiento seguro."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"cambiar nombre de almacenamiento seguro"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permite que la aplicación cambie el nombre del almacenamiento seguro."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlar vibración"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permite que la aplicación controle la función de vibración."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controlar linterna"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permite que la aplicación establezca el tamaño del fondo de pantalla del sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"restablecer el sistema a los valores predeterminados de fábrica"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permite que una aplicación restablezca por completo el sistema a su configuración de fábrica, borrando todos los datos, la configuración y las aplicaciones instaladas."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"establecer hora"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Permite que una aplicación cambie la hora del reloj del teléfono."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"establecer zona horaria"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Permite que una aplicación cambie la zona horaria del teléfono."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"actuar como servicio de administrador de cuentas"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"escribir la configuración de nombre de punto de acceso"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Permite que una aplicación modifique los valores de configuración de un APN como, por ejemplo, el proxy y el puerto de cualquier APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"cambiar la conectividad de red"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Permite que una aplicación cambie la conectividad de red de estado."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Permite que una aplicación cambie el estado de la conectividad de red."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"cambiar conectividad de anclaje a red"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Permite que una aplicación cambie el estado de la conectividad de red de anclaje."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"cambiar configuración de uso de datos de referencia"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Permite a una aplicación cambiar la configuración de uso de los datos de referencia."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"ver estado de la conectividad Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite a una aplicación escribir palabras nuevas en el diccionario del usuario."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/eliminar contenido de la tarjeta SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que una aplicación escriba en la tarjeta SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"acceder al sistema de archivos almacenado en caché"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que una aplicación lea y escriba el sistema de archivos almacenado en caché."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limitar opciones de contraseña"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Permite restringir los tipos de contraseñas que puede utilizar el usuario."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Controlar intentos de acceso"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Se ha producido un error al intentar controlar el acceso al dispositivo para realizar una acción."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Restablecer contraseña"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Permite forzar la contraseña para establecer un valor nuevo que el administrador deberá proporcionar al usuario para poder acceder."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Forzar bloqueo"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Permite controlar el momento de bloqueo del dispositivo solicitando al usuario que vuelva a introducir la contraseña."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Borrar todos los datos"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Permite realizar un restablecimiento de fábrica eliminando todos los datos sin confirmación."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Casa"</item>
     <item msgid="869923650527136615">"Móvil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"a través de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> a través de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduce el código PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introducir contraseña para desbloquear"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"El código PIN es incorrecto."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear el teléfono, pulsa la tecla de menú y, a continuación, pulsa 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergencia"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pulsa la tecla de menú para desbloquear la pantalla."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dibujar patrón de desbloqueo"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Llamada de emergencia"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Inténtalo de nuevo"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -513,7 +543,7 @@
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Falta la tarjeta SIM"</string>
     <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"No se ha insertado ninguna tarjeta SIM en el teléfono."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Inserta una tarjeta SIM."</string>
-    <string name="emergency_calls_only" msgid="6733978304386365407">"Sólo llamadas de emergencia"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"Solo llamadas de emergencia"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Bloqueada para la red"</string>
     <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"La tarjeta SIM está bloqueada con el código PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Consulta la guía del usuario o ponte en contacto con el servicio de atención al cliente."</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Activar sonido"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Desactivar sonido"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Borrar"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que la aplicación lea todas las URL que ha visitado el navegador y todos sus marcadores."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"escribir en marcadores y en el historial del navegador"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Permite que una aplicación modifique la información de los marcadores o del historial del navegador almacenada en el teléfono. Las aplicaciones malintencionadas pueden utilizar este permiso para borrar o modificar los datos del navegador."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modificar los permisos de ubicación geográfica del navegador"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permite que una aplicación modifique los permisos de ubicación geográfica del navegador. Las aplicaciones malintencionadas pueden utilizar este permiso para permitir el envío de información sobre la ubicación a sitios web arbitrarios."</string>
     <string name="save_password_message" msgid="767344687139195790">"¿Deseas que el navegador recuerde esta contraseña?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Ahora no"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Recordar"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"Hace 1 hora"</item>
     <item quantity="other" msgid="2467273239587587569">"Hace <xliff:g id="COUNT">%d</xliff:g> horas"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"ayer"</item>
     <item quantity="other" msgid="2479586466153314633">"Hace <xliff:g id="COUNT">%d</xliff:g> días"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"No es necesario ningún permiso"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar todos"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Cargando..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Almacenamiento USB masivo"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Conectado por USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Has conectado el teléfono al equipo mediante USB. Selecciona \"Activar\" si deseas copiar archivos entre el equipo y la tarjeta SD del teléfono."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Activar"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"No activar"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Has conectado el teléfono al equipo mediante USB. Selecciona el botón situado debajo si deseas copiar archivos entre el equipo y la tarjeta SD del teléfono con Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activar almacenamiento USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Se ha producido un problema al intentar utilizar la tarjeta SD para el almacenamiento USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Conectado por USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Para copiar archivos al/desde el equipo"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desactivar almacenamiento USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleccionar para desactivar USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Desactivar almacenamiento USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Antes de desactivar el almacenamiento USB, asegúrate de haber desactivado el host USB. Selecciona \"Desactivar\" para desactivar el almacenamiento USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Desactivar"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Cancelar"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Se ha producido un problema al desactivar el almacenamiento USB. Asegúrate de que has desactivado el host USB e inténtalo de nuevo."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"El almacenamiento USB está en uso."</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Antes de desactivar el almacenamiento USB, asegúrate de haber desmontado (\"retirado\") la tarjeta SD del teléfono con Android del equipo."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desactivar almacenamiento USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Se ha producido un problema al desactivar el almacenamiento USB. Asegúrate de haber desactivado el host USB y, a continuación, vuelve a intentarlo."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatear tarjeta SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"¿Estás seguro de que quieres formatear la tarjeta SD? Se perderán todos los datos de la tarjeta."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"No se ha encontrado ninguna actividad coincidente."</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"actualizar estadísticas de uso de componentes"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Permite la modificación de estadísticas recopiladas sobre el uso de componentes. No está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Permite invocar el servicio de contenedor predeterminado para copiar contenido. Este permiso no está destinado al uso por parte de aplicaciones normales."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Permite invocar el servicio de contenedor predeterminado para copiar contenido. Este permiso no está destinado al uso por parte de aplicaciones normales."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Da dos toques para acceder al control de zoom."</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Error al aumentar el widget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Crear un contacto"\n"a partir de <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"seleccionado"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"no seleccionado"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Las siguientes aplicaciones solicitan permiso para acceder a tu cuenta ahora y en el futuro."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"¿Quieres permitir esta solicitud?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Solicitud de acceso"</string>
     <string name="allow" msgid="7225948811296386551">"Permitir"</string>
     <string name="deny" msgid="2081879885755434506">"Denegar"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Permiso solicitado"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de túnel de nivel 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Red privada virtual L2TP/IPSec basada en clave compartida previamente"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Red privada virtual L2TP/IPSec basada en certificado"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Seleccionar archivo"</string>
+    <string name="reset" msgid="2448168080964209908">"Restablecer"</string>
+    <string name="submit" msgid="1602335572089911941">"Enviar"</string>
+    <string name="description_star" msgid="2654319874908576133">"favoritos"</string>
+    <string name="tether_title" msgid="6970447107301643248">"El anclaje de USB está disponible."</string>
+    <string name="tether_message" msgid="554549994538298101">"Selecciona \"Activar anclaje a red\" si quieres compartir la conexión de datos del teléfono con el equipo."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Activar anclaje a red"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Cancelar"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Se ha producido un problema al activar el anclaje a red."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"El anclaje de USB está disponible."</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Selecciona esta opción para activar el anclaje del equipo al teléfono."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Desactivar anclaje a red"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Selecciona esta opción para desactivar el anclaje del equipo."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Desactivar anclaje a red"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Has compartido la conexión de datos móviles con el equipo. Selecciona \"Desconectar\" para desactivar el anclaje de USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Desconectar"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Cancelar"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Se ha producido un problema al desactivar el anclaje a red. Vuelve a intentarlo."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 3679fd2..99c7ad8 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permet à une application d\'activer le mode de débogage d\'une autre application. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interrompre d\'autres applications de façon inopinée."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"Modification des paramètres de l\'IU"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permet à une application de modifier la configuration actuelle (par ex. : la taille de la police générale ou des paramètres régionaux)."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"activer le mode voiture"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permet à une application d\'activer le mode voiture."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"arrêter les processus en arrière-plan"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permet à une application d\'arrêter les processus en arrière-plan d\'autres d\'applications, même lorsqu\'il n\'y a pas de problème de mémoire."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"forcer l\'arrêt d\'autres applications"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permet à une application de forcer l\'arrêt d\'autres applications."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"Fermeture forcée de l\'application"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Permet à une application de forcer une autre application exécutée au premier plan à se fermer et à passer en arrière-plan. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"Vérification de l\'état interne du système"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Autoriser la modification des statistiques de la batterie. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_backup" msgid="470013022865453920">"contrôler la sauvegarde et la restauration du système"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Autorise l\'application à contrôler le mécanisme de sauvegarde et de restauration du système. Ne pas utiliser pour les applications standard."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"sauvegarder et rétablir les données de l\'application"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Autorise l\'application à participer au mécanisme de sauvegarde et de restauration du système."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"Affichage de fenêtres non autorisées"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permet de créer des fenêtres conçues pour l\'interface utilisateur du système interne. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"Affichage d\'alertes système"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permet au support de se connecter à l\'interface de plus haut niveau d\'un mode de saisie. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"Se fixer sur un fond d\'écran"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permet au support de se fixer sur l\'interface de plus haut niveau d\'un fond d\'écran. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir avec l\'administrateur du périphérique"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permet à l\'application d\'envoyer des intentions à l\'administrateur du périphérique. Les applications standard ne devraient jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"Changement d\'orientation de l\'écran"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Permet à une application de modifier la rotation de l\'écran à tout moment. Les applications normales ne devraient jamais avoir recours à cette fonctionnalité."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Envoi de signaux Linux aux applications"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permet à une application d\'installer des nouveaux paquets de données ou des mises à jour Android. Des applications malveillantes peuvent utiliser cette fonctionnalité pour ajouter de nouvelles applications disposant d\'autorisations anormalement élevées."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"Suppression des données du cache de toutes les applications"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Permet à une application de libérer de l\'espace dans la mémoire du téléphone en supprimant des fichiers du répertoire du cache des applications. Cet accès est en général limité aux processus système."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"Lecture des fichiers journaux du système"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Permet à une application de lire les différents fichiers journaux du système afin d\'obtenir des informations générales sur la façon dont vous utilisez votre téléphone,  sans pour autant récupérer des informations d\'ordre personnel ou privé."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"Lecture/écriture dans les ressources appartenant aux diagnostics"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Permet à une application de modifier les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier ces données."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"Lecture des données du propriétaire"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Permet à une application de lire les données du propriétaire du téléphone enregistrées sur votre appareil. Des applications malveillantes peuvent utiliser cette fonctionnalité pour lire ces données."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"Lecture des données de l\'agenda"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Permet à une application de lire tous les événements de l\'agenda enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour envoyer les événements de votre agenda à d\'autres personnes."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"Écriture des données de l\'agenda"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Permet à une application de modifier les événements de l\'agenda enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier les données de votre agenda."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"Création de sources de localisation fictives à des fins de test"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Permet de créer des sources de localisation fictives à des fins de test. Des applications malveillantes peuvent utiliser cette fonctionnalité pour remplacer la position géographique et/ou l\'état fournis par des sources réelles comme le GPS ou les fournisseurs d\'accès."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"Accès aux commandes de fournisseur de position géographique supplémentaires"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permet à l\'application de monter et démonter des systèmes de fichiers pour des périphériques de stockage amovibles."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"Formatage du périphérique de stockage externe"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permet à l\'application de formater le périphérique de stockage amovible."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"obtenir des informations sur le stockage sécurisé"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Permet à l\'application d\'obtenir des informations sur le stockage sécurisé."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"créer un stockage sécurisé"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Permet à l\'application de créer un stockage sécurisé."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"détruire le stockage sécurisé"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permet à l\'application de détruire le stockage sécurisé."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"monter/démonter le stockage sécurisé"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permet à l\'application de monter/démonter le stockage sécurisé."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"renommer le stockage sécurisé"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permet à l\'application de renommer le stockage sécurisé."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"Contrôle du vibreur"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permet à l\'application de contrôler le vibreur."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"Contrôle de la lampe de poche"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permet à une application de définir la taille du fond d\'écran."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"Réinitialisation du système à ses paramètres d\'usine"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permet à une application de réinitialiser entièrement le système afin de rétablir ses valeurs d\'usine et d\'effacer toutes les données, configurations et applications installées."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"définir l\'heure"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Permet à une application de modifier l\'heure du téléphone."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"Sélection du fuseau horaire"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Permet à l\'application de modifier le fuseau horaire du téléphone."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"Agir en tant que service AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"Écriture des paramètres \"Nom des points d\'accès\""</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Permet à une application de modifier les paramètres APN (Nom des points d\'accès), comme le proxy ou le port de tout APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"Modification de la connectivité du réseau"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Permet à une application de modifier la connectivité du réseau."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Permet à une application de modifier l\'état de la connectivité réseau."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"changer la connectivité du partage de connexion"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Permet à une application de modifier l\'état de la connectivité du partage de connexion."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"modifier le paramètre d\'utilisation des données en arrière-plan"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Permet à une application de modifier le paramètre d\'utilisation des données en arrière-plan."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Affichage de l\'état du Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permet à une application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modifier/supprimer le contenu de la carte SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Autorise une application à écrire sur la carte SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accéder au système de fichiers en cache"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permet à une application de lire et d\'écrire dans le système de fichiers en cache."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limiter le mot de passe"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Restreint les types de mots de passe que vous êtes autorisé à utiliser."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Surveiller les tentatives de connexion"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Surveille les échecs de connexion au périphérique pour effectuer une action."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Réinitialiser le mot de passe"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Force l\'utilisation d\'un nouveau mot de passe, qui doit vous être communiqué par l\'administrateur pour que vous puissiez vous connecter."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Forcer le verrouillage"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Contrôle le verrouillage du périphérique, avec obligation de saisir à nouveau le mot de passe."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Effacer toutes les données"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Rétablit les paramètres d\'usine, supprimant toutes vos données sans demande de confirmation."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Domicile"</item>
     <item msgid="869923650527136615">"Portable"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Saisissez le code PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Saisissez le mot de passe pour procéder au déverrouillage."</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Le code PIN est incorrect !"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Pour débloquer le clavier, appuyez sur \"Menu\" puis sur 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numéro d\'urgence"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Appuyez sur \"Menu\" pour déverrouiller le téléphone."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Dessinez un schéma pour déverrouiller le téléphone"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Appel d\'urgence"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Combinaison correcte !"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Incorrect. Merci de réessayer."</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Chargement (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Débloquer"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Son activé"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Son désactivé"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Effacer"</string>
@@ -559,9 +592,11 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Autorise l\'application à lire toutes les URL auxquelles le navigateur a accédé et tous ses favoris."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"écrire dans l\'historique et les favoris du navigateur"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Autorise une application à modifier l\'historique du navigateur ou les favoris enregistrés sur votre téléphone. Des applications malveillantes peuvent utiliser cette fonction pour effacer ou modifier les données de votre navigateur."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modifier les autorisations de géolocalisation du navigateur"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permet à une application de modifier les autorisations de géolocalisation du navigateur. Les applications malveillantes peuvent se servir de cette fonctionnalité pour envoyer des informations de lieu à des sites Web arbitraires."</string>
     <string name="save_password_message" msgid="767344687139195790">"Voulez-vous que le navigateur se souvienne de ce mot de passe ?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Pas maintenant"</string>
-    <string name="save_password_remember" msgid="6491879678996749466">"Se souvenir du mot de passe"</string>
+    <string name="save_password_remember" msgid="6491879678996749466">"Mémoriser"</string>
     <string name="save_password_never" msgid="8274330296785855105">"Jamais"</string>
     <string name="open_permission_deny" msgid="5661861460947222274">"Vous n\'êtes pas autorisé à ouvrir cette page."</string>
     <string name="text_copied" msgid="4985729524670131385">"Le texte a été copié dans le presse-papier."</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"il y a 1 heure"</item>
     <item quantity="other" msgid="2467273239587587569">"Il y a <xliff:g id="COUNT">%d</xliff:g> heures"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"hier"</item>
     <item quantity="other" msgid="2479586466153314633">"Il y a <xliff:g id="COUNT">%d</xliff:g> jours"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Masquer"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Tout afficher"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Chargement..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Stockage de masse USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Connecté à l\'aide d\'un câble USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Vous avez connecté votre téléphone à votre ordinateur à l\'aide d\'un câble USB. Sélectionnez Monter pour copier des fichiers de votre ordinateur vers votre carte SD, ou inversement."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Monter"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Ne pas monter"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Vous avez connecté votre téléphone à votre ordinateur à l\'aide d\'un câble USB. Sélectionnez le bouton ci-dessous pour copier des fichiers de votre ordinateur vers la carte SD de votre Android, ou inversement."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activer le périphérique de stockage USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Un problème est survenu lors de l\'utilisation de votre carte SD en tant que périphérique de stockage USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Connecté avec un câble USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Activez pour copier des fichiers vers/de votre ordinateur."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Éteindre le périphérique de stockage USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Sélectionner pour éteindre le périphérique de stockage USB"</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Éteindre le périphérique de stockage USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Avant d\'éteindre le périphérique de stockage USB, assurez-vous d\'avoir désactivé l\'hôte USB. Sélectionnez \"Éteindre\" pour éteindre le périphérique de stockage USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Éteindre"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Annuler"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Un problème est survenu lors de la mise hors tension du périphérique de stockage USB. Assurez-vous que l\'hôte USB a bien été désactivé, puis essayez à nouveau."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Stockage USB en cours d\'utilisation"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Avant de mettre hors tension le stockage USB, assurez-vous d\'avoir désactivé (\"éjecté\") la carte SD de votre téléphone Android à partir de votre ordinateur."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Désactiver le périphérique de stockage USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Un problème est survenu lors de la mise hors tension du périphérique de stockage USB. Assurez-vous que l\'hôte USB a bien été désactivé, puis essayez à nouveau."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formater la carte SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Voulez-vous vraiment formater la carte SD ? Toutes les données de cette carte seront perdues."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Aucune activité correspondante trouvée"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"mettre à jour les données statistiques du composant"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Permet de modifier les données statistiques collectées du composant. Cette option n\'est pas utilisée par les applications standard."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Permet d\'appeler le service de conteneur par défaut pour copier le contenu. Ne pas utiliser pour les applications standard."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Permet d\'appeler le service de conteneur par défaut pour copier le contenu. Ne pas utiliser pour les applications standard."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Appuyer deux fois pour régler le zoom"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Erreur lors de l\'agrandissement du widget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"OK"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Ajouter un contact"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"sélectionné"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"non sélectionné"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Les applications suivantes demandent l\'autorisation d\'accéder à votre compte à partir de maintenant."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Voulez-vous autoriser cette demande ?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Demande d\'accès"</string>
     <string name="allow" msgid="7225948811296386551">"Autoriser"</string>
     <string name="deny" msgid="2081879885755434506">"Refuser"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Autorisation demandée"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocole de tunnelisation de niveau 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Clé pré-partagée basée sur L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificat basé sur L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Sélectionner un fichier"</string>
+    <string name="reset" msgid="2448168080964209908">"Réinitialiser"</string>
+    <string name="submit" msgid="1602335572089911941">"Envoyer"</string>
+    <string name="description_star" msgid="2654319874908576133">"favori"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Partage de connexion par USB disponible"</string>
+    <string name="tether_message" msgid="554549994538298101">"Pour que votre ordinateur puisse profiter de la connexion de données cellulaires de votre téléphone, sélectionnez \"Partager la connexion\"."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Partager la connexion"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Annuler"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Un problème est survenu lors du partage de connexion."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Partage de connexion par USB disponible"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Sélectionnez cette option pour que votre ordinateur partage la connexion de données cellulaires de votre téléphone."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Désactiver le partage de connexion"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Sélectionnez cette option pour désactiver le partage de connexion avec votre ordinateur."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Déconnecter le partage de connexion"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Vous partagez la connexion de données cellulaires de votre téléphone avec votre ordinateur. Sélectionnez \"Déconnecter\" pour mettre fin au partage de connexion par USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Déconnecter"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Annuler"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Un problème est survenu lors de la désactivation du partage de connexion. Veuillez réessayer."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 58229dd..b77e8fd 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -133,7 +133,7 @@
     <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Audio non attivo"</string>
     <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Audio attivo"</string>
     <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"Modalità aereo"</string>
-    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Disattiva modalità aereo"</string>
+    <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"Modalità aereo attiva"</string>
     <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"Disattiva modalità aeereo"</string>
     <string name="safeMode" msgid="2788228061547930246">"Modalità provvisoria"</string>
     <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Consente a un\'applicazione di attivare il debug per un\'altra applicazione. Le applicazioni dannose possono sfruttare questa possibilità per interrompere altre applicazioni."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"modifica impostazioni UI"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Consente a un\'applicazione di modificare la configurazione corrente, come le dimensioni dei caratteri locali o complessive."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"abilitazione modalità auto"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Consente a un\'applicazione di abilitare la modalità auto."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"interruzione processi in background"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Consente a un\'applicazione di terminare i processi in background di altre applicazioni, anche se la memoria non è insufficiente."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"interruzione forzata di altre applicazioni"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Consente a un\'applicazione di interrompere forzatamente altre applicazioni."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"chiusura forzata dell\'applicazione"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Consente a un\'applicazione di forzare la chiusura di attività in primo piano. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"recupero stato interno del sistema"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Consente la modifica delle statistiche sulla batteria raccolte. Da non usare per normali applicazioni."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controllo del backup di sistema e ripristino"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Consente all\'applicazione di controllare il meccanismo di backup e ripristino del sistema. Da non usare per normali applicazioni."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"effettuare il backup e il ripristino dei dati dell\'applicazione"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Consente all\'applicazione di partecipare al meccanismo di backup e ripristino del sistema."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visualizzazione finestre non autorizzate"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Consente la creazione di finestre destinate all\'uso nell\'interfaccia utente di sistema interna. Da non usare per normali applicazioni."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visualizzazione avvisi di sistema"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Consente l\'associazione all\'interfaccia principale di un metodo di inserimento. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"associazione a sfondo"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Consente l\'associazione di uno sfondo all\'interfaccia principale. Non dovrebbe mai essere necessario per le normali applicazioni."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interazione con un amministratore dispositivo"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Consente l\'invio di intent a un amministratore del dispositivo. L\'autorizzazione non deve mai essere necessaria per le normali applicazioni."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"modifica orientamento dello schermo"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Consente a un\'applicazione di cambiare la rotazione dello schermo in qualsiasi momento. Non dovrebbe essere mai necessario per le normali applicazioni."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"invio segnali Linuz alle applicazioni"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Consente a un\'applicazione di installare nuovi pacchetti Android o aggiornamenti. Le applicazioni dannose possono sfruttare questa possibilità per aggiungere nuove applicazioni con potenti autorizzazioni arbitrarie."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"eliminazione dati della cache applicazioni"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Consente a un\'applicazione di liberare spazio sul telefono eliminando file nella directory della cache dell\'applicazione. L\'accesso è generalmente limitato a processi di sistema."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"lettura file di registro sistema"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Consente a un\'applicazione di leggere vari file di registro del sistema per trovare informazioni generali sulle operazioni effettuate con il telefono. Tali file non dovrebbero contenere informazioni personali o riservate."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"lettura/scrittura risorse di proprietà di diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Consente a un\'applicazione di modificare i dati del proprietario del telefono memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per cancellare o modificare tali dati."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"lettura dati proprietario"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Consente a un\'applicazione di leggere i dati del proprietario del telefono memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per leggere tali dati."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"lettura dati di calendario"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Consente la lettura da parte di un\'applicazione di tutti gli eventi di calendario memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per inviare i tuoi eventi di calendario ad altre persone."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"scrittura dati di calendario"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Consente a un\'applicazione di modificare gli eventi di calendario memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per cancellare o modificare i dati del calendario."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"fonti di localizzazione fittizie per test"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Creare fonti di localizzazione fittizie per test. Le applicazioni dannose possono sfruttare questa possibilità per sostituire la posizione e/o lo stato restituito da reali fonti di localizzazione come GPS o provider di rete."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi del provider di localizz."</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Consente montaggio e smontaggio da parte dell\'applicazione dei filesystem degli archivi rimovibili."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formattazione archivio esterno"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Consente all\'applicazione di formattare l\'archivio rimovibile."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"recupero di informazioni sull\'archiviazione protetta"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Consente all\'applicazione di ottenere informazioni sull\'archiviazione protetta."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"creazione archiviazione protetta"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Consente all\'applicazione di creare un\'archiviazione protetta."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"eliminazione archiviazione protetta"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Consente all\'applicazione di eliminare l\'archiviazione protetta."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montaggio/smontaggio archiviazione protetta"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Consente all\'applicazione di montare/smontare l\'archiviazione protetta."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"rinominazione archiviazione protetta"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Consente all\'applicazione di rinominare l\'archiviazione protetta."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controllo vibrazione"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Consente all\'applicazione di controllare la vibrazione."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controllo flash"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Consente all\'applicazione di impostare i suggerimenti per le dimensioni dello sfondo del sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"ripristino impostazioni predef. di fabbrica"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Consente a un\'applicazione di ripristinare le impostazioni di fabbrica del sistema, eliminando tutti i dati, le configurazioni e le applicazioni installate."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"impostazione ora"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Consente a un\'applicazione di modificare l\'ora dell\'orologio del telefono."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"impostazione fuso orario"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Consente a un\'applicazione di modificare il fuso orario del telefono."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"agire da AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"scrittura impostazioni APN"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Consente a un\'applicazione di modificare le impostazioni APN, come proxy e porta di qualsiasi APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"modifica connettività di rete"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Consente a un\'applicazione di modificare lo stato di connettività di rete."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Consente a un\'applicazione di modificare lo stato di connettività di rete."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"modifica della connettività tethering"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Consente a un\'applicazione di modificare lo stato di connettività di rete tethering."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"cambiare l\'impostazione di utilizzo dei dati in background"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Consente a un\'applicazione di cambiare l\'impostazione di utilizzo dei dati in background."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"visualizzazione stato Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Consente a un\'applicazione di scrivere nuove parole nel dizionario utente."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificare/eliminare i contenuti della scheda SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Consente a un\'applicazione di scrivere sulla scheda SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"accesso al filesystem nella cache"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Consente a un\'applicazione di leggere e scrivere il filesystem nella cache."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limita password"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Limita i tipi di password che sei autorizzato a utilizzare."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Controlla i tentativi di accesso"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Monitora i tentativi non riusciti di accedere al dispositivo per eseguire un\'azione."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Reimposta password"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Forza un nuovo valore per la password, chiedendo all\'amministratore di concedertelo prima di poter eseguire l\'accesso."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Forza blocco"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Controlla quando il dispositivo si blocca, chiedendoti di reinserire la password."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Cancella tutti i dati"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Esegui un ripristino di fabbrica, eliminando tutti i tuoi dati senza conferma."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Casa"</item>
     <item msgid="869923650527136615">"Cellulare"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"tramite <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> tramite <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Inserisci il PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Inserisci password per sbloccare"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Codice PIN errato."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Per sbloccare, premi Menu, poi 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numero di emergenza"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Premi Menu per sbloccare."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Traccia la sequenza di sblocco"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Chiamata di emergenza"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Corretta."</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Riprova"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"In carica (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Sblocca"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Audio attivato"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Audio disattivato"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Cancella"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Consente all\'applicazione di leggere tutti gli URL visitati e tutti i segnalibri del browser."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"creazione cronologia e segnalibri del browser"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Consente a un\'applicazione di modificare la cronologia o i segnalibri del browser memorizzati sul telefono. Le applicazioni dannose possono sfruttare questa possibilità per cancellare o modificare i dati del browser."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modifica le autorizzazioni di localizzazione geografica del browser"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Consente a un\'applicazione di modificare le autorizzazioni di localizzazione geografica del browser. Le applicazioni dannose possono utilizzare questa autorizzazione per consentire l\'invio di informazioni sulla posizione a siti web arbitrari."</string>
     <string name="save_password_message" msgid="767344687139195790">"Memorizzare la password nel browser?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Non ora"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Memorizza"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 ora fa"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> ore fa"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"ieri"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> giorni fa"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Nessuna autorizzazione richiesta"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Nascondi"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostra tutto"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Caricamento..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Archiviazione di massa USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB collegata"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Il telefono è stato collegato al computer tramite USB. Seleziona \"Collega\" se desideri copiare file tra il computer e la scheda SD del telefono."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Collega"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Non collegare"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Il telefono è stato collegato al computer tramite USB. Seleziona il pulsante sottostante se desideri copiare file tra il computer e la scheda SD di Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Attiva archivio USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Problema di utilizzo della scheda SD per l\'archiviazione USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB collegata"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleziona per copiare file sul/dal tuo computer."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Disattiva archivio USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Seleziona per disattivare archivio USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Disattiva archivio USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Prima di disattivare l\'archivio USB, verifica di aver smontato l\'host USB. A tale scopo, seleziona \"Disattiva\"."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Disattiva"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Annulla"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Abbiamo riscontrato un problema durante la disattivazione dell\'archivio USB. Verifica di aver smontato l\'host USB e riprova."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Archiviazione USB in uso"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Prima di disattivare l\'archiviazione USB, assicurati di avere smontato (\"espulso\") la scheda SD di Android dal computer."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Disattiva archiviazione USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Si è verificato un problema durante la disattivazione dell\'archiviazione USB. Verifica di avere smontato l\'host USB e riprova."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatta scheda SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Formattare la scheda SD? Tutti i dati sulla scheda verranno persi."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatta"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Nessuna attività corrispondente trovata"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"aggiornare le statistiche di utilizzo dei componenti"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Consente la modifica delle statistiche di utilizzo dei componenti raccolte. Da non usare per normali applicazioni."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Consente di invocare il servizio contenitore predefinito per la copia di contenuti. Da non usare per normali applicazioni."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Consente di invocare il servizio contenitore predefinito per la copia di contenuti. Da non usare per normali applicazioni."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tocca due volte per il comando dello zoom"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Errore durante l\'ampliamento del widget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Vai"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Crea contatto"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"selezionato"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"non selezionato"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Le seguenti applicazioni richiedono l\'autorizzazione per accedere al tuo account, adesso e in futuro."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Accettare la richiesta?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Richiesta di accesso"</string>
     <string name="allow" msgid="7225948811296386551">"Consenti"</string>
     <string name="deny" msgid="2081879885755434506">"Nega"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Autorizzazione richiesta"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocollo di tunneling livello 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec basata su chiave precondivisa"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec basata su certificato"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Scegli file"</string>
+    <string name="reset" msgid="2448168080964209908">"Reimposta"</string>
+    <string name="submit" msgid="1602335572089911941">"Invia"</string>
+    <string name="description_star" msgid="2654319874908576133">"preferiti"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Tethering USB disponibile"</string>
+    <string name="tether_message" msgid="554549994538298101">"Seleziona \"Tethering\" per condividere la connessione dati del telefono con il computer."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Tethering"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Annulla"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Si è verificato un problema con il tethering."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Tethering USB disponibile"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Seleziona per impostare il tethering del computer con il telefono."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Interrompi tethering"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Seleziona per interrompere il tethering del computer."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Disconnetti tethering"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Stai condividendo la connessione dati del telefono con il computer. Seleziona \"Disconnetti\" per disconnettere il tethering USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Disconnetti"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Annulla"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Si è verificato un problema durante la disattivazione del tethering. Riprova."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b6ac84e..3e53107 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"別のアプリケーションをデバッグモードにすることをアプリケーションに許可します。悪意のあるアプリケーションが別のアプリケーションを終了させる恐れがあります。"</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI設定の変更"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"地域/言語やフォントのサイズなど、現在の設定の変更をアプリケーションに許可します。"</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"運転モードの有効化"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"運転モードを有効にすることをアプリケーションに許可します。"</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"バックグラウンドプロセスの終了"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"メモリが不足していなくても、別のアプリケーションのバックグラウンドプロセスを終了することをアプリケーションに許可します。"</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"別のアプリケーションの強制停止"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"別のアプリケーションの強制停止をアプリケーションに許可します。"</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"アプリケーションの強制終了"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_dump" msgid="1681799862438954752">"システムの内部状態の取得"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"収集した電池統計情報の変更を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"システムのバックアップと復元を制御する"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"システムのバックアップと復元メカニズムの制御をアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"アプリケーションデータのバックアップと復元"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"システムのバックアップと復元メカニズムへのアプリケーションの参加を許可します。"</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"未許可のウィンドウの表示"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"内部システムのユーザーインターフェースで使用するためのウィンドウ作成を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"システムレベルの警告の表示"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"入力方法のトップレベルインターフェースに関連付けることを所有者に許可します。通常のアプリケーションにはまったく必要ありません。"</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"壁紙にバインド"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"壁紙のトップレベルインターフェースへのバインドを所有者に許可します。通常のアプリケーションでは不要です。"</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"デバイス管理者との通信"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"デバイス管理者へのintentの送信を所有者に許可します。通常のアプリケーションでは不要です。"</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"画面の向きの変更"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"いつでも画面の回転を変更することをアプリケーションに許可します。通常のアプリケーションにはまったく必要ありません。"</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Linuxのシグナルをアプリケーションに送信"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Androidパッケージのインストール/更新をアプリケーションに許可します。悪意のあるアプリケーションが、勝手に強力な権限を持つ新しいアプリケーションを追加する恐れがあります。"</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"アプリケーションキャッシュデータの削除"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"アプリケーションのキャッシュディレクトリからファイルを削除して携帯電話のメモリを解放することをアプリケーションに許可します。通常、アクセスはシステムプロセスのみに制限されます。"</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"システムログファイルの読み取り"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"システムのさまざまなログファイルの読み取りをアプリケーションに許可します。これにより携帯電話の使用状況に関する全般情報が取得されますが、個人情報や非公開情報が含まれることはありません。"</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"diagが所有するリソースの読み書き"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"端末に保存した所有者のデータの変更をアプリケーションに許可します。悪意のあるアプリケーションが所有者のデータを消去/変更する恐れがあります。"</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"所有者データの読み取り"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"携帯電話に保存した所有者データの読み取りをアプリケーションに許可します。悪意のあるアプリケーションが所有者データを読み取る恐れがあります。"</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"カレンダーデータの読み取り"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"端末に保存したカレンダーの予定の読み取りをアプリケーションに許可します。悪意のあるアプリケーションがカレンダーの予定を他人に送信する恐れがあります。"</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"カレンダーデータの書き込み"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"端末に保存したカレンダーの予定の変更をアプリケーションに許可します。悪意のあるアプリケーションが、カレンダーデータを消去/変更する恐れがあります。"</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"仮の位置情報でテスト"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"テスト用に仮の位置情報源を作成します。これにより悪意のあるアプリケーションが、GPS、ネットワークプロバイダなどから返される本当の位置情報や状況を改ざんする恐れがあります。"</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"位置情報提供者の追加コマンドアクセス"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"リムーバブルメモリのファイルシステムのマウントとマウント解除をアプリケーションに許可します。"</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"外部ストレージのフォーマット"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"アプリケーションがリムーバブルストレージをフォーマットすることを許可します。"</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"セキュアストレージ上の情報の取得"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"セキュアストレージ上の情報の取得をアプリケーションに許可します。"</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"セキュアストレージの作成"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"セキュアストレージの作成をアプリケーションに許可します。"</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"セキュアストレージの破棄"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"セキュアストレージの破棄をアプリケーションに許可します。"</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"セキュアストレージのマウント/マウント解除"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"セキュアストレージのマウント/マウント解除をアプリケーションに許可します。"</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"セキュアストレージ名の変更"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"セキュアストレージ名の変更をアプリケーションに許可します。"</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"バイブレーション制御"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"バイブレーションの制御をアプリケーションに許可します。"</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"ライトのコントロール"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"システムの壁紙サイズのヒントの設定をアプリケーションに許可します。"</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"システムを出荷時設定にリセット"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"データ、設定、インストールしたアプリケーションをすべて消去して、完全に出荷時の設定にシステムをリセットすることをアプリケーションに許可します。"</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"時刻の設定"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"携帯電話の時刻の変更をアプリケーションに許可します。"</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"タイムゾーンの設定"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"端末のタイムゾーンの変更をアプリケーションに許可します。"</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerServiceとして機能"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"アクセスポイント名設定の書き込み"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"APNのプロキシやポートなどのAPN設定の変更をアプリケーションに許可します。"</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"ネットワーク接続の変更"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"ネットワークの接続状態の変更をアプリケーションに許可します。"</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"ネットワークの接続状態の変更をアプリケーションに許可します。"</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"テザリング接続の変更"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"ネットワークのテザリング接続状態の変更をアプリケーションに許可します。"</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"バックグラウンドデータ使用設定の変更"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"バックグラウンドデータ使用の設定の変更をアプリケーションに許可します。"</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Wi-Fi状態の表示"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"アプリケーションがユーザー辞書に新しい語句を書き込むことを許可します。"</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"SDカードのコンテンツを修正/削除する"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"SDカードへの書き込みをアプリケーションに許可します。"</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"キャッシュファイルシステムにアクセス"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"キャッシュファイルシステムへの読み書きをアプリケーションに許可します。"</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"パスワードの制限"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"使用できるパスワードの種類を制限します。"</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"ログインの監視"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"携帯電話へのログインの失敗を監視し、何らかの処置をとります。"</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"パスワードのリセット"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"パスワードを強制的に新しい値に変更します。ログインするには管理者からその値を通知してもらう必要があります。"</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"強制ロック"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"携帯電話のロック時を管理します。パスワードの再入力が必要となります。"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"すべてのデータを消去"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"出荷時設定にリセットします。確認なしでデータがすべて削除されます。"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"自宅"</item>
     <item msgid="869923650527136615">"携帯"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"<xliff:g id="SOURCE">%1$s</xliff:g>経由"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g>、更新元: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PINコードを入力"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"ロックを解除するにはパスワードを入力"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PINコードが正しくありません。"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"MENU、0キーでロック解除"</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"緊急通報番号"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"MENUキーでロック解除"</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ロックを解除するパターンを入力"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"緊急通報"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"一致しました"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"やり直してください"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"充電中(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"ロック解除"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"サウンドON"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"サウンドOFF"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"通知を消去"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"ブラウザでアクセスしたすべてのURLおよびブラウザのすべてのブックマークの読み取りをアプリケーションに許可します。"</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"ブラウザの履歴とブックマークを書き込む"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"携帯電話に保存されているブラウザの履歴やブックマークの修正をアプリケーショに許可します。これにより悪意のあるアプリケーションが、ブラウザのデータを消去または変更する恐れがあります。"</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"ブラウザの位置情報へのアクセス権を変更"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"ブラウザの位置情報に対するアクセス権の変更をアプリケーションに許可します。この設定では、悪意のあるアプリケーションが任意のウェブサイトに位置情報を送信する可能性があります。"</string>
     <string name="save_password_message" msgid="767344687139195790">"このパスワードをブラウザで保存しますか?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"今は保存しない"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"保存"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1時間前"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g>時間前"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"昨日"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g>日前"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"権限の許可は必要ありません"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"隠す"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"すべて表示"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"読み込み中..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USBマスストレージ"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB接続"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"USB経由で携帯電話をコンピュータに接続しました。コンピュータと携帯電話のSDカード間でファイルをコピーするには、[マウント]を選択します。"</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"マウント"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"マウントしない"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"携帯電話をUSBでパソコンに接続しています。パソコンとAndroidのSDカード間でファイルをコピーするには、下のボタンを選択します。"</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USBストレージをONにする"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"USBメモリにSDカードを使用する際に問題が発生しました。"</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB接続"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"パソコンとの間でファイルをコピーします。"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USBストレージをOFFにする"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"USBストレージをOFFにする場合に選択します。"</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"USBストレージをOFFにする"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"USBストレージをOFFにする前にUSBホストのマウントを解除したことを確認してください。USBストレージをOFFにするには[OFF]を選択します。"</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"OFF"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"キャンセル"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"USBストレージをOFFにする際に問題が発生しました。USBホストのマウントが解除されていることを確認してからもう一度お試しください。"</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USBストレージを使用中"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"USBストレージをOFFにする前に、パソコンで必ずAndroidのSDカードのマウントを解除して(カードを取り出して)ください。"</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USBストレージをOFFにする"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"USBストレージをOFFにする際に問題が発生しました。USBホストのマウントが解除されていることを確認してからもう一度お試しください。"</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"SDカードをフォーマット"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"SDカードをフォーマットしてもよろしいですか?カード内のすべてのデータが失われます。"</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"フォーマット"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"一致するアクティビティが見つかりません"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"コンポーネント使用状況に関する統計情報の更新"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"収集されたコンポーネント使用状況に関する統計情報の変更を許可します。通常のアプリケーションでは使用しません。"</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"既定のコンテナサービスを呼び出してコンテンツをコピーすることをアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"既定のコンテナサービスを呼び出してコンテンツをコピーすることをアプリケーションに許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"ダブルタップでズームします"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"ウィジェットの展開エラー"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"移動"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"連絡先を新規登録"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"オン"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"オフ"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"下記のアプリケーションが、アカウントへのアクセスを今後も許可するようにリクエストしています。"</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"このリクエストを許可してもよろしいですか?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"アクセスリクエスト"</string>
     <string name="allow" msgid="7225948811296386551">"許可"</string>
     <string name="deny" msgid="2081879885755434506">"拒否"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"リクエスト済み権限"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"レイヤー2トンネリングプロトコル"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPNベースの事前共有鍵"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPNベースの証明書"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"ファイルを選択"</string>
+    <string name="reset" msgid="2448168080964209908">"リセット"</string>
+    <string name="submit" msgid="1602335572089911941">"送信"</string>
+    <string name="description_star" msgid="2654319874908576133">"お気に入り"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USBテザリングが可能"</string>
+    <string name="tether_message" msgid="554549994538298101">"携帯電話のデータ接続をパソコンと共有するには[テザリング]を選択します。"</string>
+    <string name="tether_button" msgid="7409514810151603641">"テザリング"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"キャンセル"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"テザリング中に問題が発生しました。"</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USBテザリングが可能"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"パソコンを携帯電話にテザリングする場合に選択します。"</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"テザリングの解除"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"パソコンのテザリングを解除する場合に選択します。"</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"テザリングの切断"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"携帯電話のデータ接続をパソコンと共有しています。USBテザリングを切断するには[接続を解除]を選択します。"</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"接続を解除"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"キャンセル"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"テザリングをOFFにする際に問題が発生しました。もう一度お試しください。"</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 222139b..c17bf4f 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"응용프로그램이 다른 응용프로그램에 대해 디버깅을 사용할 수 있도록 합니다. 이 경우 악성 응용프로그램이 다른 응용프로그램을 중지시킬 수 있습니다."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"UI 설정 변경"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"응용프로그램이 로케일 또는 전체 글꼴 크기와 같은 현재 구성을 변경할 수 있도록 합니다."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"차량 모드 사용"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"응용프로그램이 차량 모드를 사용할 수 있도록 합니다."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"백그라운드 프로세스 종료"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"메모리가 부족하지 않은 경우에도 응용프로그램이 다른 응용프로그램의 백그라운드 프로세스를 중단할 수 있도록 합니다."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"다른 응용프로그램 강제 종료"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"응용프로그램이 다른 응용프로그램을 강제로 종료할 수 있도록 합니다."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"강제로 응용프로그램 닫기"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫고 되돌아갈 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"시스템 내부 상태 검색"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"수집된 배터리 통계를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용할 수 없습니다."</string>
     <string name="permlab_backup" msgid="470013022865453920">"시스템 백업 및 복원 관리"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"응용프로그램이 시스템의 백업 및 복원 매커니즘을 제어할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"응용프로그램 데이터 백업 및 복원"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"응용프로그램이 시스템의 백업 및 복원 매커니즘에 참여할 수 있도록 합니다."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"인증되지 않은 창 표시"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"내부 시스템 사용자 인터페이스에서 사용하는 창을 만들 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"시스템 수준 경고 표시"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"보유자가 입력 방법의 최상위 인터페이스만 사용하도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"배경화면만 사용"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"보유자가 배경화면의 최상위 인터페이스만 사용하도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"기기 관리자와 상호 작용"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"보유자가 기기 관리자에게 인텐트를 보낼 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"화면 방향 변경"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"응용프로그램이 언제든지 화면 회전을 변경할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"응용프로그램에 Linux 신호 보내기"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"응용프로그램이 새로운 또는 업데이트된 Android 패키지를 설치할 수 있도록 합니다. 이 경우 악성 응용프로그램이 임의의 강력한 권한으로 새 응용프로그램을 추가할 수 있습니다."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"모든 응용프로그램 캐시 데이터 삭제"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"응용프로그램이 응용프로그램 캐시 디렉토리에 있는 파일을 삭제하여 휴대전화의 저장공간을 늘릴 수 있도록 합니다. 액세스는 일반적으로 시스템 프로세스로 제한됩니다."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"시스템 로그 파일 읽기"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"응용프로그램이 시스템의 다양한 로그 파일을 읽을 수 있도록 합니다. 이 경우 응용프로그램은 사용자가 휴대전화로 수행하는 작업에 대한 일반적인 정보를 검색할 수 있지만 여기에 개인정보는 포함되어서는 안 됩니다."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"진단 그룹 소유의 리소스 읽기/작성"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"응용프로그램이 휴대전화에 저장된 소유자 데이터를 수정할 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 소유자 데이터를 지우거나 수정할 수 있습니다."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"소유자 데이터 읽기"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"응용프로그램이 휴대전화에 저장된 휴대전화 소유자 데이터를 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화 소유자 데이터를 읽을 수 있습니다."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"캘린더 데이터 읽기"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"응용프로그램이 휴대전화에 저장된 모든 캘린더 일정을 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 캘린더 일정을 다른 사람에게 보낼 수 있습니다."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"캘린더 데이터 작성"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"응용프로그램이 휴대전화에 저장된 캘린더 일정을 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 캘린더 데이터를 지우거나 수정할 수 있습니다."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"테스트를 위해 위치 소스로 가장"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"테스트용 가짜 위치 소스를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 제공업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓸 수 있습니다."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"추가 위치 제공업체 명령 액세스"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"응용프로그램이 이동식 저장소의 파일 시스템을 마운트하고 마운트 해제할 수 있도록 합니다."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"외부 저장소 포맷"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"응용프로그램이 제거 가능한 저장소를 포맷하도록 합니다."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"보안 저장소에 대한 정보 가져오기"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"응용프로그램이 보안 저장소의 정보를 가져올 수 있도록 합니다."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"보안 저장소 만들기"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"응용프로그램이 보안 저장소를 만들 수 있도록 합니다."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"보안 저장소 제거"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"응용프로그램이 보안 저장소를 제거할 수 있도록 합니다."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"보안 저장소 마운트/마운트 해제"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"응용프로그램이 보안 저장소를 마운트/마운트 해제할 수 있도록 합니다."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"보안 저장소 이름 바꾸기"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"응용프로그램이 보안 저장소의 이름을 바꿀 수 있도록 합니다."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"진동 제어"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"응용프로그램이 진동을 제어할 수 있도록 합니다."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"손전등 제어"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"응용프로그램이 시스템 배경화면 크기 힌트를 설정할 수 있도록 합니다."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"시스템을 기본값으로 재설정"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"응용프로그램이 모든 데이터, 구성 및 설치된 응용프로그램을 지워서 시스템을 완전히 초기화할 수 있도록 합니다."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"시간 설정"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"응용프로그램이 휴대전화 시계의 시간을 변경할 수 있도록 합니다."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"표준시간대 설정"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"응용프로그램이 휴대전화의 표준시간대를 변경할 수 있도록 합니다."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerService로 활동"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"액세스포인트 이름 설정 쓰기"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"응용프로그램이 APN의 프록시 및 포트 같은 APN 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"네트워크 연결 변경"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"응용프로그램이 네트워크 연결 상태를 변경할 수 있도록 합니다."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"응용프로그램이 네트워크 연결 상태를 변경할 수 있도록 합니다."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"연결 변경"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"응용프로그램이 연결된 네트워크의 연결 상태를 변경할 수 있도록 합니다."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"백그라운드 데이터 사용 설정 변경"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"응용프로그램이 백그라운드 데이터 사용 설정을 변경할 수 있도록 합니다."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Wi-Fi 상태 보기"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"응용프로그램이 사용자 사전에 새 단어를 입력할 수 있도록 합니다."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD 카드 콘텐츠 수정/삭제"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"응용프로그램이 SD 카드에 쓸 수 있도록 합니다."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"캐시 파일시스템 액세스"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"응용프로그램이 캐시 파일시스템을 읽고 쓸 수 있도록 합니다."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"비밀번호 제한"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"사용할 수 있는 비밀번호 유형을 제한합니다."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"로그인 시도 보기"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"몇 가지 작업을 수행하기 위해 기기에 대해 실패한 로그인 시도를 모니터링합니다."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"비밀번호 재설정"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"비밀번호를 새 값으로 강제 설정합니다. 이를 수행하려면 로그인하기 전에 관리자에게 새로 지정할 비밀번호 값을 요청해야 합니다."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"강제 잠금"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"기기가 잠겨 있을 때 작동하려면 비밀번호를 다시 입력해야 합니다."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"모든 데이터 삭제"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"초기화를 수행하여 모든 데이터를 확인하지 않고 삭제합니다."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"집"</item>
     <item msgid="869923650527136615">"모바일"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"<xliff:g id="SOURCE">%1$s</xliff:g>을(를) 통해"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g>(<xliff:g id="SOURCE">%2$s</xliff:g> 사용)"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN 코드 입력"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"잠금을 해제하려면 비밀번호 입력"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 코드가 잘못되었습니다."</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"잠금해제하려면 메뉴를 누른 다음 0을 누릅니다."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"비상 전화번호"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"잠금해제하려면 메뉴를 누르세요."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"잠금해제를 위해 패턴 그리기"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"비상 전화"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"맞습니다."</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"죄송합니다. 다시 시도하세요."</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"충전 중(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -513,7 +543,7 @@
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"SIM 카드가 없습니다."</string>
     <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"휴대전화에 SIM 카드가 없습니다."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"SIM 카드를 삽입하세요."</string>
-    <string name="emergency_calls_only" msgid="6733978304386365407">"비상 전화만"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"긴급 통화만"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"네트워크 잠김"</string>
     <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 카드의 PUK가 잠겨 있습니다."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"사용자 가이드를 참조하거나 고객지원팀에 문의하세요."</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"잠금해제"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"사운드 켜기"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"사운드 끄기"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"지우기"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"응용프로그램이 브라우저로 방문한 모든 URL과 브라우저의 모든 북마크를 읽도록 허용합니다."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"브라우저의 기록 및 북마크 쓰기"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"응용프로그램이 휴대전화에 저장된 브라우저 기록 또는 북마크를 수정할 수 있도록 허용합니다. 이 경우 악성 응용프로그램이 브라우저의 데이터를 지우거나 수정할 수 있습니다."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"브라우저 위치 정보 수정 권한"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"응용프로그램이 브라우저의 위치 정보 권한을 수정할 수 있도록 합니다. 악성 응용프로그램이 이를 사용하여 임의의 웹사이트에 위치 정보를 보낼 수도 있습니다."</string>
     <string name="save_password_message" msgid="767344687139195790">"브라우저에 이 비밀번호를 저장하시겠습니까?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"나중에"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"저장"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1시간 전"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g>시간 전"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"어제"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g>일 전"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"권한 필요 없음"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"숨기기"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"모두 표시"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"로드 중..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB 대용량 저장소"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB 연결됨"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"USB를 통해 휴대전화를 컴퓨터에 연결했습니다. 컴퓨터와 휴대전화 SD 카드 간에 파일을 복사하려면 \'마운트\'를 선택하세요."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"마운트"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"마운트 안함"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"USB를 통해 휴대전화를 컴퓨터에 연결했습니다. 컴퓨터와 Android의 SD 카드 간에 파일을 복사하려면 아래의 버튼을 선택하세요."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB 저장소 사용"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"USB 저장소로 SD 카드를 사용하는 동안 문제가 발생했습니다."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB 연결됨"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"컴퓨터에 파일을 복사하거나 컴퓨터의 파일을 복사하려면 선택합니다."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB 저장소 끄기"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"USB 저장소 끄기를 선택하세요."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"USB 저장소 끄기"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"USB 저장소를 끄기 전에 반드시 USB 호스트에서 마운트 해제하세요. USB 저장소를 끄려면 \'끄기\'를 선택하세요."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"USB 저장소 끄기"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"취소"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"USB 저장소를 끄는 동안 문제가 발생했습니다. USB 호스트와 연결을 해제했는지 확인한 다음 다시 시도하세요."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB 저장소 사용 중"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"USB 저장소를 사용하지 않도록 설정하기 전에 컴퓨터에서 Android의 SD 카드를 마운트 해제(\'방출\')했는지 확인하시기 바랍니다."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB 저장소 사용 안함"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"USB 저장소를 사용하지 않도록 설정하는 동안 문제가 발생했습니다. USB 호스트와 연결을 해제했는지 확인한 다음 다시 시도하세요."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"SD 카드 포맷"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"SD 카드를 포맷하시겠습니까? 포맷하면 카드의 모든 데이터를 잃게 됩니다."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"포맷"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"일치하는 활동이 없습니다."</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"구성 요소 사용 통계 업데이트"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"수집된 구성요소 사용 통계를 수정할 수 있는 권한을 부여합니다. 일반 응용프로그램은 이 권한을 사용할 수 없습니다."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"기본 컨테이너 서비스를 호출하여 콘텐츠를 복사할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"기본 컨테이너 서비스를 호출하여 콘텐츠를 복사할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"확대/축소하려면 두 번 탭하세요."</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"위젯을 확장하는 동안 오류가 발생했습니다."</string>
     <string name="ime_action_go" msgid="8320845651737369027">"이동"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"전화번호부에"\n"<xliff:g id="NUMBER">%s</xliff:g> 추가"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"선택함"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"선택 안함"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"현재 이후로 하나 이상의 다음 응용프로그램이 계정에 대한 액세스 권한을 요청합니다."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"요청을 허용하시겠습니까?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"액세스 요청"</string>
     <string name="allow" msgid="7225948811296386551">"허용"</string>
     <string name="deny" msgid="2081879885755434506">"거부"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"권한 요청"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"L2TP(Layer 2 Tunneling Protocol)"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"사전 공유 키 기반 L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"인증서 기반 L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"파일 선택"</string>
+    <string name="reset" msgid="2448168080964209908">"재설정"</string>
+    <string name="submit" msgid="1602335572089911941">"제출"</string>
+    <string name="description_star" msgid="2654319874908576133">"즐겨찾기"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB 연결 사용 가능"</string>
+    <string name="tether_message" msgid="554549994538298101">"휴대전화의 데이터 연결을 컴퓨터와 공유하려면 \'연결\'을 선택합니다."</string>
+    <string name="tether_button" msgid="7409514810151603641">"연결"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"취소"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"연결하는 중 문제가 발생했습니다."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB 연결 사용 가능"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"컴퓨터를 휴대전화에 연결하려면 선택합니다."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"연결 해제"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"컴퓨터 연결을 해제하려면 선택하세요."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"연결 끊기"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"휴대전화의 휴대전화 데이터 연결이 컴퓨터와 공유되고 있습니다. USB 연결을 해제하려면 \'연결 끊기\'를 선택하세요."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"연결 끊기"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"취소"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"연결을 사용하지 않도록 설정하는 동안 문제가 발생했습니다. 다시 시도해 주세요."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 8eb3463..359e954 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Lar applikasjonen skru på debugging for en annen applikasjon. Ondsinnede applikasjoner kan bruke dette til å drepe andre applikasjoner."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"endre innstillingene for brukergrensesnitt"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillater applikasjonen å endre gjeldende innstillinger, slik som språk eller skriftstørrelse."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"aktiver bilmodus"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillater et program å aktivere bilmodus."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"avslutt bakgrunnsprosesser"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillater et program å avslutte bakgrunnsprosesser for andre programmer, selv om det er nok minne."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"fremtving stopp av andre programmer"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillater et program å framtvinge stopp av andre programmer."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"tvinge applikasjoner til å lukkes"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Lar applikasjonen tvinge enhver aktivitet som er i forgrunnen til å lukkes og gå tilbake. Vanlige applikasjoner bør aldri trenge dette."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"hente intern systemtilstand"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Lar applikasjonen endre på innsamlet batteristatistikk. Ikke ment for vanlige applikasjoner."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollere backup og gjenoppretting"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Lar applikasjonen kontrollere systemets backup- og gjenopprettingsmekanisme. Ikke ment for vanlige applikasjoner."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"foreta backup og gjenoppretting av applikasjonens data"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Lar applikasjonen delta i systemets backup- og gjenopprettingsmekanisme."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserte vinduer"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillater at det opprettes vinduer ment for bruk av systemets interne brukergrensesnitt. Ikke ment for vanlige applikasjoner."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vise advarsler på systemnivå"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Lar applikasjonen binde til toppnivågrensesnittet for en inndatametode. Vanlige applikasjoner bør aldri trenge dette."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bind til bakgrunnsbilde"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Lar innehaveren binde det øverste nivået av grensesnittet til en bakgrunnsbilder. Skal ikke være nødvendig for vanlige programmer."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"kommuniser med enhetsadministrator"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillater innehaveren å sende hensikter til enhetsadministrator. Bør aldri være nødvendig for normale programmer."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"snu skjermen"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Lar applikasjonen rotere skjermen når som helst. Vanlige applikasjoner bør aldri trenge dette."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"sende Linux-signaler til applikasjoner"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Lar applikasjonen installere nye eller oppdaterte Android-pakker. Ondsinnede applikasjoner kan bruke dette til å legge til nye applikasjoner med vilkårlig kraftige rettigheter."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"slette hurtigbufferdata for alle applikasjoner"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Lar applikasjonen frigjøre lagringsplass ved å slette filer i applikasjoners hurtigbufferkatalog. Tilgangen er vanligvis sterkt begrenset, til systemprosesser."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"lese systemets loggfiler"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Lar applikasjonen lese fra diverse loggfiler på systemet. Disse inneholder generell informasjon om hva som gjøres med telefonen, men skal ikke inneholde personlig eller privat informasjon."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"lese/skrive ressurser eid av diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Lar applikasjonen endre dataene om telefoneieren. Ondsinnede applikasjoner kan bruke dette til å slette eller redigere telefonens eierdata."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"lese eierinformasjon"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Lar applikasjonen lese dataene om telefoneieren. Ondsinnede applikasjoner kan bruke dette til å lese telefonens eierdata."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"lese kalenderinformasjon"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Lar applikasjonen lese alle kalenderhendelser lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å sende kalenderhendelser til andre."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"skrive kalenderinformasjon"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Lar applikasjonen endre kalenderhendelser lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å slette eller endre kalenderinformasjon."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"lage simulerte plasseringskilder for testing"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Lage simulerte plassingskilder for testing. Ondsinnede applikasjoner kan bruke dette til å overstyre plasseringen og/eller statusen rapportert av ekte plasseringskilder slik som GPS eller nettverksoperatører."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få tilgang til ekstra plasseringskommandoer"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Lar applikasjonen montere og avmontere filsystemer for uttagbar lagring."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatere ekstern lagringsplass"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Lar applikasjonen formatere ekstern lagringsplass."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"få informasjon om sikker lagring"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Tillater programmet å innhente informasjon om sikker lagring."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"opprette sikker lagring"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Tillater programmet å opprette sikker lagring."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"stenge sikker lagring"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Tillater programmet å stenge sikker lagring."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"koble til eller fra sikker lagring"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Tillater programmet å koble sikker lagring til eller fra."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"gi nytt navn til sikker lagring"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Tillater programmet å gi nytt navn til sikker lagring."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontrollere vibratoren"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Lar applikasjonen kontrollere vibratoren."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kontrollere lommelykten"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Lar applikasjonen sette størrelseshint for systemets bakgrunnsbilde."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"tilbakestille systemet til fabrikkinnstillinger"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Lar applikasjonen tilbakestille systemet til fabrikkinnstillinger, noe som vil fjerne alle data, alt oppsett, og alle installerte applikasjoner."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"stille klokken"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Tillater et program å stille klokken på telefonen."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"endre tidssone"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Lar applikasjonen endre telefonens tidssone."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"fungere som kontoadministrasjonstjenesten"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"skrive APN-innstillinger"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Lar applikasjonen to endre APN-innstillinger slik som mellomtjener eller port for hvilket som helst aksesspunkt."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"endre nettverkskonnektivitet"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Lar applikasjonen endre tilstanden til nettverkskonnektivitet."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Tillater et program å endre innstillingene for nettverkstilkoblingen."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"endre tilknytningsoppsett"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Tillater et program å endre innstillingene for nettverkstilknytningen."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"endre innstilling for bakgrunnsdata"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Lar applikasjonen endre innstillingen for bakgrunnsdata."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"se tilstand for trådløse nettverk"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Lar applikasjonen skrive nye ord til den brukerdefinerte ordlisten."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"redigere/slette innhold på minnekort"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Lar applikasjonen skrive til minnekortet."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"tilgang til bufrede filer"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillater et program å lese og skrive til bufrede filer."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Begrens passord"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Begrense typene passord du kan bruke."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Overvåk påloggingsforsøk"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Overvåk mislykkede påloggingsforsøk eller forsøk på handlinger på enheten."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Tilbakestill passordet"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Fremtving tilbakestilling av passord, slik at administratoren må gi deg et nytt passord når du skal logge deg på."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Obligatorisk låsing"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Kontrollerer når enheten låses. Du må skrive inn passordet på nytt for å låse den opp."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Slett alle data"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Utfører tilbakestilling til fabrikkstandard. Alle data slettes uten varsel."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Hjemmenummer"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Skriv inn PIN-kode:"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Skriv inn passord for å låse opp"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Gal PIN-kode!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"For å låse opp, trykk på menyknappen og deretter 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nødnummer"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Trykk på menyknappen for å låse opp."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Tegn mønster for å låse opp"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Nødanrop"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Riktig!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Beklager, prøv igjen:"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Lader (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -513,7 +543,7 @@
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Mangler SIM-kort."</string>
     <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"Ikke noe SIM-kort i telefonen."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Sett inn et SIM-kort."</string>
-    <string name="emergency_calls_only" msgid="6733978304386365407">"Kun nødsamtaler"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"Kun nødanrop"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Nettverk ikke tillatt"</string>
     <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-kortet er PUK-låst."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"Se manualen eller kontakt kundeservice."</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås opp"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Lyd på"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Lyd av"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Fjern"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Lar applikasjonen lese alle adresser nettleseren har besøkt, og alle nettleserens bokmerker."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skrive til nettleserens logg og bokmerker"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Lar applikasjonen endre nettleserens logg og bokmerker lagret på telefonen. Ondsinnede applikasjoner kan bruke dette til å fjerne eller redigere nettleserens data."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Endre nettleserens tillatelser for geografisk posisjonering"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Tillater programmet å endre nettleserens tillatelser for geografisk posisjonering. Skadelige programmer kan bruke denne funksjonen til å sende posisjonsopplysninger til vilkårlige nettsteder."</string>
     <string name="save_password_message" msgid="767344687139195790">"Ønsker du at nettleseren skal huske dette passordet?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Ikke nå"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Husk"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"for en time siden"</item>
     <item quantity="other" msgid="2467273239587587569">"for <xliff:g id="COUNT">%d</xliff:g> timer siden"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"i går"</item>
     <item quantity="other" msgid="2479586466153314633">"for <xliff:g id="COUNT">%d</xliff:g> dager siden"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Trenger ingen rettigheter"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Skjul"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Vis alle"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Laster inn…"</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-masselagring"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB koblet til"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Du har koblet telefonen til en datamaskin via USB. Velg «Montér» dersom du ønsker å kopiere filer mellom datmaskinen og minnekortet i telefonen."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Montér"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Ikke montér"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Du har koblet telefonen til datamaskinen via USB. Velg knappen nedenfor hvis du vil kopiere filer mellom datamaskinen og SD-kortet i Android-telefonen."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Slå på USB-lagring"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Det oppsto et problem med å bruke minnekortet ditt for USB-lagring."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB tilkoblet"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Velg om du ønsker å kopiere filer til/fra en datamaskin."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Slå av USB-lagring"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Velg for å slå av USB-lagring."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Slå av USB-lagring"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Før du slår av USB-lagring, sjekk at du har avmontert enheten i USB-verten. Velg «slå av» for å slå av USB-lagring."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Slå av"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Avbryt"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Det har oppstått et problem ved deaktiveringen av USB-lagring. Kontroller at du har demontert USB-verten, og prøv igjen."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-lagring er i bruk"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Før du slår av USB-lagring, må du kontrollere at du har løst ut SD-kortet fra Android-telefonen fra datamaskinen."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Slå av USB-lagring"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Det oppstod et problem ved deaktivering av USB-lagring. Kontroller at du har demontert USB-verten, og prøv på nytt."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatere minnekort"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Er du sikker på at du ønsker å formatere minnekortet? Alle data på kortet vil gå tapt."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatér"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Fant ingen tilsvarende aktiviteter"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"oppdater statistikk over komponentbruk"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Tillater endring av innsamlet data om bruk av komponenter. Ikke ment for vanlige applikasjoner."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale programmer."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Tillater bruk av standard meldingsbeholdertjeneste for kopiering av innhold. Brukes ikke for normale programmer."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Trykk to ganger for zoomkontroll"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Feil under oppakking av gadget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Gå"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Lag kontakt"\n"med nummeret <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"valgt"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"ikke valgt"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Ett eller flere av de følgende programmene ber om tillatelse til å få tilgang til kontoen din fra nå av."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Vil du tillate dette?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Få tilgang til forespørsler"</string>
     <string name="allow" msgid="7225948811296386551">"Tillat"</string>
     <string name="deny" msgid="2081879885755434506">"Avslå"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Tillatelse forespurt"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Lag 2-tunneleringsprotokoll"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Passordbasert L2TP/IPSec-VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikatbasert L2TP/IPSec-VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Velg fil"</string>
+    <string name="reset" msgid="2448168080964209908">"Tilbakestill"</string>
+    <string name="submit" msgid="1602335572089911941">"Send inn"</string>
+    <string name="description_star" msgid="2654319874908576133">"favoritt"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-tilknytning er tilgjengelig"</string>
+    <string name="tether_message" msgid="554549994538298101">"Velg Knytt til hvis du vil dele telefonens datatilkobling med datamaskinen."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Knytt til"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Avbryt"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Det oppstod et problem under tilknytning."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-tilknytning er tilgjengelig"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Velg å knytte datamaskinen til telefonen."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Fjern tilknytning"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Velg å fjerne tilknytningen til datamaskinen."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Deaktiver tilknytning"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Du deler for øyeblikket telefonens mobildatatilkobling med datamaskinen. Velg Koble fra for å oppheve USB-tilknytningen."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Koble fra"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Avbryt"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Det oppstod et problem under deaktivering av tilknytningen. Prøv på nytt."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index aad7744..23d90cb 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Hiermee kan een toepassing de foutopsporing voor een andere toepassing inschakelen. Schadelijke toepassingen kunnen dit gebruiken om andere toepassingen af te sluiten."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"uw UI-instellingen wijzigen"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Hiermee kan een toepassing de huidige configuratie, zoals de landinstelling of de algemene lettergrootte, wijzigen."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"automodus inschakelen"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Staat een toepassing toe de automodus in te schakelen."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"processen op de achtergrond beëindigen"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Staat een toepassing toe processen op de achtergrond te beëindigen, zelfs als er voldoende geheugen beschikbaar is."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"andere toepassingen gedwongen stoppen"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Staat een toepassing toe andere toepassingen te stoppen."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"toepassing nu sluiten"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Hiermee kan een toepassing elke willekeurige activiteit die op de voorgrond wordt uitgevoerd, sluiten en naar de achtergrond verplaatsen. Nooit vereist voor normale toepassingen."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"interne systeemstatus ophalen"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_backup" msgid="470013022865453920">"systeemback-up en -herstel beheren"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Hiermee kan de toepassing het mechanisme voor systeemback-up en -herstel beheren. Niet voor gebruik door normale toepassingen."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"back-up maken en de gegevens van de toepassing herstellen"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Hiermee kan de toepassing deelnemen aan het beheer van het mechanisme voor systeemback-up en -herstel."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"niet-geautoriseerde vensters weergeven"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Hiermee kunnen vensters worden gemaakt die door de interne systeemgebruikersinterface worden gebruikt. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"waarschuwingen op systeemniveau weergeven"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een invoermethode. Nooit vereist voor normale toepassingen."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"verbinden met een achtergrond"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Hiermee staat u de houder toe zich te verbinden met de hoofdinterface van een achtergrond. Nooit vereist voor normale toepassingen."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interactie met apparaatbeheer"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Staat de houder toe intenties te verzenden naar een apparaatbeheerder. Nooit vereist voor normale toepassingen."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"schermstand wijzigen"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Hiermee kan een toepassing op elk gewenst moment de oriëntatie van het scherm wijzigen. Nooit vereist voor normale toepassingen."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"Linux-signalen verzenden naar toepassingen"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Hiermee kan een toepassing nieuwe of bijgewerkte Android-pakketten installeren. Schadelijke toepassingen kunnen hiervan gebruik maken om nieuwe toepassingen met willekeurig krachtige machtigingen toe te voegen."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"alle cachegegevens van toepassing verwijderen"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Hiermee kan een toepassing opslagruimte op de telefoon vrij maken door bestanden te verwijderen uit de cachemap van de toepassing. De toegang is doorgaans beperkt tot het systeemproces."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"systeemlogbestanden lezen"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Hiermee kan een toepassing de verschillende logbestanden van het systeem lezen. De toepassing kan op deze manier algemene informatie achterhalen over uw telefoongebruik. Hierin is geen persoonlijke of privé-informatie opgenomen."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"lezen/schrijven naar bronnen van diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar wijzigen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar verwijderen of wijzigen."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"gegevens eigenaar lezen"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Hiermee kan een toepassing de op uw telefoon opgeslagen gegevens van de eigenaar lezen. Schadelijke toepassingen kunnen hiermee gegevens van de eigenaar lezen."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"agendagegevens lezen"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Hiermee kan een toepassing alle agendagebeurtenissen lezen die zijn opgeslagen op uw telefoon. Schadelijke toepassingen kunnen hiervan gebruik maken om uw agendagebeurtenissen te verzenden naar andere personen."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"agendagegevens schrijven"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Hiermee kan een toepassing de op uw telefoon opgeslagen agendagebeurtenissen wijzigen. Schadelijke toepassingen kunnen hiermee uw agendagegevens verwijderen of wijzigen."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"neplocatiebronnen voor test"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Neplocatiebronnen voor testdoeleinden maken. Schadelijke toepassingen kunnen dit gebruiken om de locatie en/of status te overschrijven die door de echte locatiebronnen wordt aangegeven, zoals GPS of netwerkaanbieders."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"toegang opdrachten aanbieder extra locaties"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Hiermee kan de toepassing bestandssystemen koppelen en ontkoppelen voor verwisselbare opslagruimte."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"externe opslag formatteren"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Hiermee kan de toepassing de externe opslag formatteren."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"informatie over de beveiligde opslag verkrijgen"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Staat de toepassing toe informatie over de beveiligde opslag te verkrijgen."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"beveiligde opslag maken"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Staat de toepassing toe beveiligde opslag te maken."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"beveiligde opslag vernietigen"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Staat de toepassing toe de beveiligde opslag te vernietigen."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"beveiligde opslag koppelen/ontkoppelen"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Staat de toepassing toe de beveiligde opslag te koppelen/ontkoppelen."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"naam van beveiligde opslag wijzigen"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Staat de toepassing toe de naam van de beveiligde opslag te wijzigen."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"trilstand beheren"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Hiermee kan de toepassing de trilstand beheren."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"zaklamp bedienen"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Hiermee kan de toepassing de grootte van de achtergrond instellen."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"systeem terugzetten op fabrieksinstellingen"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Hiermee kan een toepassing het systeem terugzetten op de fabrieksinstellingen, waarbij alle gegevens, configuraties en geïnstalleerde toepassingen worden verwijderd."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"tijd instellen"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Staat een toepassing toe de kloktijd van de telefoon te wijzigen."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"tijdzone instellen"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Hiermee kan een toepassing de tijdzone van de telefoon wijzigen."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"fungeren als de AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"instellingen voor toegangspuntnaam schrijven"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Hiermee kan een toepassing de APN-instellingen, zoals proxy en poort, van elke APN wijzigen."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"netwerkverbinding wijzigen"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Hiermee kan een toepassing de verbindingsstatus van het netwerk wijzigen."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Staat een toepassing toe de status van de netwerkverbinding te wijzigen."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"getetherde verbinding wijzigen"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Staat een toepassing toe de status van de getetherde netwerkverbinding te wijzigen."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"instelling voor gebruik van achtergrondgegevens van gegevens wijzigen"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Hiermee kan een toepassing de instelling voor gebruik van achtergrondgegevens wijzigen."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Wi-Fi-status bekijken"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Hiermee kan een toepassing nieuwe woorden schrijven naar het gebruikerswoordenboek."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"inhoud op de SD-kaart aanpassen/verwijderen"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Hiermee kan een toepassing schrijven naar de SD-kaart."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"het cachebestandssysteem openen"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Staat een toepassing toe het cachebestandssysteem te lezen en te schrijven."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Wachtwoord beperken"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"De typen wachtwoorden beperken die u mag gebruiken."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Aanmeldingspogingen controleren"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Mislukte pogingen controleren voor aanmelding bij het apparaat om een bepaalde actie uit te voeren."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Wachtwoord opnieuw instellen"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Uw wachtwoord gedwongen wijzigen in een nieuwe waarde, wat vereist dat de beheerder u het wachtwoord geeft voordat u zich kunt aanmelden."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Gedwongen vergrendelen"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Beheren wanneer het apparaat wordt vergrendeld, wat vereist dat u het wachtwoord opnieuw invoert."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Alle gegevens wissen"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"De fabrieksinstellingen herstellen, waarbij alle gegevens worden verwijderd zonder bevestiging."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Thuis"</item>
     <item msgid="869923650527136615">"Mobiel"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN-code invoeren"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Voer het wachtwoord in om te ontgrendelen"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Onjuiste PIN-code!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Druk op \'Menu\' en vervolgens op 0 om te ontgrendelen."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Alarmnummer"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Druk op \'Menu\' om te ontgrendelen."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Patroon tekenen om te ontgrendelen"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Noodoproep"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Juist!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Probeer het opnieuw"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Opladen (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Ontgrendelen"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Geluid aan"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Geluid uit"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wissen"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Hiermee kan een toepassing de URL\'s lezen die u via de browser heeft bezocht, evenals alle bladwijzers van de browser."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"browsergeschiedenis en bladwijzers schrijven"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Hiermee kan een toepassing de op uw telefoon opgeslagen browsergeschiedenis of bladwijzers wijzigen. Schadelijke toepassingen kunnen hiermee uw browsergegevens verwijderen of wijzigen."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Geolocatierechten voor browser aanpassen"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Staat een toepassing toe de geolocatierechten van de browser aan te passen. Schadelijke toepassingen kunnen dit gebruiken om locatiegegevens te verzenden naar willekeurige websites."</string>
     <string name="save_password_message" msgid="767344687139195790">"Wilt u dat de browser dit wachtwoord onthoudt?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Niet nu"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Onthouden"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 uur geleden"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> uur geleden"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"gisteren"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> dagen geleden"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Geen machtigingen vereist"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Verbergen"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Alles weergeven"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Laden..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-massaopslag"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB-verbinding"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"U heeft uw telefoon via USB op uw computer aangesloten. Selecteer \'Koppelen\' als u bestanden tussen uw computer en de SD-kaart van uw telefoon wilt kopiëren."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Koppelen"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Niet koppelen"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"U heeft uw telefoon via USB op uw computer aangesloten. Selecteer de onderstaande knop als u bestanden tussen uw computer en de SD-kaart van uw Android wilt kopiëren."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB-opslag inschakelen"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Er is een probleem bij het gebruik van uw SD-kaart voor USB-opslag."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-verbinding"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Selecteer dit om bestanden naar/van uw computer te kopiëren."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB-opslag uitschakelen"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Selecteer dit om USB-opslag uit te schakelen."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"USB-opslag uitschakelen"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Voordat u de USB-opslag uitschakelt, moet u de koppeling met de USB-host verbreken. Selecteer \'Uitschakelen\' om USB-opslag uit te schakelen."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Uitschakelen"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Annuleren"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Er is een probleem opgetreden tijdens het uitschakelen van de USB-opslag. Controleer of u de USB-host heeft losgekoppeld en probeer het opnieuw."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-opslag in gebruik"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Voordat u USB-opslag uitschakelt, moet u de SD-kaart van uw Android hebben ontkoppeld (\'uitgeworpen\') van uw computer."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB-opslag uitschakelen"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Er is een probleem opgetreden tijdens het uitschakelen van de USB-opslag. Controleer of u de USB-host heeft losgekoppeld en probeer het opnieuw."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"SD-kaart formatteren"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Weet u zeker dat u de SD-kaart wilt formatteren? Alle gegevens op uw kaart gaan dan verloren."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatteren"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Geen overeenkomende activiteiten gevonden"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"gebruiksstatistieken van component bijwerken"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Hiermee kunnen verzamelde gebruiksstatistieken van een component worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Staat het aanroepen van de standaardcontainerservice toe om inhoud te kopiëren. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Staat het aanroepen van de standaardcontainerservice toe om inhoud te kopiëren. Niet voor gebruik door normale toepassingen."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tik twee keer voor zoomregeling"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Fout bij uitbreiden van widget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Ga"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Contact maken"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"aangevinkt"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"niet aangevinkt"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"De volgende toepassingen vragen toegang tot uw account, nu en in de toekomst."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Wilt u dit verzoek toestaan?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Toegangsverzoek"</string>
     <string name="allow" msgid="7225948811296386551">"Toestaan"</string>
     <string name="deny" msgid="2081879885755434506">"Weigeren"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Toestemming gevraagd"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Layer 2 Tunneling Protocol (L2TP)"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Vooraf gedeelde sleutel op basis van L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certificaat op basis van L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Bestand kiezen"</string>
+    <string name="reset" msgid="2448168080964209908">"Opnieuw instellen"</string>
+    <string name="submit" msgid="1602335572089911941">"Verzenden"</string>
+    <string name="description_star" msgid="2654319874908576133">"favoriet"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-tethering beschikbaar"</string>
+    <string name="tether_message" msgid="554549994538298101">"Selecteer \'Tetheren\' als u de gegevensverbinding van uw telefoon wilt delen met uw computer."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Tetheren"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Annuleren"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Er is een probleem opgetreden bij het tetheren."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-tethering beschikbaar"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Selecteer dit om uw computer aan uw telefoon te tetheren."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Tethering opheffen"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Selecteer dit om de tethering van uw computer op te heffen."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Getetherde verbinding verbreken"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"U deelt de gegevensverbinding van uw telefoon met uw computer. Selecteer \'Verbinding verbreken\' om USB-tethering op te heffen."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Verbinding verbreken"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Annuleren"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Er is een probleem opgetreden bij het uitschakelen van tethering. Probeer het opnieuw."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index ce7ade5..e9b11fc 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Pozwala aplikacji na włączenie debugowania innej aplikacji. Szkodliwe aplikacje mogą to wykorzystać do wyłączenia innych programów."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"zmienianie ustawień interfejsu użytkownika"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Pozwala aplikacji zmieniać bieżącą konfigurację, na przykład lokalny lub globalny rozmiar czcionki."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"włączanie trybu samochodowego"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Zezwala aplikacji na włączanie trybu samochodowego."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"kończenie procesów w tle"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Zezwala aplikacji na kończenie procesów innych aplikacji w tle, nawet jeśli jest dużo pamięci."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"wymuszanie zatrzymywania innych aplikacji"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Zezwala aplikacji na wymuszanie zatrzymania innych aplikacji."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"wymuszanie zamknięcia aplikacji"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Pozwala aplikacji na wymuszenie zamknięcia i cofnięcia dowolnej operacji działającej na pierwszym planie. Nigdy nie powinno być potrzebne normalnym aplikacjom."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"pobieranie informacji o wewnętrznym stanie systemu"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Pozwala na zmianę zebranych statystyk dotyczących baterii. Nie do wykorzystania przez normalne aplikacje."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrolowanie tworzenia i przywracania kopii zapasowych systemu"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Zezwala aplikacji na kontrolowanie mechanizmu tworzenia i przywracania kopii zapasowych systemu. Opcja nie jest przeznaczona dla zwykłych aplikacji."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"Tworzenie i przywracanie kopii zapasowej danych aplikacji"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Zezwala aplikacji na działanie w ramach mechanizmu tworzenia i przywracania kopii zapasowych systemu."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"wyświetlanie nieuwierzytelnionych okien"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Pozwala na tworzenie okien, które przeznaczone są do wykorzystania przez wewnętrzny interfejs użytkownika systemu. Nie do wykorzystania przez normalne aplikacje."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"wyświetlanie ostrzeżeń systemowych"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Pozwala na tworzenie powiązania z interfejsem najwyższego poziomu metody wejściowej. To uprawnienie nie powinno być nigdy wymagane przez zwykłe aplikacje."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"powiązanie z tapetą"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Umożliwia posiadaczowi powiązać interfejs najwyższego poziomu dla tapety. Nie powinno być nigdy potrzebne w przypadku zwykłych aplikacji."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcja z administratorem urządzenia"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Zezwala posiadaczowi na wysyłanie informacji o zamiarach do administratora urządzenia. Opcja nie powinna być nigdy potrzebna w przypadku zwykłych aplikacji."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"zmienianie orientacji ekranu"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Pozwala aplikacji na zmianę orientacji ekranu w dowolnym momencie. Nigdy nie powinno być potrzeby stosowania w normalnych aplikacjach."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"wysyłanie sygnałów systemu Linux do aplikacji"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Pozwala aplikacji na instalowanie nowych lub zaktualizowanych pakietów systemu Android. Szkodliwe aplikacje mogą to wykorzystać, aby dodać nowe aplikacje z arbitralnie nadanymi rozległymi uprawnieniami."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"usuwanie wszystkich danych aplikacji z pamięci podręcznej"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Pozwala aplikacji na zwalnianie pamięci telefonu przez usuwanie plików z katalogu pamięci podręcznej aplikacji. Dostęp jest bardzo ograniczony, z reguły do procesów systemu."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"czytanie plików dziennika systemu"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Umożliwia aplikacji czytanie różnych plików dziennika systemowego. Pozwala to na uzyskanie ogólnych informacji o czynnościach wykonywanych w telefonie, ale bez ujawniania danych osobowych lub osobistych informacji."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"czytanie/zapisywanie w zasobach należących do diagnostyki"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Pozwala aplikacji na zmianę danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby wymazać lub zmienić dane właściciela."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"czytanie danych właściciela"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Pozwala aplikacji na czytanie danych właściciela zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do odczytania danych właściciela."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"czytanie danych kalendarza"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Pozwala aplikacji na odczytywanie wszystkich wydarzeń z kalendarza, zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać do rozsyłania wydarzeń z kalendarza do innych ludzi."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"zapisywanie danych kalendarza"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Pozwala aplikacji na zmianę wydarzeń z kalendarza zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane w kalendarzu."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"udawanie źródeł położenia dla testów"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Tworzenie pozorowanych źródeł ustalania położenia dla testów. Szkodliwe aplikacje mogą to wykorzystać, aby zastąpić prawdziwe położenie i/lub stan zwracany przez prawdziwe źródła, takie jak GPS lub dostawcy usługi sieciowej."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"dostęp do dodatkowych poleceń dostawcy informacji o lokalizacji"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Pozwala aplikacjom na podłączanie i odłączanie systemów plików w pamięciach przenośnych."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatowanie pamięci zewnętrznej"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Zezwala aplikacji na formatowanie wymiennych nośników."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"uzyskiwanie informacji o bezpiecznym magazynie"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Zezwala aplikacji na uzyskiwanie informacji o bezpiecznym magazynie."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"tworzenie bezpiecznego magazynu"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Zezwala aplikacji na tworzenie bezpiecznego magazynu."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"usuwanie bezpiecznego magazynu"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Zezwala aplikacji na usuwanie bezpiecznego magazynu."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"podłączanie/odłączanie bezpiecznego magazynu"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Zezwala aplikacji na podłączanie/odłączanie bezpiecznego magazynu."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"zmiana nazwy bezpiecznego magazynu"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Zezwala aplikacji na zmianę nazwy bezpiecznego magazynu."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontrolowanie wibracji"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Pozwala aplikacjom na kontrolowanie wibracji."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"kontrolowanie latarki"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Pozwala aplikacji na ustawianie wskazówek dotyczących rozmiaru tapety."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"resetowanie systemu do ustawień fabrycznych"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Pozwala aplikacji na całkowite zresetowanie systemu do ustawień fabrycznych, z wymazaniem wszystkich danych, konfiguracji oraz zainstalowanych aplikacji."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"ustawianie godziny"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Zezwala aplikacji na zmianę ustawienia zegara w telefonie."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"ustawianie strefy czasowej"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Pozwala aplikacji na zmianę strefy czasowej w telefonie."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"działanie jako usługa AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"zapisywanie ustawień nazwy punktu dostępowego (APN, Access Point Name)"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Pozwala aplikacji na zmianę ustawień APN, takich jak serwer proxy oraz port dowolnego APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"zmienianie połączeń sieci"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Pozwala aplikacji na zmianę stanu połączeń sieciowych."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Zezwala aplikacji na zmianę stanu łączności sieciowej."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"zmiana łączności powiązanej"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Zezwala aplikacji na zmianę stanu powiązanej łączności sieciowej."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"zmienianie ustawienia używania danych w tle"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Zezwala aplikacji na zmianę ustawień użycia danych w tle."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"wyświetlanie stanu Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Zezwala aplikacjom na zapisywanie nowych słów w słowniku użytkownika."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modyfikowanie/usuwanie zawartości karty SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Umożliwia aplikacji zapis na karcie SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"dostęp do systemu plików pamięci podręcznej"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Zezwala aplikacji na odczyt i zapis w systemie plików pamięci podręcznej."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Ogranicz liczbę prób wprowadzenia hasła"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Ogranicza dozwolone typy haseł użytkownika."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Monitoruj próby logowania"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Monitoruje nieudane próby zalogowania do urządzenia w celu wykonania określonego działania."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Resetuj hasło"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Wymusza podanie nowej wartości hasła, wymagając przekazania go użytkownikowi przez administratora przed zalogowaniem."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Wymuś zablokowanie"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Kontroluje, kiedy urządzenie jest blokowane, wymagając ponownego wprowadzenia hasła."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Usuń wszystkie dane"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Wykonuje reset fabryczny, usuwając wszystkie dane użytkownika bez żadnego potwierdzenia."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Dom"</item>
     <item msgid="869923650527136615">"Komórka"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"przez <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> za pośrednictwem: <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Wprowadź kod PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Wprowadź hasło, aby odblokować"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Błędny kod PIN!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Aby odblokować, naciśnij Menu, a następnie 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Numer alarmowy"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Naciśnij Menu, aby odblokować."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Narysuj wzór, aby odblokować"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Połączenie alarmowe"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Poprawnie!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Niestety, spróbuj ponownie"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Ładowanie (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Wyłącz dźwięk"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Wyczyść"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Umożliwia aplikacji odczyt wszystkich adresów URL odwiedzonych przez przeglądarkę, a także wszystkich zakładek przeglądarki."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"zapis historii i zakładek przeglądarki"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Umożliwia aplikacji modyfikowanie historii lub zakładek przeglądarki zapisanych w telefonie. Złośliwe aplikacje mogą używać tej opcji do usuwania lub modyfikowania danych przeglądarki."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modyfikowanie uprawnień przeglądarki dotyczących lokalizacji geograficznej"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Zezwala aplikacji na modyfikowanie uprawnień przeglądarki dotyczących lokalizacji geograficznej. Złośliwe aplikacje mogą używać tej opcji do wysyłania informacji o lokalizacji do dowolnych witryn internetowych."</string>
     <string name="save_password_message" msgid="767344687139195790">"Czy chcesz, aby zapamiętać to hasło w przeglądarce?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Nie teraz"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Zapamiętaj"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"godzinę temu"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> godzin temu"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"wczoraj"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> dni temu"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Nie są wymagane żadne uprawnienia"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ukryj"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Pokaż wszystko"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Ładowanie..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Pamięć masowa USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Połączenie przez USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Telefon został podłączony do komputera przez port USB. Wybierz polecenie „Podłącz”, jeśli chcesz skopiować pliki między komputerem a kartą SD w telefonie."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Podłącz"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Nie podłączaj"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Telefon został połączony z komputerem za pośrednictwem USB. Wybierz poniższy przycisk, aby skopiować pliki między komputerem a kartą SD systemu Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Włącz nośnik USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Wystąpił problem z wykorzystaniem karty SD dla pamięci USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Połączenie przez USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Wybierz, aby skopiować pliki do/z komputera"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Wyłącz nośnik USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Wybierz, aby wyłączyć nośnik USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Wyłącz nośnik USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Przed wyłączeniem nośnika USB upewnij się, że odłączono go od hosta USB. Wybierz „Wyłącz”, aby wyłączyć nośnik USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Wyłącz"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Anuluj"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Napotkano problem podczas wyłączania nośnika USB. Sprawdź, czy host USB został odłączony, a następnie spróbuj ponownie."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Nośnik USB w użyciu"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Przed wyłączeniem nośnika USB upewnij się, że karta SD systemu Android została odłączona („wyjęta”) od komputera."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Wyłącz nośnik USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Wystąpił problem podczas wyłączania nośnika USB. Upewnij się, że host USB został odłączony, a następnie spróbuj ponownie."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatuj kartę SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Czy na pewno sformatować kartę SD? Wszystkie dane na karcie zostaną utracone."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatuj"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Nie znaleziono pasujących działań"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"aktualizowanie statystyk użycia komponentu"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Zezwala na modyfikacje zebranych statystyk użycia komponentu. Nieprzeznaczone dla zwykłych aplikacji."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Zezwala na wywoływanie domyślnej usługi kontenera w celu skopiowania zawartości. Opcja nie jest przeznaczona dla zwykłych aplikacji."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Zezwala na wywoływanie domyślnej usługi kontenera w celu skopiowania zawartości. Opcja nie jest przeznaczona dla zwykłych aplikacji."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Dotknij dwukrotnie, aby sterować powiększeniem"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Błąd podczas wyodrębniania widżetu"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Przejdź"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Utwórz kontakt"\n"dla numeru <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"zaznaczone"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"niezaznaczone"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Co najmniej jedna z następujących aplikacji żąda uprawnień dostępu do Twojego konta – teraz i w przyszłości."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Chcesz zezwolić na to żądanie?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Żądanie dostępu"</string>
     <string name="allow" msgid="7225948811296386551">"Zezwól"</string>
     <string name="deny" msgid="2081879885755434506">"Odmów"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Żądane pozwolenie"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protokół L2TP"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Sieć VPN L2TP/IPSec z kluczem PSK"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sieć VPN L2TP/IPSec z certyfikatem"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Wybierz plik"</string>
+    <string name="reset" msgid="2448168080964209908">"Resetuj"</string>
+    <string name="submit" msgid="1602335572089911941">"Prześlij"</string>
+    <string name="description_star" msgid="2654319874908576133">"ulubione"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Dostępne powiązanie USB"</string>
+    <string name="tether_message" msgid="554549994538298101">"Wybierz opcję „Powiąż”, aby udostępnić na komputerze połączenie transmisji danych telefonu."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Powiąż"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Anuluj"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Wystąpił problem podczas tworzenia powiązania."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Dostępne powiązanie USB"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Wybierz, aby powiązać komputer z telefonem."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Anuluj powiązanie"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Wybierz, aby anulować powiązanie z komputerem."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Rozłącz powiązanie"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Komórkowe połączenie transmisji danych telefonu zostało udostępnione na komputerze. Wybierz opcję „Rozłącz”, aby rozłączyć powiązanie USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Rozłącz"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Anuluj"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Wystąpił problem podczas wyłączania powiązania. Spróbuj ponownie."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index e4e0d64..2a3dde3 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite a uma aplicação activar a depuração para outra aplicação. Algumas aplicações maliciosas podem utilizar este item para eliminar outras aplicações."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"alterar definições da IU"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite a uma aplicação mudar a configuração actual como, por exemplo, a região ou o tamanho global do tipo de letra."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"activar modo de carro"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permite a uma aplicação activar o modo de carro."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"eliminar processos em segundo plano"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permite a uma aplicação eliminar processos em segundo plano de outras aplicações, mesmo que não existam problemas de falta de memória."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"forçar paragem de outras aplicações"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permite a uma aplicação efectuar uma paragem forçada de outras aplicações."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"forçar fecho da aplicação"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Permite a uma aplicação forçar qualquer actividade em primeiro plano a fechar e retroceder. Nunca deve ser necessário para aplicações normais."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"obter estado interno do sistema"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite a modificação das estatísticas recolhidas sobre a bateria. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar a cópia de segurança e restauro do sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que a aplicação controle o mecanismo de cópia de segurança e restauro do sistema. Não deve ser utilizado por aplicações normais."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"fazer uma cópia de segurança e restaurar os dados da aplicação"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Permite que a aplicação participe no mecanismo de cópia de segurança e restauro do sistema."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"apresentar janelas não autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite a criação de janelas destinadas a utilização pela interface de utilizador interna do sistema. Não se destina a utilização por aplicações normais."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"apresentar alertas ao nível do sistema"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite ao titular vincular a interface de nível superior a um método de entrada de som. Nunca deve ser necessário para aplicações normais."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"vincular a uma imagem de fundo"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite ao titular vincular a interface de nível superior de uma imagem de fundo. Nunca deverá ser necessário para aplicações normais."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com um administrador do dispositivo"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite ao titular enviar intenções para um administrador do dispositivo. Nunca deverá ser necessário para aplicações normais."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"mudar orientação do ecrã"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Permite a uma aplicação mudar a rotação do ecrã em qualquer momento. Nunca deve ser necessário para aplicações normais."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"enviar sinais Linux para aplicações"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permite a uma aplicação instalar pacotes novos ou actualizados do Android. Algumas aplicações maliciosas podem utilizar este item para adicionar novas aplicações com autorizações arbitrariamente fortes."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"eliminar todos os dados da aplicações"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Permite a uma aplicação libertar espaço de armazenamento no telefone eliminando ficheiros no directório da cache da aplicação. Geralmente, o acesso é muito limitado para processamento do sistema."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"ler ficheiros de registo do sistema"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Permite a uma aplicação ler a partir dos diversos ficheiros de registo do sistema. Isto permite descobrir informações gerais sobre a forma como o utilizador usa o telefone, mas estas não devem conter quaisquer dados pessoais ou privados."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"ler/escrever em recursos propriedade de diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Permite a uma aplicação modificar os dados do proprietário do telefone armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar este item para apagar ou modificar dados do proprietário."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"ler dados do proprietário"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Permite a uma aplicação modificar os dados do proprietário do telefone armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar este item para ler dados do proprietário do telefone."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"ler dados do calendário"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Permite a uma aplicação ler todos os eventos do calendário armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar este item para enviar os eventos do seu calendário a outras pessoas."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"escrever dados do calendário"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Permite a uma aplicação modificar os eventos do calendário armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar este item para apagar ou modificar os dados do seu calendário."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"fontes de localização fictícias para teste"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Crie fontes de localização fictícias para fins de teste. Algumas aplicações maliciosas podem utilizar este item para substituir a localização e/ou o estado devolvido por fontes de localização reais, tais como fornecedores de GPS ou de Rede."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"aceder a comandos adicionais do fornecedor de localização"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permite à aplicação montar e desmontar sistemas de ficheiros para armazenamento removível."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatar armazenamento externo"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permite a uma aplicação formatar o armazenamento removível."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"obter informações sobre o armazenamento seguro"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Permite à aplicação obter informações sobre o armazenamento seguro."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"criar armazenamento seguro"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Permite à aplicação criar armazenamento seguro."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"destruir armazenamento seguro"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permite à aplicação destruir o armazenamento seguro."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"instalar/desinstalar armazenamento seguro"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite à aplicação instalar/desinstalar o armazenamento seguro."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"mudar o nome do armazenamento seguro"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permite à aplicação mudar o nome do armazenamento seguro."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlar vibrador"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permite à aplicação controlar o vibrador."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controlar lanterna"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permitir que a aplicação defina as sugestões de tamanho da imagem de fundo do sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"repor definições de fábrica do sistemas"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permite a uma aplicação repor totalmente as definições de fábrica do sistema, apagando todos os dados, configurações e aplicações instaladas."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"definir hora"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Permite a uma aplicação alterar a hora do telefone."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"definir fuso horário"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Permite a uma aplicação mudar o fuso horário do telefone."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"funciona como Serviço de Gestor de Conta"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"escrever definições de Nome do ponto de acesso"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Permite a uma aplicaçaõ modificar as definições de APN, tais como Proxy e Porta de qualquer APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"mudar conectividade de rede"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Permite a uma aplicação mudar o estado da conectividade de rede."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Permite a uma aplicação alterar o estado da conectividade de rede."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"alterar conectividade associada"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Permite a uma aplicação alterar o estado da conectividade de rede associada."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"mudar definição de utilização de dados de segundo plano"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Permite a uma aplicação mudar a definição de utilização de dados de segundo plano."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"ver estado de Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite a uma aplicação escrever novas palavras no dicionário do utilizador."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/eliminar os conteúdos do cartão SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que uma aplicação escreva no cartão SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"aceder ao sistema de ficheiros da cache"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite a uma aplicação ler e escrever no sistema de ficheiros da cache."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limitar palavra-passe"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Restrinja os tipos de palavras-passe que está autorizado a utilizar."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Ver tentativas de início de sessão"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"O monitor falhou as tentativas de iniciar sessão no dispositivo para efectuar algumas acções."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Repor palavra-passe"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Force a palavra-passe para um novo valor, sendo necessário que o administrador lho forneça antes de poder iniciar sessão."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Forçar bloqueio"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Controle quando o dispositivo é bloqueado, sendo necessário reintroduzir a respectiva palavra-passe."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Apagar todos os dados"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Efectue uma reposição de fábrica, eliminando todos os dados sem qualquer confirmação."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Residência"</item>
     <item msgid="869923650527136615">"Móvel"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"através do <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> através de <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Introduzir código PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Introduza a palavra-passe para desbloquear"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorrecto!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, prima Menu e, em seguida, 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergência"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Prima Menu para desbloquear."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desenhar padrão para desbloquear"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Chamada de emergência"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correcto!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Lamentamos, tente novamente"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"A carregar (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som activado"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desactivado"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que a aplicação leia todos os URLs visitados pelo browser e todos os marcadores do browser."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"gravar histórico e marcadores do browser"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Permite que uma aplicação modifique o histórico e os marcadores do browser armazenados no telefone. As aplicações maliciosas podem utilizar esta permissão para apagar ou modificar os dados do browser."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modificar permissões de localização geográfica do Navegador"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permite a uma aplicação modificar as permissões de localização geográfica do Navegador. As aplicações mal intencionadas podem utilizar isto para enviar informações de localização para Web sites arbitrários."</string>
     <string name="save_password_message" msgid="767344687139195790">"Quer que o browser memorize esta palavra-passe?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Agora não"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Lembrar"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"Há 1 hora"</item>
     <item quantity="other" msgid="2467273239587587569">"Há <xliff:g id="COUNT">%d</xliff:g> horas"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"ontem"</item>
     <item quantity="other" msgid="2479586466153314633">"Há <xliff:g id="COUNT">%d</xliff:g> dias"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Não são necessárias permissões"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar tudo"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"A carregar..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Armazenamento em massa USB "</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Ligado através de USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Ligou o telefone ao computador através de USB. Seleccione \"Montar\" se pretender copiar ficheiros entre o computador e o cartão SD do telefone."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Montar"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Não montar"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Ligou o telefone ao computador através de USB. Seleccione o botão abaixo se pretender copiar ficheiros entre o computador e o cartão SD do Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Activar armazenamento USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Existe um problema ao utilizar o cartão SD para armazenamento USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Ligado através de USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Seleccione para copiar ficheiro para/do seu computador."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desactivar armazenamento USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Opte por desactivar o armazenamento USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Desactivar armazenamento USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Antes de desactivar o armazenamento USB, certifique-se de que o desmontou no anfitrião USB. Seleccione \"Desactivar\" para desactivar o armazenamento USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Desactivar"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Cancelar"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Detectámos um problema ao desactivar o armazenamento USB. Verifique para se certificar de que desmontou o anfitrião USB e, em seguida, tente novamente."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"O armazenamento USB está a ser utilizado"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Antes de desactivar o armazenamento USB, certifique-se de que desinstalou (\"ejectou\") o cartão SD do Android do computador."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desactivar armazenamento USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Ocorreu um problema ao desactivar o armazenamento USB. Confirme se desinstalou o anfitrião USB e, em seguida, tente novamente."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatar cartão SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Tem a certeza de que pretende formatar o cartão SD? Perder-se-ão todos os dados no cartão."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatar"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Nenhuma actividade correspondente encontrada"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"actualizar estatísticas de utilização de componentes"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Permite a modificação de estatísticas de utilização de componentes recolhidas. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Permite invocar o serviço de contentor predefinido para copiar conteúdo. Não se destina a ser utilizado por aplicações normais."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Permite invocar o serviço de contentor predefinido para copiar conteúdo. Não se destina a ser utilizado por aplicações normais."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tocar duas vezes para controlar o zoom"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Erro ao inchar miniaplicação"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Criar contacto"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"verificado"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"não verificado"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Uma ou várias das aplicações seguintes solicitam permissão para aceder à sua conta, agora e no futuro."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Pretende autorizar este pedido?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Pedido de acesso"</string>
     <string name="allow" msgid="7225948811296386551">"Permitir"</string>
     <string name="deny" msgid="2081879885755434506">"Recusar"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Autorização Solicitada"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de túnel de camada 2 (L2TP)"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec baseada em chave pré- partilhada"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec baseada em certificado"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Escolher ficheiro"</string>
+    <string name="reset" msgid="2448168080964209908">"Repor"</string>
+    <string name="submit" msgid="1602335572089911941">"Enviar"</string>
+    <string name="description_star" msgid="2654319874908576133">"favorito"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Associação USB disponível"</string>
+    <string name="tether_message" msgid="554549994538298101">"Seleccione \"Associar\" se pretender partilhar a ligação de dados do telefone com o computador."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Associar"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Cancelar"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Existe um problema na associação."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Associação USB disponível"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Seleccione para associar o computador ao telefone."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Desassociar"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Seleccione para desassociar o computador."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Desligar associação"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Tem estado a partilhar a ligação de dados móvel do telefone com o computador. Seleccione \"Desligar\" para desligar a associação USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Desligar"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Cancelar"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Foi detectado um problema ao desactivar a Associação. Tente novamente."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f81f332..b71df63 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Permite que um aplicativo ative a depuração de outro aplicativo. Aplicativos maliciosos podem usar isso para encerrar outros aplicativos."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"alterar as suas configurações de UI"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Permite que um aplicativo altere a configuração atual, como o local ou o tamanho geral da fonte."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"ativar o modo de carro"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Permite que um aplicativo ative o modo de carro."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"interromper processos em segundo plano"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Permite que um aplicativo interrompa processos em segundo plano de outros aplicativos, mesmo se a memória não estiver baixa."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"forçar a interrupção de outros aplicativos"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Permite que um aplicativo pare forçosamente outros aplicativos."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"forçar fechamento do aplicativo"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Permite que um aplicativo force o fechamento de qualquer atividade que esteja em primeiro plano. Aplicativos normais não devem precisar disso em momento algum."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"recuperar o estado interno do sistema"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Permite a modificação das estatísticas de bateria coletadas. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_backup" msgid="470013022865453920">"controlar backup e restauração do sistema"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Permite que o aplicativo controle o mecanismo de backup e restauração do sistema. Não deve ser usado por aplicativos normais."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"fazer backup e restaurar os dados do aplicativo"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Permite que o aplicativo participe no mecanismo de backup e restauração do sistema."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"exibir janelas não autorizadas"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Permite a criação de janelas destinadas ao uso pela interface de usuário do sistema interno. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"exibir alertas de nível do sistema"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Permite que o detentor se sujeite à interface de nível superior de um método de entrada. Aplicativos normais não devem precisar disso em momento algum."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"sujeitar-se a um plano de fundo"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Permite que o detentor se sujeite à interface de nível superior de um plano de fundo. Aplicativos normais não devem precisar disso em momento algum."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com o administrador de um dispositivo"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Permite que o detentor envie tentativas ao administrador de um dispositivo. Não é necessário para aplicativos normais."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"alterar orientação da tela"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Permite que um aplicativo altere a rotação da tela a qualquer momento. Aplicativos normais não devem precisar disso em momento algum."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"enviar sinais de Linux para os aplicativos"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Permite que um aplicativo instale pacotes novos ou atualizados do Android. Aplicativos maliciosos podem usar isso para adicionar novos aplicativos com permissões arbitrariamente avançadas."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"excluir todos os dados de cache do aplicativo"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Permite que um aplicativo libere o espaço de armazenamento do telefone excluindo arquivos no diretório de cache do aplicativo. O acesso é normalmente muito restrito para o processo do sistema."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"ler arquivos de registro do sistema"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Permite que um aplicativo leia os diversos arquivos de registro do sistema. Isso permite que ele descubra informações gerais sobre o que você está fazendo com o telefone, porém esses arquivos não devem conter informações pessoais ou privadas."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"ler/gravar em recursos pertencentes ao diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Permite que um aplicativo modifique os dados de proprietário do telefone armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar dados do proprietário."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"ler dados do proprietário"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Permite que um aplicativo leia os dados de proprietário do telefone armazenados no seu telefone. Aplicativos maliciosos podem usar isso para ler os dados de proprietário do telefone."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"ler dados da agenda"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Permite que um aplicativo leia todos os eventos da agenda armazenados no seu telefone. Aplicativos maliciosos podem usar isso para enviar eventos da sua agenda para outras pessoas."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"gravar dados da agenda"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Permite que um aplicativo modifique os eventos da agenda armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar os seus dados da agenda."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"fontes de locais fictícios para teste"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Cria fontes de locais fictícios para teste. Aplicativos maliciosos podem usar isso para substituir o local e/ou o status retornado pelas fontes de locais reais como GPS ou provedores de rede."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acessar comandos extras do provedor de localização"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Permite que o aplicativo monte e desmonte arquivos de sistema para armazenamento removível."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatar armazenamento externo"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Permite que o aplicativo formate o armazenamento removível."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"obter informações sobre o armazenamento seguro"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Permite que o aplicativo obtenha informações sobre armazenamento seguro."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"criar armazenamento seguro"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Permite que o aplicativo crie um armazenamento seguro."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"destrói o armazenamento seguro"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Permite que o aplicativo destrua o armazenamento seguro."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"conectar/desconectar armazenamento seguro"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Permite que o aplicativo conecte/desconecte o armazenamento seguro."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"renomear o armazenamento seguro"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Permite que o aplicativo renomeie o armazenamento seguro."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"controlar o vibrador"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Permite que o aplicativo controle o vibrador."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"controlar lanterna"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Permite que o aplicativo defina as dicas de tamanho do papel de parede do sistema."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"redefinir o sistema para os padrões de fábrica"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Permite que um aplicativo redefina completamente o sistema para as configurações de fábrica, apagando todos os dados, configuração e aplicativos instalados."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"definir hora"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Permite que um aplicativo altere o horário do telefone."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"definir fuso horário"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Permite que um aplicativo altere o fuso horário do telefone."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"agir como AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"gravar as configurações do Nome do ponto de acesso"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Permite que um aplicativo modifique as configurações de APN, como Proxy e Porta de qualquer APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"alterar conectividade da rede"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Permite que um aplicativo altere o estado da conectividade de rede."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Permite que um aplicativo altere o estado da conectividade de rede."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"alterar conectividade vinculada"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Permite que um aplicativo altere o estado da conectividade de rede vinculada."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"alterar configuração de uso dos dados de segundo plano"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Permite que um aplicativo altere a configuração de uso dos dados de segundo plano."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"visualizar estado da rede Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Permite que um aplicativo grave novas palavras no dicionário do usuário."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"modificar/excluir conteúdo do cartão SD"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Permite que um aplicativo grave no cartão SD."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"acessar o sistema de arquivos de cache"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Permite que um aplicativo leia e grave no sistema de arquivos de cache."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Limitar senha"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Restringe os tipos de senha que você tem permissão de usar."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Exibir tentativas de login"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Monitora as tentativas malsucedidas de login no aparelho para executar alguma ação."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Redefinir senha"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Força a sua senha para um novo valor, exigindo que o administrador a forneça antes que você possa fazer login."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Forçar bloqueio"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Controla o bloqueio do aparelho, exigindo que a senha seja digitada novamente."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Apagar todos os dados"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Execute uma redefinição de fábrica, excluindo todos os seus dados sem qualquer confirmação."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Residencial"</item>
     <item msgid="869923650527136615">"Celular"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"por meio de <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Digite o código PIN"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Digite a senha para desbloquear"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Código PIN incorreto!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, pressione Menu e, em seguida, 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Número de emergência"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Pressione Menu para desbloquear."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Desenhe o padrão para desbloquear"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Chamada de emergência"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Correto!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Tente novamente"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Carregando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Desbloquear"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Som ativado"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Som desativado"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Permite que o aplicativo leia todos os URLs visitados pelo Navegador e todos os favoritos do Navegador."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"gravar histórico e favoritos do Navegador"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Permite que um aplicativo modifique o histórico ou os favoritos do Navegador armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar os dados do seu Navegador."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Modifique as permissões de geolocalização do seu navegador"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Permite que um aplicativo modifique as permissões de geolocalização do navegador. Aplicativos maliciosos podem usar isso para permitir o envio de informações de localização a sites arbitrários."</string>
     <string name="save_password_message" msgid="767344687139195790">"Deseja que o navegador lembre desta senha?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Agora não"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Lembrar"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 hora atrás"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> horas atrás"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"ontem"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> dias atrás"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Ocultar"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Mostrar todas"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Carregando..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Armazenamento USB em massa"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"Conectado por USB"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Você conectou o telefone ao computador via USB. Selecione \"Montar\" se quiser copiar arquivos entre o computador e o cartão SD do seu telefone."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Montar"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Não montar"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Você conectou o telefone ao computador via USB. Selecione o botão abaixo se quiser copiar arquivos entre o computador e o cartão SD do seu Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Ativar o armazenamento USB"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Há um problema com o uso do seu cartão SD para armazenamento USB."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"Conectado por USB"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Selecione para copiar arquivos para/do seu computador."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Desativar o armazenamento USB"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Selecione para desativar o armazenamento USB."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Desativar o armazenamento USB"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Antes de desativar o armazenamento USB, desmonte o host USB. Selecione \"Desativar\" para desativar o armazenamento USB."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Desativar"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Cancelar"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Encontramos um problema ao desativar o armazenamento USB. Verifique se desmontou o host USB e tente novamente."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"Armazenamento USB em uso"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Antes de desativar o armazenamento USB, verifique se desconectou (“ejetou”) o cartão SD do Android do computador."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desativar o armazenamento USB"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Houve um problema ao desativar o armazenamento USB. Verifique se desconectou o host USB e tente novamente."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatar cartão SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Tem certeza de que deseja formatar o cartão SD? Todos os dados no seu cartão serão perdidos."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatar"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Nenhum atividade correspondente foi encontrada"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"atualizar estatísticas de uso do componente"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Permite a modificação das estatísticas de uso do componente coletadas. Não deve ser usado por aplicativos normais."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Permite a invocação do serviço de recipiente padrão para copiar o conteúdo. Não deve ser usado por aplicativos normais."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Permite a invocação do serviço de recipiente padrão para copiar o conteúdo. Não deve ser usado por aplicativos normais."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Toque duas vezes para ter controle do zoom"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Erro ao aumentar o widget"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Criar contato "\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"selecionado"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"não selecionado"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"O aplicativo a seguir ou outros aplicativos solicitam permissão para acessar a sua conta, agora e no futuro."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Deseja permitir essa solicitação?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Solicitação de acesso"</string>
     <string name="allow" msgid="7225948811296386551">"Permitir"</string>
     <string name="deny" msgid="2081879885755434506">"Negar"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Autorização solicitada"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Protocolo de encapsulamento de camada 2"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"VPN L2TP/IPSec com base em chave pré-compartilhada"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"VPN L2TP/IPSec com base em certificado"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string>
+    <string name="reset" msgid="2448168080964209908">"Redefinir"</string>
+    <string name="submit" msgid="1602335572089911941">"Enviar"</string>
+    <string name="description_star" msgid="2654319874908576133">"favorito"</string>
+    <string name="tether_title" msgid="6970447107301643248">"Vínculo USB disponível"</string>
+    <string name="tether_message" msgid="554549994538298101">"Selecione \"Vincular\" se quiser compartilhar a conexão de dados do seu telefone com o seu computador."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Vincular"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Cancelar"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Há um problema com o vínculo."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"Vínculo USB disponível"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Selecione para vincular o seu computador ao seu telefone."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Desvincular"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Selecione para desvincular o seu computador."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Desconectar vínculo"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Você está compartilhando a conexão de dados de celular do seu telefone com o seu computador. Selecione \"Desconectar\" para desconectar o vínculo USB."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Desconectar"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Cancelar"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Encontramos um problema ao desativar o Vínculo. Tente novamente."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 3864283..93fff41 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Позволяет приложению запускать процесс отладки другого приложения. Вредоносные приложения могут использовать эту возможность для остановки других приложений."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"изменять настройки пользовательского интерфейса"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Позволяет приложению изменять текущую конфигурацию, например региональные настройки или размер шрифта."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"включить режим громкой связи"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Позволяет программе включить режим громкой связи."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"завершать фоновые процессы"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Позволяет программе завершать фоновые процессы других программ, даже если память не заполнена."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"принудительно закрывать другие программы"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Позволяет программе принудительно останавливать другие программы."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"принудительно закрывать приложения"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Позволяет приложению принудительно закрыть или вернуть в исходное состояние процессы, выполняемые в активном режиме. Не требуется для обычных приложений."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"извлекать данные о внутреннем состоянии системы"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Позволяет изменять собранную статистику батареи. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_backup" msgid="470013022865453920">"управление резервным копированием и восстановлением системы"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Разрешает приложению контролировать механизмы резервного копирования и восстановления системы. Не используется обычными приложениями."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"создать резервную копию и восстановить данные приложения"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Позволяет приложению участвовать в механизме резервного копирования и восстановления системы."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"показывать неавторизованные окна"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Разрешает создание окон, предназначенных для использования внутренним пользовательским интерфейсом системы. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"показывать оповещения системного уровня"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Позволяет выполнять привязку к интерфейсу ввода верхнего уровня. Не требуется для обычных приложений."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"связать с фоновым рисунком"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Разрешает выполнять привязку к интерфейсу фонового рисунка верхнего уровня. Не требуется для обычных приложений."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"взаимодействовать с администратором устройства"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Позволяет владельцу отправлять целевые значения администратору устройства. Никогда не используется обычными приложениями."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"изменять ориентацию экрана"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Позволяет приложению изменять ориентацию экрана в любое время. Не требуется для обычных приложений."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"отправлять приложениям сигналы Linux"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Позволяет приложению устанавливать новые или обновленные пакеты Android. Вредоносные приложения могут использовать эту возможность для добавления новых приложений со сколь угодно высоким уровнем разрешения."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"удалять все данные из кэша приложений"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Позволяет приложению освобождать память телефона с помощью удаления файлов из каталога кэша приложений. Обычно это разрешается только системным процессам."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"считывать системные файлы журналов"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Позволяет приложению считывать информацию из различных журналов системы. Приложение может получить сведения о работе пользователя с телефоном, но они не должны содержать какой-либо личной или конфиденциальной информации."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"считывать/записывать данные в ресурсы, принадлежащие группе диагностики"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Позволяет приложению изменять сведения о владельце, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для удаления или изменения данных владельца."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"считывать данные о владельце"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Позволяет приложению считывать сведения о владельце, сохраненные в памяти телефона. Вредоносные приложения могут использовать эту возможность для считывания данных владельца."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"считывать данные календаря"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Позволяет приложению считывать все события календаря, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для передачи ваших событий календаря посторонним лицам."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"записывать данные календаря"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Позволяет приложению изменять события календаря, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для удаления или изменения событий календаря."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"копировать источники мест для проверки"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Создавать копии источников данных о местоположении для проверки. Вредоносные приложения могут использовать эту возможность для перезаписи места и/или состояния, возвращаемого действительными источниками данных о местоположении, такими как GPS или операторы связи."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"получать доступ к дополнительным командам источника данных о местоположении"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Позволяет приложению монтировать и удалять файловые системы съемных носителей."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"форматировать внешний накопитель"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Позволяет приложению форматировать съемный накопитель."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"получать сведения о защищенном хранилище"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Позволяет программе получать сведения о защищенном хранилище."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"создать защищенное хранилище"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Позволяет программам создавать защищенные хранилища."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"удалять защищенное хранилище"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Позволяет программе удалять защищенные хранилища."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"подключать / отключать защищенное хранилище"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Позволяет программе подключать и отключать защищенные хранилища."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"переименовать защищенное хранилище"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Позволяет программам переименовывать защищенные хранилища."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"управлять вибровызовом"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Позволяет приложению управлять виброзвонком."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"управлять вспышкой"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Позволяет данному приложению устанавливать советы по размеру фоновых рисунков."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"восстанавливать параметры системы по умолчанию, установленные на заводе-изготовителе"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Позволяет приложению восстановить стандартные настройки системы, удалив все данные, конфигурацию и установленные приложения."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"установить время"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Позволяет программе изменять время на телефоне."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"настраивать часовой пояс"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Позволяет приложению изменять часовой пояс телефона."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"выступать в качестве службы управления аккаунтом"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"записывать настройки имени точки доступа"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Позволяет приложению изменять настройки APN, такие как прокси-сервер и порт любого APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"изменять настройки подключения к сети"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Позволяет приложению изменять состояние подключаемости сети."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Позволяет программе изменять состояние сетевого канала."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"изменить подключение к компьютеру"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Позволяет программе изменять состояние подключенного сетевого канала."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"изменять настройки использования данных в фоновом режиме"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Позволяет приложению изменять настройку использования данных в фоновом режиме."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"просматривать состояние Wi-Fi"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Позволяет приложению записывать новые слова в пользовательский словарь."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"изменять/удалять содержание SD-карты"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Разрешает приложению запись на SD-карту"</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"получать доступ к кэшу файловой системы"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Разрешает программам доступ для записи и чтения к кэшу файловой системы."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Ограничить пароль"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Ограничить типы паролей, доступных для использования."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Просмотр попыток входа"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Мониторинг неудачных попыток подключения к устройству для выполнения определенных действий."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Сбросить пароль"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Принудительно изменить пароль, который администратор должен будет сообщить вам, чтобы вы смогли выполнить вход."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Принудительная блокировка"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Управление блокировкой устройства, требующей ввода пароля."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Удалить все данные"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Выполнить сброс к начальным настройкам с удалением всех данных без запроса подтверждения."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Домашний"</item>
     <item msgid="869923650527136615">"Мобильный"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"с помощью <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> с помощью <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Введите PIN-код"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Введите пароль для разблокировки"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Неверный PIN-код!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Для разблокировки нажмите \"Меню\", а затем 0."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Экстренная служба"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Для разблокировки нажмите \"Меню\"."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Для разблокировки введите графический ключ"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Вызов службы экстренной помощи"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Правильно!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Повторите попытку"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Идет зарядка (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -513,7 +543,7 @@
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"Нет SIM-карты."</string>
     <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"SIM-карта не установлена."</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"Вставьте SIM-карту."</string>
-    <string name="emergency_calls_only" msgid="6733978304386365407">"Только вызовы службы экстренной помощи"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"Только вызовы экстренных служб"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"Сеть заблокирована"</string>
     <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-карта заблокирована с помощью кода PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"См. руководство пользователя или свяжитесь со службой поддержки."</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Разблокировать"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Вкл. звук"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Откл. звук"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Очистить"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Разрешает приложению считывать все URL, посещенные браузером, и все его закладки."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"записывать историю и закладки браузера"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Разрешает приложению изменять историю и закладки браузера, сохраненные в вашем телефоне. Вредоносное ПО может пользоваться этим, чтобы стирать или изменять данные вашего браузера."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Изменить разрешения браузера для доступа к географическому местоположению"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Позволяет программе изменять разрешения браузера для доступа к географическому положению. Вредоносные программы могут пользоваться этим для отправки информации о местоположении на некоторые сайты."</string>
     <string name="save_password_message" msgid="767344687139195790">"Вы хотите, чтобы браузер запомнил этот пароль?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Не сейчас"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Запомнить"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 час назад"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> ч. назад"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"вчера"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> дн. назад"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Не требуется разрешений"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Скрыть"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Показать все"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Идет загрузка…"</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"Запоминающее устройство USB"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"устройство USB подключено"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Телефон подключен к компьютеру через порт USB. Если необходимо копировать файлы с компьютера на SD-карту телефона (или наоборот), выберите \"Установить\"."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Смонтировать"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Не монтировать"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Телефон подключен к компьютеру через порт USB. Нажмите кнопку ниже, если необходимо копировать файлы с компьютера на SD-карту устройства Android (или наоборот)."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Включить USB-накопитель"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"При использовании SD-карты как USB-накопителя возникла неполадка."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"устройство USB подключено"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Выберите копирование файлов на компьютер или с компьютера."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Выключить USB-накопитель"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Выберите, чтобы выключить USB-накопитель."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Выключить USB-накопитель"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Перед выключением USB-накопителя обязательно отключите USB-хост. Выберите \"Выключить\", чтобы выключить USB-накопитель."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Выключить"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Отмена"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"При выключении USB-накопителя произошла неполадка. Убедитесь, что USB-хост отключен, и повторите попытку."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-накопитель используется"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Перед отключением USB-накопителя убедитесь, что SD-карта устройства Android была отключена от компьютера."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Выключить USB-накопитель"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"При выключении USB-накопителя произошла неполадка. Убедитесь, что USB-хост отключен, и повторите попытку."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Форматировать карту SD"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Отформатировать карту SD? Все данные, находящиеся на карте, будут уничтожены."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Подходящих действий не найдено"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"обновлять статистику использования компонентов"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Позволяет изменять собранную статистику использования компонентов. Не предназначено для использования обычными приложениями."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Позволяет вызывать службу контейнера для копирования содержания. Не предназначена для обычных программ."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Позволяет вызывать службу контейнера для копирования содержания. Не предназначена для обычных программ."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Нажмите дважды для изменения масштаба"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Ошибка при наполнении виджета"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Выбрать"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Создать контакт"\n"с номером <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"отмечено"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"не проверено"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Одна или несколько программ требуют разрешения для доступа к вашему аккаунту сейчас и в дальнейшем."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Разрешить этот запрос?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Запрос доступа"</string>
     <string name="allow" msgid="7225948811296386551">"Разрешить"</string>
     <string name="deny" msgid="2081879885755434506">"Отклонить"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Разрешение запрошено"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Протокол L2TP"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN (на основе предв. общ. ключа)"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN (на основе сертификата)"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Выбрать файл"</string>
+    <string name="reset" msgid="2448168080964209908">"Сбросить"</string>
+    <string name="submit" msgid="1602335572089911941">"Отправить"</string>
+    <string name="description_star" msgid="2654319874908576133">"избранное"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-подключение доступно"</string>
+    <string name="tether_message" msgid="554549994538298101">"Выберите \"Подключить\", если вы хотите разрешить использовать на компьютере подключение для передачи данных, установленное на телефоне."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Подключение"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Отмена"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Возникла ошибка при подключении."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-подключение доступно"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Выберите, чтобы подключить телефон к компьютеру."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Отключить"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Выберите, чтобы разорвать подключение к компьютеру."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Разорвать подключение"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Подключение для передачи данных на телефоне используется на компьютере. Выберите \"Отключить\", чтобы разорвать USB-подключение."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Отключить"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Отмена"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"При разрыве подключения возникла неполадка. Пожалуйста, повторите попытку."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 1737414..aa4bcb4 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Tillåter att ett program aktiverar felsökning för ett annat program. Skadliga program kan använda detta för att avsluta andra program."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"ändra dina gränssnittsinställningar"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Tillåter att ett program ändrar den aktuella konfigurationen, till exempel språk eller övergripande teckenformat."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"aktivera trafikläge"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Tillåter att ett program aktiverar trafikläge."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"avbryt bakgrundsprocesser"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Tillåter att ett program avslutar bakgrundsprocesser för andra program även om det inte finns för lite ledigt minne."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"framtvinga avslutning av andra program"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Tillåter att ett program framtvingar avslutning av andra program."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"tvinga program att avsluta"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Tillåter att ett program tvingar en aktivitet som finns i förgrunden att avsluta och gå tillbaka. Behövs inte för vanliga program."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"hämta systemets interna status"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Tillåter att samlad batteristatistik ändras. Används inte av vanliga program."</string>
     <string name="permlab_backup" msgid="470013022865453920">"kontrollera säkerhetskopiering och återställning av systemet"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Tillåter att programmet styr över systemets mekanism för säkerhetskopiering och återställning. Används inte av vanliga program."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"Säkerhetskopiera och återställ programmets data"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Tillåter att programmet deltar i systemets mekanism för säkerhetskopiering och återställning."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"visa otillåtna fönster"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillåter att fönster skapas och används av det interna systemgränssnittet. Används inte av vanliga program."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"visa varningar på systemnivå"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en inmatningsmetod. Ska inte behövas för vanliga program."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"binda till en bakgrund"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Innehavaren tillåts att binda till den översta nivåns gränssnitt för en bakgrund. Ska inte behövas för vanliga program."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"arbeta med en enhetsadministratör"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Tillåter att innehavaren skickar avsikter till en enhetsadministratör. Vanliga program behöver aldrig göra detta."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"ändra bildskärmens rikting"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Tillåter att ett program när som helst ändrar skärmens rotering. Behövs inte för vanliga program."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"skicka Linux-signaler till program"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Tillåter att ett program installerar nya eller uppdaterade Android-paket. Skadliga program kan använda detta för att lägga till nya program med godtyckliga och starka behörigheter."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"ta bort cacheinformation för alla program"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Tillåter att ett program frigör lagringsutrymme i telefonen genom att ta bort filer i programmets katalog för cachelagring. Åtkomst är mycket begränsad, vanligtvis till systemprocesser."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"läsa systemets loggfiler"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Tillåter att ett program läser från systemets olika loggfiler. Det innebär att programmet kan upptäcka allmän information om vad du gör med telefonen, men den bör inte innehålla personlig eller privat information."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"läsa/skriva till resurser som ägs av diag"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Tillåter att ett program ändrar information om telefonens ägare som har lagrats på din telefon. Skadliga program kan använda detta för att radera eller ändra ägaruppgifter."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"läsa information om ägare"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Tillåter att ett program läser information om telefonens ägare som har lagrats på telefonen. Skadliga program kan använda detta för att läsa telefonens ägaruppgifter."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"läsa kalenderinformation"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Tillåter att ett program läser alla händelser i kalendern som har lagrats på din telefon. Skadliga program kan använda detta för att skicka din kalender till andra personer."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"skriva kalenderdata"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Tillåter att ett program ändrar kalenderuppgifterna som har lagrats på din telefon. Skadliga program kan använda detta för att radera eller ändra kalenderuppgifter."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"skenplatser för att testa"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Skapa skenplatser för att testa. Skadliga program kan använda detta för att åsidosätta platsen och/eller statusen som returneras av riktiga platser, till exempel GPS- eller nätverksleverantörer."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"få åtkomst till extra kommandon för platsleverantör"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Tillåter att programmet monterar och demonterar filsystem för flyttbara lagringsmedia."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"formatera extern lagring"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Tillåter att programmet formaterar flyttbara lagringsmedia."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"få information om säker lagring"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Tillåter att programmet får information om säker lagring."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"skapa säker lagring"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Tillåter att programmet skapar säker lagring."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"förstör säker lagring"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Tillåter att programmet förstör säker lagring."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"montera/avmontera säker lagring"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Tillåter att programmet monterar/avmonterar säker lagring."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"byt namn på säker lagring"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Tillåter att programmet byter namn på säker lagring."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"kontrollera vibration"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Tillåter att programmet styr vibratorn."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"styra lampa"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Tillåter att programmet ger tips om systemets bakgrundsstorlek."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"återställa systemets fabriksinställningar"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Tillåter att ett program helt återställer systemets fabriksinställningar. Alla data, inställningar och installerade program raderas."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"ange tid"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Tillåter att ett program ändrar telefonens tid."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"ange tidszon"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Tillåter att ett program ändrar telefonens tidszon."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"fungera som AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"skriva inställningar för åtkomstpunktens namn"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Tillåter att ett program ändrar APN-inställningarna, till exempel Proxy och Port för alla APN."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"ändra nätverksanslutning"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Tillåter att ett program ändrar statusens nätverksanslutning."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Tillåter att ett program ändrar statusens för en kopplad nätverksanslutning."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"ändra sammanlänkad anslutning"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Tillåter att ett program ändrar statusens för en sammanlänkad nätverksanslutning."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"ändra inställningar för användning av bakgrundsdata"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Tillåter att ett program ändrar inställningen för användning av bakgrundsdata."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"visa Wi-Fi-status"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Tillåter att ett program skriver in nya ord i användarordlistan."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"ändra/ta bort innehåll på SD-kortet"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Tillåter att ett program skriver till SD-kortet."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"åtkomst till cachefilsystemet"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Tillåter att ett program läser och skriver till cachefilsystemet."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Begränsa lösenord"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Begränsar vilka typer av lösenord som får användas."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Visa inloggningsförsök"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Övervaka misslyckade inloggningsförsök på enheten för att utföra åtgärder."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Återställ lösenord"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Framtvinga ett nytt värde för ditt lösenord. Kräver att administratören tillhandahåller det innan du kan logga in."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Framtvinga låsning"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Kontrollera när enheten låses, vilket kräver att du anger lösenordet igen."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Radera alla data"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Återställ fabriksinställningarna och ta bort alla data utan någon bekräftelse."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Hem"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Ange PIN-kod"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Ange lösenord för att låsa upp"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Fel PIN-kod!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Tryck på Menu och sedan på 0 om du vill låsa upp."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Nödsamtalsnummer"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Tryck på Menu om du vill låsa upp."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Rita grafiskt lösenord för att låsa upp"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Nödsamtal"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Korrekt!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Försök igen"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Laddar (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Lås upp"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Ljud på"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Ljud av"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ta bort"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Tillåter att program läser alla webbadresser som webbläsaren har öppnat och alla webbläsarens bokmärken."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skriva webbläsarhistorik och bokmärken"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Tillåter att ett program ändrar webbläsarhistoriken och bokmärkena i din telefon. Skadliga program kan använda detta för att ta bort eller ändra data i webbläsaren."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Ändra geografisk plats för webbläsaren"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Tillåter att ett program ändrar webbläsarens behörigheter för geografisk plats. Skadliga program kan använda detta för att tillåta att platsinformation skickas till godtyckliga webbplatser."</string>
     <string name="save_password_message" msgid="767344687139195790">"Vill du att webbläsaren ska komma ihåg lösenordet?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Inte nu"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Kom ihåg"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"för 1 timme sedan"</item>
     <item quantity="other" msgid="2467273239587587569">"för <xliff:g id="COUNT">%d</xliff:g> timmar sedan"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"igår"</item>
     <item quantity="other" msgid="2479586466153314633">"för <xliff:g id="COUNT">%d</xliff:g> dagar sedan"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"Inga behörigheter krävs"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Dölj"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Visa alla"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Läser in…"</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB-masslagring"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB-ansluten"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Du har anslutit telefonen till datorn via USB. Välj Montera om du vill kopiera filer mellan datorn och telefonens SD-kort."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Montera"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Montera inte"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Du har anslutit telefonen till datorn via USB. Välj knappen nedan om du vill kopiera filer mellan datorn och SD-kortet i din Android."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"Aktivera USB-lagring"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"Det gick inte att använda ditt SD-kort för USB-lagring."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-ansluten"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Välj om du vill kopiera filer till/från din dator."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"Inaktivera USB-lagring"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"Välj om USB-lagring ska inaktiveras."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"Inaktivera USB-lagring"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"Innan du inaktiverar USB-lagring måste du kontrollera att du har demonterat USB-värden. Välj Inaktivera om du vill inaktivera USB-lagring."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Inaktivera"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Avbryt"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Ett problem uppstod när USB-lagringsplatsen skulle inaktiveras. Kontrollera att USB-värden har demonterats och försök igen."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-lagret används"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"Kontrollera att du har demonterat (\"matat ut\") Android-telefonens SD-kort från datorn, innan du inaktiverar USB-lagring."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Inaktivera USB-lagring"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"Ett problem uppstod när USB-lagringsplatsen skulle inaktiveras. Kontrollera att USB-värden har demonterats och försök igen."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"Formatera SD-kort"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"Vill du formatera SD-kortet? Alla data på ditt kort kommer att gå förlorade."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Inga matchande aktiviteter hittades"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"uppdatera statistik över användning av komponenter"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Tillåter att samlad komponentstatistik ändras. Används inte av vanliga program."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Tillåter att innehåll kopieras genom att standardbehållartjänsten startas. Vanliga program behöver aldrig göra detta."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Tillåter att innehåll kopieras genom att standardbehållartjänsten startas. Vanliga program behöver aldrig göra detta."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Peka två gånger för zoomkontroll"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Fel när widgeten expanderades"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Kör"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"Skapa kontakt"\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"markerad"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"inte markerad"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Följande program begär behörighet till konto, både nu och i framtiden."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Vill du tillåta den här begäran?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Begäran om åtkomst"</string>
     <string name="allow" msgid="7225948811296386551">"Tillåt"</string>
     <string name="deny" msgid="2081879885755434506">"Neka"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"Begärd behörighet"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Layer 2 Tunneling Protocol"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"I förväg delad L2TP/IPSec VPN-nyckel"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Certifikatsbaserad L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Välj fil"</string>
+    <string name="reset" msgid="2448168080964209908">"Återställ"</string>
+    <string name="submit" msgid="1602335572089911941">"Skicka"</string>
+    <string name="description_star" msgid="2654319874908576133">"favorit"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB-sammanlänkning tillgänglig"</string>
+    <string name="tether_message" msgid="554549994538298101">"Välj \"Sammanlänka\" om du vill dela telefonens dataanslutning med en dator."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Sammanlänka"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"Avbryt"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Ett problem uppstod vid sammanlänkning."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB-sammanlänkning tillgänglig"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Sammanlänka datorn med din telefon."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Ta bort sammanlänkning"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Ta bort sammanlänkning med datorn."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Koppla ifrån sammanlänkad anslutning"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Du har delat telefonens dataanslutning med din dator. Välj \"Koppla ifrån\" om du vill koppla från USB-sammanlänkningen."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Koppla ifrån"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"Avbryt"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Ett problem uppstod när sammanlänkningen inaktiverades. Försök igen."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 26ac5b0..927edd1 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"Bir uygulamanın başka bir uygulama için hata ayıklamayı çalıştırmasına izin verir. Kötü amaçlı uygulamalar bu işlevi başka uygulamaları kapatmak için kullanabilir."</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"kullanıcı arayüzü ayarlarınızı değiştirin"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"Uygulamaların güncel yapılandırmayı; örneğin yerel ayarı veya genel yazı tipi boyutunu değiştirmesine izin verir."</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"araç modunu etkinleştir"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"Bir uygulamanın araç modunu etkinleştirmesine izin verir."</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"arka plan işlemleri son erdir"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"Bellek düşük olmasa dahi, bir uygulamanın diğer uygulamaların arka plan işlemlerini sona erdirmesine izin verir."</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"diğer uygulamaları durmaya zorla"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"Bir uygulamanın başka uygulamaları zorla durdurmasına izin verir."</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"uygulamayı kapanmaya zorla"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"Uygulamaların, ön plandaki herhangi bir etkinliği kapanmaya ve arka plana geçmeye zorlamasına izin verir. Normal uygulamalarda hiçbir zaman gerekmemelidir."</string>
     <string name="permlab_dump" msgid="1681799862438954752">"sistemin dahili durumunu al"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"Toplanan pil istatistiklerinin değiştirilmesine izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
     <string name="permlab_backup" msgid="470013022865453920">"sistem yedeğini kontrol et ve geri yükle"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"Uygulamaya sistem yedekleme ve geri yükleme mekanizmasını denetleme izni verir. Normal uygulamalar tarafından kullanım için değildir."</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"uygulamanın verilerini yedekle ve geri yükle"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"Uygulamaya, sistem yedekleme ve geri yükleme mekanizmasına katılma izni verir."</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"yetkisiz pencereleri görüntüle"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Dahili sistem kullanıcı arayüzü tarafından kullanılmak üzere tasarlanmış pencerelerin oluşturulmasına izin verir. Normal uygulamalarda kullanılmaz."</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"sistem düzeyi uyarıları görüntüle"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"Tutucunun bir giriş yönteminin en üst düzey arayüzüne bağlanmasına izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"bir duvar kağıdına tabi kıl"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"Hesap sahibine bir duvar kağıdının en üst düzey arayüzüne bağlanma izni verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"bir cihaz yöneticisi ile etkileşimde bulun"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"Cihazın sahibinin cihaz yöneticisine amaç göndermesine izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"ekran yönünü değiştir"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"Uygulamaların ekran yönünü istedikleri zaman değiştirmesine izin verir. Normal uygulamalarda hiçbir zaman gerekmemelidir."</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"uygulamalara Linux sinyalleri gönder"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"Uygulamaların yeni veya güncellenmiş Android paketleri yüklemesine izin verir. Kötü amaçlı uygulamalar bunu, kendilerine verilen izin derecesi keyfi olarak değişen yeni uygulamalar eklemek için kullanabilir."</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"tüm uygulama önbelleği verilerini sil"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"Uygulamaların uygulama önbelleği dizinindeki dosyaları silerek telefonda yer açmasına izin verir. Erişim genellikle sistem işlemlerine ve yüksek düzeyde kısıtlı olarak verilir."</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"sistem günlük dosyalarını oku"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"Uygulamaların sistemin çeşitli günlük dosyalarından okumalarına izin verir. Bu, uygulamaların telefon ile neler yaptığınız ile ilgili genel bilgi bulmasına izin verir, ancak bunlar kişisel veya özel bir bilgi içermemelidir."</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"sahibi tanılama olan kaynakları oku/bunlara yaz"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"Uygulamaların telefonunuzda depolanan telefon sahibi verilerini değiştirmesine izin verir. Kötü amaçlı uygulamalar bu işlevi kullanıcı verilerini silmek veya değiştirmek için kullanabilir."</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"sahip verilerini oku"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"Uygulamaların telefonunuzda depolanan telefon sahibi verilerini okumasına izin verir. Kötü amaçlı uygulamalar bunu telefon sahibi verilerini okumak için kullanabilir."</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"takvim verilerini oku"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"Uygulamaların telefonunuzda depolanan takvim etkinliklerinin tümünü okumasına izin verir. Kötü amaçlı uygulamalar bunu, takvim etkinliklerinizi başkalarına göndermek için kullanabilir."</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"takvim verilerini yaz"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"Uygulamaların telefonunuzda depolanan takvim etkinliklerini değiştirmesine izin verir. Kötü amaçlı uygulamaları bunu takvim verilerinizi silmek veya değiştirmek için kullanabilir."</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"test için sahte konum kaynakları"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"Test amacıyla sahte konum kaynakları oluşturur. Kötü amaçlı uygulamalar bu işlevi GPS veya Ağ Hizmeti sağlayıcılar gibi gerçek kaynaklardan gelen konum ve/veya durum bilgilerini geçersiz kılmak için kullanabilir."</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"ek konum sağlayıcı komutlarına eriş"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"Uygulamaların çıkarılabilir depolama birimleri için dosya sistemleri ile bağlantı kurmasına ve bağlantıyı kesmesine izin verir."</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"harici depolama birimini biçimlendir"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"Uygulamanın çıkarılabilir depolama birimini biçimlendirmesine izin verir."</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"güvenli depolama birimi hakkında bilgi al"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"Uygulamanın güvenli depolama birimi hakkında bilgi almasına izin verir."</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"güvenli depolama birimi oluştur"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"Uygulamanın güvenli depolama birimi oluşturmasına izin verir."</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"güvenli depolama birimini yok et"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"Uygulamanın güvenli depolama birimini yok etmesine izin verir."</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"güvenli depolama birimini ekle / kaldır"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"Uygulamanın güvenli depolama birimini yeniden eklemesine / kaldırmasına izin verir."</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"güvenli depolama birimini yeniden adlandır"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"Uygulamanın güvenli depolama birimini yeniden adlandırmasına izin verir."</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"titreşimi denetle"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"Uygulamanın titreşimi denetlemesine izin verir."</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"flaşı denetle"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"Uygulamanın sistem duvar kağıdı boyutu ipuçlarını ayarlamasına izin verir."</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"sistemi fabrika değerlerine sıfırla"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"Uygulamanın, sistemi tamamen fabrika ayarlarına sıfırlamasına; verileri, yapılandırmayı ve yüklü uygulamaları silmesine izin verir."</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"saati ayarla"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"Bu uygulamanın telefonun saatini değiştirmesine izin verir."</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"saat dilimini ayarla"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"Uygulamaların telefonun saat dilimini değiştirmesine izin verir."</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"Hesap Yönetici Hizmeti gibi davran"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"Erişim Noktası Adı ayarlarını yaz"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"Uygulamaların herhangi bir APN\'nin Proxy ve Bağlantı Noktası gibi APN ayarlarını değiştirmesine izin verir."</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"ağ bağlantısını değiştir"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"Uygulamaların ağ bağlantı durumunu değiştirmesine izin verir."</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"Bir uygulamanın ağ bağlantı durumunu değiştirmesine izin verir."</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"kullanılan bağlantıyı değiştir"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"Bir uygulamanın bağlanılan ağ bağlantısı durumunu değiştirmesine izin verir."</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"arka plan veri kullanımı ayarını değiştir"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"Uygulamaların arka plan veri kullanımı ayarını değiştirmesine izin verir."</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"Kablosuz durumunu görüntüle"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"Uygulamaların kullanıcı sözlüğüne yeni kelimeler yazmasına izin verir."</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"SD kart içeriklerini değiştir/sil"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"Bir uygulamaya SD karta yazma izni verir."</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"önbellek dosya sistemine eriş"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"Bir uygulamanın önbellek dosya sisteminde okuma yazma yapmasına izin verir."</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"Şifreyi sınırla"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"Kullanmanıza izin verilen şifre türlerini sınırlayın."</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"Oturum açma denemelerini izle"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"Bir işlem gerçekleştirmek için cihazdaki başarısız oturum açma girişimlerini izleyin."</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"Şifre sıfırlama"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"Şifrenizi yeni bir değer alması için zorlayın. Giriş yapabilmeniz için yöneticinin size yeni bir değer sağlamasını gerekecektir."</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"Kilitlemeye zorlama"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"Cihaz kilitlendiğinde, şifresini yeniden girmenizi gerektiren denetim."</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"Tüm verileri sil"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"Tüm verilerinizi onay olmadan silmek için fabrika ayarlarına sıfırlayın."</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"Ev"</item>
     <item msgid="869923650527136615">"Mobil"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"<xliff:g id="SOURCE">%1$s</xliff:g> aracılığıyla"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="SOURCE">%2$s</xliff:g> ile <xliff:g id="DATE">%1$s</xliff:g> tarihinde"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"PIN kodunu gir"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"Kilidi açmak için şifreyi girin"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"Yanlış PIN kodu!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmak için önce Menü\'ye, sonra 0\'a basın."</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"Acil durum numarası"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Kilidi açmak için Menü\'ye basın."</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Kilit açmak için deseni çizin"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"Acil durum çağrısı"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Doğru!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"Üzgünüz, lütfen yeniden deneyin"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"Şarj oluyor (<xliff:g id="PERCENT">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>)"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"Kilit Aç"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Sesi aç"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Sesi kapat"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Temizle"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Uygulamaya Tarayıcının ziyaret etmiş olduğu tüm URL\'leri ve Tarayıcının tüm favorilerini okuma izni verir."</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"Tarayıcı geçmişini ve favorileri yaz"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"Uygulamaya telefonunuzda depolanan Tarayıcı geçmişini veya favorileri değiştirme izni verir. Kötü amaçlı uygulamalar bunu Tarayıcı verilerinizi silmek veya değiştirmek için kullanabilir."</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"Tarayıcı\'nın coğrafi konum izinlerini değiştir"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"Bir uygulamanın, Tarayıcı\'nın coğrafi konum izinlerini değiştirmesine izin verir. Kötü amaçlı uygulamalar, bu özelliği konum bilgilerini rastgele web sitelerine göndermek için kullanabilir."</string>
     <string name="save_password_message" msgid="767344687139195790">"Tarayıcının bu şifreyi anımsamasını istiyor musunuz?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Şimdi değil"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Anımsa"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 saat önce"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> saat önce"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"dün"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> gün önce"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"Gizle"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"Tümünü göster"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"Yükleniyor…"</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB Yığın Depolama"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB bağlandı"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"Telefonunuzu bilgisayarınıza USB ile bağladınız. Bilgisayarınız ve telefonunuzun SD kartı arasında dosya kopyalamak istiyorsanız, \"Bağla\"\'yı seçin."</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"Bağla"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"Bağlama"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"Telefonunuzu USB ile bilgisayarınıza bağladınız. Bilgisayarınız ile Android\'inizin SD kartı arasında dosya kopyalamak istiyorsanız aşağıdaki düğmeyi seçin."</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"USB depolama birimini aç"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"SD kartınızı USB depolama birimi için kullanmada bir sorun var."</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB bağlandı"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"Bilgisayarınıza/bilgisayarınızdan dosya kopyalamak için seçin."</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB depolama birimini kapat"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"USB depolama birimini kapatmak için seçin."</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"USB depolama birimini kapat"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"USB depolama birimini kapatmadan önce USB ana makinesinde bağlantıyı kestiğinizden emin olun. USB depolama birimini kapatmak için \"Kapat\"ı seçin."</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Kapat"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"İptal"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"USB depolama birimini kapatırken bir sorunla karşılaştık. USB ana makinesinin bağlantısını kestiğinizden emin olduktan sonra tekrar deneyin."</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"USB depolama birimi kullanılıyor"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"USB depolama birimini kapatmadan önce Android SD kartını bilgisayarınızdan kaldırdığınızdan (\"çıkardığınızdan\") emin olun."</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USB depolama birimini kapat"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"USB depolama birimini kapatırken bir sorun oluştu. USB ana makinesini kaldırdığınızdan emin olun ve daha sonra tekrar deneyin."</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"SD kartı biçimlendir"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"SD kartı biçimlendirmek istediğinizden emin misiniz? Kartınızdaki tüm veriler yok olacak."</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"Biçimlendir"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"Eşleşen hiçbir etkinlik bulunamadı"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"bileşen kullanım istatistiklerini güncelle"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"Toplanmış bileşen istatistiklerinin değiştirilmesine izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"Varsayılan kapsayıcı hizmetin içeriği kopyalamak için çağrılmasına izin verir. Normal uygulamalar tarafından kullanılmaz."</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"Varsayılan kapsayıcı hizmetin içeriği kopyalamak için çağrılmasına izin verir. Normal uygulamalar tarafından kullanılmaz."</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Zum denetimi için iki kez dokun"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"Widget\'ı genişletirken hata oluştu"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"Git"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"<xliff:g id="NUMBER">%s</xliff:g>"\n" ile kişi oluştur"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"seçildi"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"seçilmedi"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"Aşağıdaki bir veya daha fazla uygulama, şimdi ve ileride hesabınıza erişmek için izin istiyor."</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Bu isteğe izin vermek istiyor musunuz?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"Erişim İsteği"</string>
     <string name="allow" msgid="7225948811296386551">"İzin Ver"</string>
     <string name="deny" msgid="2081879885755434506">"Reddet"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"İzin İstendi"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"Katman 2 Tünel Protokolü"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"L2TP/IPSec VPN temelli önceden paylaşılmış anahtar"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"L2TP/IPSec VPN temelli sertifika"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"Dosya seç"</string>
+    <string name="reset" msgid="2448168080964209908">"Sıfırla"</string>
+    <string name="submit" msgid="1602335572089911941">"Gönder"</string>
+    <string name="description_star" msgid="2654319874908576133">"favori"</string>
+    <string name="tether_title" msgid="6970447107301643248">"USB bağlantısı kullanılabilir"</string>
+    <string name="tether_message" msgid="554549994538298101">"Telefonunuzun veri bağlantısını bilgisayarınızla paylaşmak istiyorsanız, \"Bağlan\" seçeneğini belirleyin."</string>
+    <string name="tether_button" msgid="7409514810151603641">"Bağlan"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"İptal"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"Bağlantıyla ilgili bir sorun var."</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"USB bağlantısı kullanılabilir"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"Bilgisayarınızı telefonunuza bağlamak için seçin."</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"Bağlantıyı kaldır"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"Bilgisayarınızın bağlantısını kesmek için seçin."</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"Bağlantıyı kes"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"Telefonunuzun cep telefonu veri bağlantısını bilgisayarınızla paylaşıyordunuz. USB bağlantısını kesmek için \"Bağlantıyı Kes\" seçeneğini belirleyin."</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"Bağlantıyı kes"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"İptal"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"Bağlantı kapatılırken bir sorunla karşılaşıldı. Lütfen tekrar deneyin."</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 5be8676..ad081d6 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -185,14 +185,12 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"允许应用程序启动对其他应用程序的调试。恶意应用程序可借此终止其他应用程序。"</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"更改用户界面设置"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"允许应用程序更改当前配置,例如语言设置或整体的字体大小。"</string>
-    <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
-    <skip />
-    <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
-    <skip />
-    <!-- no translation found for permlab_forceStopPackages (1447830113260156236) -->
-    <skip />
-    <!-- no translation found for permdesc_forceStopPackages (7263036616161367402) -->
-    <skip />
+    <string name="permlab_enableCarMode" msgid="5684504058192921098">"启用车载模式"</string>
+    <string name="permdesc_enableCarMode" msgid="5673461159384850628">"允许应用程序启用车载模式。"</string>
+    <string name="permlab_killBackgroundProcesses" msgid="8373714752793061963">"结束后台进程"</string>
+    <string name="permdesc_killBackgroundProcesses" msgid="2908829602869383753">"无论内存资源是否紧张,都允许应用程序结束其他应用程序的后台进程。"</string>
+    <string name="permlab_forceStopPackages" msgid="1447830113260156236">"强行停止其他应用程序"</string>
+    <string name="permdesc_forceStopPackages" msgid="7263036616161367402">"允许应用程序强行停止其他应用程序。"</string>
     <string name="permlab_forceBack" msgid="1804196839880393631">"强制应用程序关闭"</string>
     <string name="permdesc_forceBack" msgid="6534109744159919013">"允许应用程序强制前端的任何活动关闭并重新开始。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_dump" msgid="1681799862438954752">"检索系统内部状态"</string>
@@ -217,8 +215,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"允许修改收集的电池使用情况统计信息。普通应用程序不能使用此权限。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系统备份和还原"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"允许应用程序控制系统的备份和还原机制。普通应用程序不能使用此权限。"</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"备份与还原应用程序数据"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"允许应用程序参与系统的备份和还原机制。"</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"显示未授权的窗口"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"显示系统级警报"</string>
@@ -235,6 +231,8 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"允许手机用户绑定至输入法的顶级界面。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"绑定到壁纸"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"允许手机用户绑定到壁纸的顶级界面。应该从不需要将此权限授予普通应用程序。"</string>
+    <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"与设备管理器交互"</string>
+    <string name="permdesc_bindDeviceAdmin" msgid="8714424333082216979">"允许持有对象将意向发送到设备管理器。普通的应用程序一律无需此权限。"</string>
     <string name="permlab_setOrientation" msgid="3365947717163866844">"更改屏幕显示方向"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"允许应用程序随时更改屏幕的旋转方向。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"向应用程序发送 Linux 信号"</string>
@@ -253,6 +251,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"允许应用程序安装全新的或更新的 Android 包。恶意应用程序可能会借此添加其具有任意权限的新应用程序。"</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"删除所有应用程序缓存数据"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。通常此权限只适用于系统进程。"</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"读取系统日志文件"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"允许应用程序从系统的各日志文件中读取信息。这样应用程序可以发现您的手机使用情况,但这些信息不应包含任何个人信息或保密信息。"</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"读取/写入诊断所拥有的资源"</string>
@@ -279,10 +281,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"允许应用程序修改您手机上存储的手机所有者数据。恶意应用程序可借此清除或修改所有者数据。"</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"读取所有者数据"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"允许应用程序读取您手机上存储的手机所有者数据。恶意应用程序可借此读取手机所有者数据。"</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"读取日历数据"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"允许应用程序读取您手机上存储的所有日历活动。恶意应用程序可借此将您的日历活动发送给其他人。"</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"写入日历数据"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"允许应用程序修改您手机上存储的日历活动。恶意应用程序可借此清除或修改您的日历数据。"</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"使用模拟地点来源进行测试"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"创建模拟地点来源进行测试。恶意应用程序可能利用此选项覆盖由真实地点来源(如 GPS 或网络提供商)传回的地点和/或状态。"</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"访问额外的位置信息提供程序命令"</string>
@@ -311,6 +316,16 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"允许应用程序装载和卸载可移动存储器的文件系统。"</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"格式化外部存储设备"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"允许应用程序格式化可移除的存储设备。"</string>
+    <string name="permlab_asec_access" msgid="1070364079249834666">"获取有关安全存储的信息"</string>
+    <string name="permdesc_asec_access" msgid="7691616292170590244">"允许应用程序获取有关安全存储的信息。"</string>
+    <string name="permlab_asec_create" msgid="7312078032326928899">"创建安全存储"</string>
+    <string name="permdesc_asec_create" msgid="7041802322759014035">"允许应用程序创建安全存储。"</string>
+    <string name="permlab_asec_destroy" msgid="7787322878955261006">"清除安全存储"</string>
+    <string name="permdesc_asec_destroy" msgid="5740754114967893169">"允许应用程序清除安全存储。"</string>
+    <string name="permlab_asec_mount_unmount" msgid="7517449694667828592">"安装/卸载安全存储"</string>
+    <string name="permdesc_asec_mount_unmount" msgid="5438078121718738625">"允许应用程序安装/卸载安全存储。"</string>
+    <string name="permlab_asec_rename" msgid="5685344390439934495">"重命名安全存储"</string>
+    <string name="permdesc_asec_rename" msgid="1387881770708872470">"允许应用程序重命名安全存储。"</string>
     <string name="permlab_vibrate" msgid="7768356019980849603">"控制振动器"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"允许应用程序控制振动器。"</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"控制闪光灯"</string>
@@ -345,6 +360,8 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"允许应用程序设置有关壁纸大小的提示。"</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"将系统恢复为出厂设置"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"允许应用程序将系统恢复为出厂设置,即清除所有数据、配置以及所安装的应用程序。"</string>
+    <string name="permlab_setTime" msgid="2021614829591775646">"设置时间"</string>
+    <string name="permdesc_setTime" msgid="667294309287080045">"允许应用程序更改手机的时间。"</string>
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"设置时区"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"允许应用程序更改手机的时区。"</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"作为 AccountManagerService"</string>
@@ -364,7 +381,9 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"写入“接入点名称”设置"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"允许应用程序修改 APN 设置,例如任何 APN 的代理和端口。"</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"更改网络连接性"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"允许应用程序更改状态网络连接性。"</string>
+    <string name="permdesc_changeNetworkState" msgid="4199958910396387075">"允许应用程序更改网络连接的状态。"</string>
+    <string name="permlab_changeTetherState" msgid="5952584964373017960">"更改绑定的连接"</string>
+    <string name="permdesc_changeTetherState" msgid="8905815579146349568">"允许应用程序更改绑定网络连接的状态。"</string>
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"更改背景数据使用设置"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允许应用程序更改背景数据使用设置。"</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"查看 Wi-Fi 状态"</string>
@@ -395,10 +414,18 @@
     <string name="permdesc_writeDictionary" msgid="2241256206524082880">"允许应用程序向用户词典中写入新词。"</string>
     <string name="permlab_sdcardWrite" msgid="8079403759001777291">"修改/删除 SD 卡内容"</string>
     <string name="permdesc_sdcardWrite" msgid="6643963204976471878">"允许应用程序写入 SD 卡。"</string>
-    <!-- no translation found for permlab_cache_filesystem (5656487264819669824) -->
-    <skip />
-    <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
-    <skip />
+    <string name="permlab_cache_filesystem" msgid="5656487264819669824">"访问缓存文件系统"</string>
+    <string name="permdesc_cache_filesystem" msgid="1624734528435659906">"允许应用程序读取和写入缓存文件系统。"</string>
+    <string name="policylab_limitPassword" msgid="4307861496302850201">"限制密码选择"</string>
+    <string name="policydesc_limitPassword" msgid="1719877245692318299">"限制您能够使用的密码类型。"</string>
+    <string name="policylab_watchLogin" msgid="7374780712664285321">"监控登录尝试"</string>
+    <string name="policydesc_watchLogin" msgid="1961251179624843483">"监控对于登录设备和执行某项操作的失败尝试。"</string>
+    <string name="policylab_resetPassword" msgid="9084772090797485420">"重置密码"</string>
+    <string name="policydesc_resetPassword" msgid="3332167600331799991">"强行更新密码,您需要获得管理员提供的新密码才能登录。"</string>
+    <string name="policylab_forceLock" msgid="5760466025247634488">"强行锁定"</string>
+    <string name="policydesc_forceLock" msgid="2819868664946089740">"控制何时锁定设备,这需要您重新输入密码。"</string>
+    <string name="policylab_wipeData" msgid="3910545446758639713">"清除所有数据"</string>
+    <string name="policydesc_wipeData" msgid="2314060933796396205">"恢复出厂设置,这会在不提示确认的情况下删除您的所有数据。"</string>
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"住宅"</item>
     <item msgid="869923650527136615">"手机"</item>
@@ -495,6 +522,7 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"通过 <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"时间:<xliff:g id="DATE">%1$s</xliff:g>,方式:<xliff:g id="SOURCE">%2$s</xliff:g>"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"输入 PIN 码"</string>
+    <string name="keyguard_password_enter_password_code" msgid="9138158344813213754">"输入密码进行解锁"</string>
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 码不正确!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"要解锁,请先按 MENU 再按 0。"</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"急救或报警电话"</string>
@@ -504,6 +532,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按 MENU 解锁。"</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"绘制解锁图案"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"紧急呼救"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"正确!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"很抱歉,请重试"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"正在充电 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -513,7 +543,7 @@
     <string name="lockscreen_missing_sim_message_short" msgid="7381499217732227295">"没有 SIM 卡"</string>
     <string name="lockscreen_missing_sim_message" msgid="2186920585695169078">"手机中无 SIM 卡"</string>
     <string name="lockscreen_missing_sim_instructions" msgid="8874620818937719067">"请插入 SIM 卡"</string>
-    <string name="emergency_calls_only" msgid="6733978304386365407">"仅限于急救或报警电话"</string>
+    <string name="emergency_calls_only" msgid="6733978304386365407">"只能使用紧急呼叫"</string>
     <string name="lockscreen_network_locked_message" msgid="143389224986028501">"网络已锁定"</string>
     <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM 卡已用 PUK 码锁定"</string>
     <string name="lockscreen_sim_puk_locked_instructions" msgid="635967534992394321">"请参阅《用户指南》或联系客服人员。"</string>
@@ -534,6 +564,9 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"解锁"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"打开声音"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"关闭声音"</string>
+    <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>
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="AMPM">%P</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="AMPM">%p</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
@@ -559,6 +592,8 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"允许应用程序读取用浏览器访问过的所有网址,以及浏览器的所有书签。"</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"写入浏览器的历史记录和书签"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"允许应用程序修改存储在手机中的浏览器历史记录或书签。恶意应用程序可借此清除或修改浏览器数据。"</string>
+    <string name="permlab_writeGeolocationPermissions" msgid="4715212655598275532">"修改浏览器的地理位置权限"</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="4011908282980861679">"允许应用程序修改浏览器的地理位置权限。恶意应用程序会利用这一点将位置信息发送到任意网站。"</string>
     <string name="save_password_message" msgid="767344687139195790">"是否希望浏览器记住此密码?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"暂不保存"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"记住"</string>
@@ -585,6 +620,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 小时前"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> 小时前"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"昨天"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> 天前"</item>
@@ -739,21 +779,27 @@
     <string name="no_permissions" msgid="7283357728219338112">"不需要任何权限"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>"隐藏"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"全部显示"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"正在载入..."</string>
+    <string name="usb_storage_activity_title" msgid="2399289999608900443">"USB 大容量存储"</string>
     <string name="usb_storage_title" msgid="5901459041398751495">"USB 已连接"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"已通过 USB 连接与计算机。若要在计算机和手机 SD 卡之间复制文件,请选择“装载”。"</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"装载"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"不装载"</string>
+    <string name="usb_storage_message" msgid="4796759646167247178">"您已通过 USB 将手机连接至计算机。如果您要在计算机和 Android 手机的 SD 卡之间复制文件,请点击下面的按钮。"</string>
+    <string name="usb_storage_button_mount" msgid="1052259930369508235">"打开 USB 存储设备"</string>
     <string name="usb_storage_error_message" msgid="2534784751603345363">"使用 SD 卡进行 USB 存储时出现问题。"</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB 已连接"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"选择将文件复制到计算机或从计算机复制到存储设备。"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"关闭 USB 存储设备"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"选中以关闭 USB 存储设备。"</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"关闭 USB 存储设备"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"在关闭 USB 存储设备前,请确保您已卸载了 USB 主设备。选择“关闭”关闭 USB 存储设备。"</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"关闭"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"取消"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"关闭 USB 存储设备时遇到问题。请检查是否卸载了 USB 主设备,然后重试。"</string>
+    <string name="usb_storage_stop_title" msgid="660129851708775853">"使用中的 USB 存储设备"</string>
+    <string name="usb_storage_stop_message" msgid="3613713396426604104">"在关闭 USB 存储设备前,请确保您已从计算机中卸载(“弹出”)Android 手机的 SD 卡。"</string>
+    <string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"关闭 USB 存储设备"</string>
+    <string name="usb_storage_stop_error_message" msgid="143881914840412108">"关闭 USB 存储设备时遇到问题。请检查并确保已卸载了 USB 主设备,然后重试。"</string>
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"格式化 SD 卡"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"确定要将 SD 卡格式化吗?该卡上的所有数据都将丢失。"</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
@@ -778,6 +824,8 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"找不到匹配的活动"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"更新组件使用情况统计"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"允许修改收集的组件使用情况统计。普通应用程序不能使用此权限。"</string>
+    <string name="permlab_copyProtectedData" msgid="1660908117394854464">"允许调用默认容器服务复制内容。普通的应用程序无需此权限。"</string>
+    <string name="permdesc_copyProtectedData" msgid="537780957633976401">"允许调用默认容器服务复制内容。普通的应用程序无需此权限。"</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"双击可以进行缩放控制"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"放大窗口小部件时出错"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"开始"</string>
@@ -790,12 +838,9 @@
     <string name="create_contact_using" msgid="4947405226788104538">"创建电话号码为"\n"<xliff:g id="NUMBER">%s</xliff:g> 的联系人"</string>
     <string name="accessibility_compound_button_selected" msgid="5612776946036285686">"已选中"</string>
     <string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"未选中"</string>
-    <!-- no translation found for grant_credentials_permission_message_header (6824538733852821001) -->
-    <skip />
-    <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
-    <skip />
-    <!-- no translation found for grant_permissions_header_text (2722567482180797717) -->
-    <skip />
+    <string name="grant_credentials_permission_message_header" msgid="6824538733852821001">"以下一个或多个应用程序请求获得在目前和将来访问您帐户的权限。"</string>
+    <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"您是否同意此请求?"</string>
+    <string name="grant_permissions_header_text" msgid="2722567482180797717">"访问请求"</string>
     <string name="allow" msgid="7225948811296386551">"允许"</string>
     <string name="deny" msgid="2081879885755434506">"拒绝"</string>
     <string name="permission_request_notification_title" msgid="5390555465778213840">"已请求权限"</string>
@@ -809,10 +854,26 @@
     <string name="l2tp_vpn_description" msgid="3750692169378923304">"第 2 层隧道协议"</string>
     <string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"基于预共享密钥的 L2TP/IPSec VPN"</string>
     <string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"基于证书的 L2TP/IPSec VPN"</string>
-    <!-- no translation found for upload_file (2897957172366730416) -->
+    <string name="upload_file" msgid="2897957172366730416">"选择文件"</string>
+    <string name="reset" msgid="2448168080964209908">"重置"</string>
+    <string name="submit" msgid="1602335572089911941">"提交"</string>
+    <string name="description_star" msgid="2654319874908576133">"收藏"</string>
+    <string name="tether_title" msgid="6970447107301643248">"可进行 USB 绑定"</string>
+    <string name="tether_message" msgid="554549994538298101">"如果您希望自己的手机与计算机共享数据连接,请选择“绑定”。"</string>
+    <string name="tether_button" msgid="7409514810151603641">"绑定"</string>
+    <string name="tether_button_cancel" msgid="6744369928952219677">"取消"</string>
+    <string name="tether_error_message" msgid="6672110337349077628">"绑定时出现问题。"</string>
+    <string name="tether_available_notification_title" msgid="367754042700082080">"可进行 USB 绑定"</string>
+    <string name="tether_available_notification_message" msgid="8439443306503453793">"选择将您的计算机与手机进行绑定。"</string>
+    <string name="tether_stop_notification_title" msgid="1902246071807668101">"解除绑定"</string>
+    <string name="tether_stop_notification_message" msgid="6920086906891516128">"选择解除计算机的绑定。"</string>
+    <string name="tether_stop_title" msgid="3118332507220912235">"解除绑定"</string>
+    <string name="tether_stop_message" msgid="7741840433788363174">"您的手机与计算机已共享蜂窝数据连接。选择“断开绑定”可解除 USB 绑定。"</string>
+    <string name="tether_stop_button" msgid="8061941592702063029">"断开绑定"</string>
+    <string name="tether_stop_button_cancel" msgid="3694669546501300230">"取消"</string>
+    <string name="tether_stop_error_message" msgid="4244697367270211648">"在解除绑定时遇到了问题。请重试。"</string>
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
     <skip />
-    <!-- no translation found for reset (2448168080964209908) -->
-    <skip />
-    <!-- no translation found for submit (1602335572089911941) -->
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index d500b51..0c8bafc 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -151,7 +151,7 @@
     <string name="permgroupdesc_accounts" msgid="4948732641827091312">"存取可用帳戶。"</string>
     <string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"硬體控制"</string>
     <string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"在免持設備上直接存取硬體。"</string>
-    <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"撥打電話"</string>
+    <string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"通話次數"</string>
     <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"監控、記錄與進行通話。"</string>
     <string name="permgrouplab_systemTools" msgid="4652191644082714048">"系統工具"</string>
     <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"系統低階存取與控制。"</string>
@@ -185,6 +185,10 @@
     <string name="permdesc_setDebugApp" msgid="5584310661711990702">"允許應用程式為其他程式開啟偵錯功能。請注意:惡意程式可利用此功能終止其他應用程式。"</string>
     <string name="permlab_changeConfiguration" msgid="8214475779521218295">"變更介面設定"</string>
     <string name="permdesc_changeConfiguration" msgid="3465121501528064399">"允許應用程式變更目前設定,例如:地區設定或字型大小。"</string>
+    <!-- no translation found for permlab_enableCarMode (5684504058192921098) -->
+    <skip />
+    <!-- no translation found for permdesc_enableCarMode (5673461159384850628) -->
+    <skip />
     <!-- no translation found for permlab_killBackgroundProcesses (8373714752793061963) -->
     <skip />
     <!-- no translation found for permdesc_killBackgroundProcesses (2908829602869383753) -->
@@ -217,8 +221,6 @@
     <string name="permdesc_batteryStats" msgid="5847319823772230560">"允許修改電池狀態。一般應用程式不會使用此功能。"</string>
     <string name="permlab_backup" msgid="470013022865453920">"控制系統備份與還原"</string>
     <string name="permdesc_backup" msgid="4837493065154256525">"允許應用程式控制系統備份與還原機制 (不建議一般應用程式使用)。"</string>
-    <string name="permlab_backup_data" msgid="4057625941707926463">"備份及還原應用程式資料"</string>
-    <string name="permdesc_backup_data" msgid="8274426305151227766">"允許應用程式加入系統備份與還原機制。"</string>
     <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"顯示未授權視窗"</string>
     <string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"允許內部系統使用介面建立視窗。一般應用程式不會使用此功能。"</string>
     <string name="permlab_systemAlertWindow" msgid="3372321942941168324">"顯示系統警示"</string>
@@ -235,6 +237,10 @@
     <string name="permdesc_bindInputMethod" msgid="3734838321027317228">"允許擁有人連結至輸入法的最頂層介面。一般應用程式不需使用此選項。"</string>
     <string name="permlab_bindWallpaper" msgid="8716400279937856462">"連結至桌布"</string>
     <string name="permdesc_bindWallpaper" msgid="5287754520361915347">"允許擁有人連結至桌布的最頂層介面,一般應用程式不需使用此選項。"</string>
+    <!-- no translation found for permlab_bindDeviceAdmin (8704986163711455010) -->
+    <skip />
+    <!-- no translation found for permdesc_bindDeviceAdmin (8714424333082216979) -->
+    <skip />
     <string name="permlab_setOrientation" msgid="3365947717163866844">"變更螢幕顯示方向"</string>
     <string name="permdesc_setOrientation" msgid="6335814461615851863">"允許應用程式隨時變更螢幕顯示方向。一般應用程式不需要此功能。"</string>
     <string name="permlab_signalPersistentProcesses" msgid="4255467255488653854">"傳送 Linux 訊號到應用程式"</string>
@@ -253,6 +259,10 @@
     <string name="permdesc_installPackages" msgid="526669220850066132">"允許應用程式安裝新的 Android 程式或更新。請注意:惡意程式可能利用此功能新增具有極高權限的程式。"</string>
     <string name="permlab_clearAppCache" msgid="4747698311163766540">"刪除所有應用程式快取資料。"</string>
     <string name="permdesc_clearAppCache" msgid="7740465694193671402">"允許應用程式刪除快取目錄裡的檔案,釋放儲存空間。此操作通常受到系統程序嚴格限制。"</string>
+    <!-- no translation found for permlab_movePackage (728454979946503926) -->
+    <skip />
+    <!-- no translation found for permdesc_movePackage (6323049291923925277) -->
+    <skip />
     <string name="permlab_readLogs" msgid="4811921703882532070">"讀取系統記錄檔"</string>
     <string name="permdesc_readLogs" msgid="2257937955580475902">"允許應用程式讀取系統記錄檔。此項操作可讓應用程式了解目前手機操作狀態,但內容應不含任何個人或隱私資訊。"</string>
     <string name="permlab_diagnostic" msgid="8076743953908000342">"讀寫 diag 擁有的資源"</string>
@@ -279,10 +289,13 @@
     <string name="permdesc_writeOwnerData" msgid="2344055317969787124">"允許應用程式更改手機持有者的資料。請注意:惡意程式可能利用此功能,清除或修改持有者的資料。"</string>
     <string name="permlab_readOwnerData" msgid="6668525984731523563">"讀取持有者的資料"</string>
     <string name="permdesc_readOwnerData" msgid="3088486383128434507">"允許應用程式讀取手機持有者資料。請注意:惡意程式可能利用此功能讀取持有者的資料。"</string>
-    <string name="permlab_readCalendar" msgid="3728905909383989370">"讀取日曆資料"</string>
+    <!-- no translation found for permlab_readCalendar (6898987798303840534) -->
+    <skip />
     <string name="permdesc_readCalendar" msgid="5533029139652095734">"允許應用程式讀取手機上所有日曆資料。請注意:惡意程式可能利用此功能將您的日曆資料傳送給其他人。"</string>
-    <string name="permlab_writeCalendar" msgid="377926474603567214">"寫入日曆資料"</string>
-    <string name="permdesc_writeCalendar" msgid="8674240662630003173">"允許應用程式編輯日曆資料。請注意:惡意程式可能利用此功能,清除或修改您的日曆資料。"</string>
+    <!-- no translation found for permlab_writeCalendar (3894879352594904361) -->
+    <skip />
+    <!-- no translation found for permdesc_writeCalendar (2988871373544154221) -->
+    <skip />
     <string name="permlab_accessMockLocation" msgid="8688334974036823330">"模擬位置來源以供測試"</string>
     <string name="permdesc_accessMockLocation" msgid="7648286063459727252">"建立模擬位置來源以供測試。請注意:惡意程式可能利用此功能覆寫 GPS 或電信業者傳回的位置及/或狀態。"</string>
     <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"接收額外的位置提供者指令"</string>
@@ -311,6 +324,26 @@
     <string name="permdesc_mount_unmount_filesystems" msgid="6253263792535859767">"允許應用程式掛載/卸載抽取式儲存設備的檔案系統。"</string>
     <string name="permlab_mount_format_filesystems" msgid="5523285143576718981">"將外接式儲存裝置格式化"</string>
     <string name="permdesc_mount_format_filesystems" msgid="574060044906047386">"允許應用程式將可移除式儲存裝置格式化。"</string>
+    <!-- no translation found for permlab_asec_access (1070364079249834666) -->
+    <skip />
+    <!-- no translation found for permdesc_asec_access (7691616292170590244) -->
+    <skip />
+    <!-- no translation found for permlab_asec_create (7312078032326928899) -->
+    <skip />
+    <!-- no translation found for permdesc_asec_create (7041802322759014035) -->
+    <skip />
+    <!-- no translation found for permlab_asec_destroy (7787322878955261006) -->
+    <skip />
+    <!-- no translation found for permdesc_asec_destroy (5740754114967893169) -->
+    <skip />
+    <!-- no translation found for permlab_asec_mount_unmount (7517449694667828592) -->
+    <skip />
+    <!-- no translation found for permdesc_asec_mount_unmount (5438078121718738625) -->
+    <skip />
+    <!-- no translation found for permlab_asec_rename (5685344390439934495) -->
+    <skip />
+    <!-- no translation found for permdesc_asec_rename (1387881770708872470) -->
+    <skip />
     <string name="permlab_vibrate" msgid="7768356019980849603">"控制震動"</string>
     <string name="permdesc_vibrate" msgid="2886677177257789187">"允許應用程式控制震動。"</string>
     <string name="permlab_flashlight" msgid="2155920810121984215">"控制閃光燈"</string>
@@ -345,6 +378,10 @@
     <string name="permdesc_setWallpaperHints" msgid="6019479164008079626">"允許應用程式設定系統桌布大小提示。"</string>
     <string name="permlab_masterClear" msgid="2315750423139697397">"將系統還原至出廠預設值"</string>
     <string name="permdesc_masterClear" msgid="5033465107545174514">"允許應用程式將手機完全重設至出廠設定,清除所有資料、設定與已安裝程式。"</string>
+    <!-- no translation found for permlab_setTime (2021614829591775646) -->
+    <skip />
+    <!-- no translation found for permdesc_setTime (667294309287080045) -->
+    <skip />
     <string name="permlab_setTimeZone" msgid="2945079801013077340">"設定時區"</string>
     <string name="permdesc_setTimeZone" msgid="1902540227418179364">"允許應用程式變更時區。"</string>
     <string name="permlab_accountManagerService" msgid="4829262349691386986">"作為 AccountManagerService"</string>
@@ -364,7 +401,12 @@
     <string name="permlab_writeApnSettings" msgid="7823599210086622545">"輸入存取點名稱設定"</string>
     <string name="permdesc_writeApnSettings" msgid="7443433457842966680">"允許應用程式修改 APN 設定,例如:Proxy 及 APN 的連接埠。"</string>
     <string name="permlab_changeNetworkState" msgid="958884291454327309">"變更網路連線"</string>
-    <string name="permdesc_changeNetworkState" msgid="6278115726355634395">"允許應用程式變更網路連線狀態。"</string>
+    <!-- no translation found for permdesc_changeNetworkState (4199958910396387075) -->
+    <skip />
+    <!-- no translation found for permlab_changeTetherState (5952584964373017960) -->
+    <skip />
+    <!-- no translation found for permdesc_changeTetherState (8905815579146349568) -->
+    <skip />
     <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"變更背景資料使用設定"</string>
     <string name="permdesc_changeBackgroundDataSetting" msgid="1001482853266638864">"允許應用程式變更背景資料使用設定。"</string>
     <string name="permlab_accessWifiState" msgid="8100926650211034400">"檢視 Wi-Fi 狀態"</string>
@@ -399,6 +441,26 @@
     <skip />
     <!-- no translation found for permdesc_cache_filesystem (1624734528435659906) -->
     <skip />
+    <!-- no translation found for policylab_limitPassword (4307861496302850201) -->
+    <skip />
+    <!-- no translation found for policydesc_limitPassword (1719877245692318299) -->
+    <skip />
+    <!-- no translation found for policylab_watchLogin (7374780712664285321) -->
+    <skip />
+    <!-- no translation found for policydesc_watchLogin (1961251179624843483) -->
+    <skip />
+    <!-- no translation found for policylab_resetPassword (9084772090797485420) -->
+    <skip />
+    <!-- no translation found for policydesc_resetPassword (3332167600331799991) -->
+    <skip />
+    <!-- no translation found for policylab_forceLock (5760466025247634488) -->
+    <skip />
+    <!-- no translation found for policydesc_forceLock (2819868664946089740) -->
+    <skip />
+    <!-- no translation found for policylab_wipeData (3910545446758639713) -->
+    <skip />
+    <!-- no translation found for policydesc_wipeData (2314060933796396205) -->
+    <skip />
   <string-array name="phoneTypes">
     <item msgid="8901098336658710359">"住家電話"</item>
     <item msgid="869923650527136615">"行動電話"</item>
@@ -495,6 +557,8 @@
     <string name="contact_status_update_attribution" msgid="5112589886094402795">"透過 <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
     <string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g>透過「<xliff:g id="SOURCE">%2$s</xliff:g>」"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"輸入 PIN 碼"</string>
+    <!-- no translation found for keyguard_password_enter_password_code (9138158344813213754) -->
+    <skip />
     <string name="keyguard_password_wrong_pin_code" msgid="1295984114338107718">"PIN 碼錯誤!"</string>
     <string name="keyguard_label_text" msgid="861796461028298424">"如要解鎖,請按 Menu 鍵,然後按 0。"</string>
     <string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"緊急電話號碼"</string>
@@ -504,6 +568,8 @@
     <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"按下 Menu 鍵解鎖。"</string>
     <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"畫出解鎖圖形"</string>
     <string name="lockscreen_emergency_call" msgid="5347633784401285225">"緊急電話"</string>
+    <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+    <skip />
     <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"正確!"</string>
     <string name="lockscreen_pattern_wrong" msgid="4817583279053112312">"很抱歉,請再試一次"</string>
     <string name="lockscreen_plugged_in" msgid="613343852842944435">"正在充電 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
@@ -534,6 +600,12 @@
     <string name="lockscreen_unlock_label" msgid="737440483220667054">"解除封鎖"</string>
     <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"開啟音效"</string>
     <string name="lockscreen_sound_off_label" msgid="996822825154319026">"關閉音效"</string>
+    <!-- no translation found for password_keyboard_label_symbol_key (992280756256536042) -->
+    <skip />
+    <!-- no translation found for password_keyboard_label_alpha_key (8001096175167485649) -->
+    <skip />
+    <!-- no translation found for password_keyboard_label_alt_key (1284820942620288678) -->
+    <skip />
     <string name="hour_ampm" msgid="4329881288269772723">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm" msgid="1829009197680861107">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
     <string name="status_bar_clear_all_button" msgid="7774721344716731603">"清除"</string>
@@ -559,6 +631,10 @@
     <string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"允許應用程式讀取瀏覽器曾經造訪過的所有網址,以及瀏覽器的所有書籤。"</string>
     <string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"寫入瀏覽器的記錄與書籤"</string>
     <string name="permdesc_writeHistoryBookmarks" msgid="945571990357114950">"允許應用程式修改儲存在電話上的瀏覽記錄或書籤。請注意:惡意應用程式可能會使用此選項來清除或修改您瀏覽器的資料。"</string>
+    <!-- no translation found for permlab_writeGeolocationPermissions (4715212655598275532) -->
+    <skip />
+    <!-- no translation found for permdesc_writeGeolocationPermissions (4011908282980861679) -->
+    <skip />
     <string name="save_password_message" msgid="767344687139195790">"是否記憶此密碼?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"現在不要"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"記住"</string>
@@ -585,6 +661,11 @@
     <item quantity="one" msgid="9150797944610821849">"1 小時以前"</item>
     <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> 小時以前"</item>
   </plurals>
+    <!-- no translation found for last_num_days:other (3069992808164318268) -->
+    <!-- no translation found for last_month (3959346739979055432) -->
+    <skip />
+    <!-- no translation found for older (5211975022815554840) -->
+    <skip />
   <plurals name="num_days_ago">
     <item quantity="one" msgid="861358534398115820">"昨天"</item>
     <item quantity="other" msgid="2479586466153314633">"<xliff:g id="COUNT">%d</xliff:g> 天以前"</item>
@@ -739,21 +820,34 @@
     <string name="no_permissions" msgid="7283357728219338112">"無須許可"</string>
     <string name="perms_hide" msgid="7283915391320676226"><b>" 隱藏"</b></string>
     <string name="perms_show_all" msgid="2671791163933091180"><b>"顯示全部"</b></string>
-    <string name="googlewebcontenthelper_loading" msgid="4722128368651947186">"載入中..."</string>
+    <!-- no translation found for usb_storage_activity_title (2399289999608900443) -->
+    <skip />
     <string name="usb_storage_title" msgid="5901459041398751495">"USB 已連接"</string>
-    <string name="usb_storage_message" msgid="2759542180575016871">"已透過 USB 連接手機與電腦。如要從電腦或 SD 卡複製檔案,請選取 [掛載]。"</string>
-    <string name="usb_storage_button_mount" msgid="8063426289195405456">"掛載"</string>
-    <string name="usb_storage_button_unmount" msgid="6092146330053864766">"不要掛載"</string>
+    <!-- no translation found for usb_storage_message (4796759646167247178) -->
+    <skip />
+    <!-- no translation found for usb_storage_button_mount (1052259930369508235) -->
+    <skip />
     <string name="usb_storage_error_message" msgid="2534784751603345363">"把 SD 卡當成 USB 儲存裝置時發生問題。"</string>
     <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB 已連接"</string>
     <string name="usb_storage_notification_message" msgid="7380082404288219341">"選取此項將檔案複製到電腦,或從電腦複製。"</string>
     <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"關閉 USB 儲存裝置"</string>
     <string name="usb_storage_stop_notification_message" msgid="2591813490269841539">"選取此處關閉 USB 儲存裝置。"</string>
-    <string name="usb_storage_stop_title" msgid="6014127947456185321">"關閉 USB 儲存裝置"</string>
-    <string name="usb_storage_stop_message" msgid="2390958966725232848">"關閉 USB 儲存裝置之前,請確定先從 USB Host 卸載。選取 [關閉] 即可關閉 USB 儲存裝置。"</string>
-    <string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"關閉"</string>
-    <string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"取消"</string>
-    <string name="usb_storage_stop_error_message" msgid="3746037090369246731">"關閉 USB 儲存裝置時發生問題。請檢查您是否已卸載 USB Host,然後再試一次。"</string>
+    <!-- no translation found for usb_storage_stop_title (660129851708775853) -->
+    <skip />
+    <!-- no translation found for usb_storage_stop_message (3613713396426604104) -->
+    <skip />
+    <!-- no translation found for usb_storage_stop_button_mount (7060218034900696029) -->
+    <skip />
+    <!-- no translation found for usb_storage_stop_error_message (143881914840412108) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_title (203356557714612214) -->
+    <skip />
+    <!-- no translation found for dlg_confirm_kill_storage_users_text (3902998926994232358) -->
+    <skip />
+    <!-- no translation found for dlg_error_title (9179426738781357928) -->
+    <skip />
+    <!-- no translation found for dlg_ok (7376953167039865701) -->
+    <skip />
     <string name="extmedia_format_title" msgid="8663247929551095854">"將 SD 卡格式化"</string>
     <string name="extmedia_format_message" msgid="3621369962433523619">"確定要將 SD 卡格式化嗎?該 SD 卡中的所有資料將會遺失。"</string>
     <string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
@@ -778,6 +872,10 @@
     <string name="activity_list_empty" msgid="4168820609403385789">"找不到符合的活動"</string>
     <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"更新元件使用統計資料"</string>
     <string name="permdesc_pkgUsageStats" msgid="891553695716752835">"允許修改收集到的元件使用統計資料。一般應用程式不會使用此功能。"</string>
+    <!-- no translation found for permlab_copyProtectedData (1660908117394854464) -->
+    <skip />
+    <!-- no translation found for permdesc_copyProtectedData (537780957633976401) -->
+    <skip />
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"點兩下以進行縮放控制"</string>
     <string name="gadget_host_error_inflating" msgid="2613287218853846830">"擴大小工具時發生錯誤"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"開始"</string>
@@ -815,4 +913,38 @@
     <skip />
     <!-- no translation found for submit (1602335572089911941) -->
     <skip />
+    <!-- no translation found for description_star (2654319874908576133) -->
+    <skip />
+    <!-- no translation found for tether_title (6970447107301643248) -->
+    <skip />
+    <!-- no translation found for tether_message (554549994538298101) -->
+    <skip />
+    <!-- no translation found for tether_button (7409514810151603641) -->
+    <skip />
+    <!-- no translation found for tether_button_cancel (6744369928952219677) -->
+    <skip />
+    <!-- no translation found for tether_error_message (6672110337349077628) -->
+    <skip />
+    <!-- no translation found for tether_available_notification_title (367754042700082080) -->
+    <skip />
+    <!-- no translation found for tether_available_notification_message (8439443306503453793) -->
+    <skip />
+    <!-- no translation found for tether_stop_notification_title (1902246071807668101) -->
+    <skip />
+    <!-- no translation found for tether_stop_notification_message (6920086906891516128) -->
+    <skip />
+    <!-- no translation found for tether_stop_title (3118332507220912235) -->
+    <skip />
+    <!-- no translation found for tether_stop_message (7741840433788363174) -->
+    <skip />
+    <!-- no translation found for tether_stop_button (8061941592702063029) -->
+    <skip />
+    <!-- no translation found for tether_stop_button_cancel (3694669546501300230) -->
+    <skip />
+    <!-- no translation found for tether_stop_error_message (4244697367270211648) -->
+    <skip />
+    <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
+    <skip />
+    <!-- no translation found for car_mode_disable_notification_message (3262812780382240778) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index ff93984..1ced121 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1867,6 +1867,14 @@
         <attr name="layout_span" format="integer" />
     </declare-styleable>
     <declare-styleable name="TabWidget">
+        <!-- Drawable used to draw the divider between tabs. -->
+        <attr name="divider" />
+        <!-- Determines whether the strip under the tab indicators is drawn or not. -->
+        <attr name="stripEnabled" format="boolean" />
+        <!-- Drawable used to draw the left part of the strip underneath the tabs. -->
+        <attr name="stripLeft" format="reference" />
+        <!-- Drawable used to draw the right part of the strip underneath the tabs. -->
+        <attr name="stripRight" format="reference" />
     </declare-styleable>
     <declare-styleable name="TextAppearance">
         <!-- Text color. -->
@@ -3501,6 +3509,21 @@
     <!-- =============================== -->
     <eat-comment />
     
+    <!-- Use <code>device-admin</code> as the root tag of the XML resource that
+         describes a
+         {@link android.app.admin.DeviceAdminReceiver}, which is
+         referenced from its
+         {@link android.app.admin.DeviceAdminReceiver#DEVICE_ADMIN_META_DATA}
+         meta-data entry.  Described here are the attributes that can be
+         included in that tag. -->
+    <declare-styleable name="DeviceAdmin">
+        <!-- Control whether the admin is visible to the user, even when it
+             is not enabled.  This is true by default.  You may want to make
+             it false if your admin does not make sense to be turned on
+             unless some explicit action happens in your app. -->
+        <attr name="visible" />
+    </declare-styleable>
+
     <!-- Use <code>wallpaper</code> as the root tag of the XML resource that
          describes an
          {@link android.service.wallpaper.WallpaperService}, which is
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 1e11a99..02961f0 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -83,9 +83,17 @@
     </string-array>
 
     <!-- Dhcp range (min, max) to use for tethering purposes -->
-    <string-array name="config_tether_dhcp_range">
+    <string-array translatable="false" name="config_tether_dhcp_range">
     </string-array>
 
+    <!-- Regex array of allowable upstream ifaces for tethering - for example if you want
+         tethering on a new interface called "foo2" add <item>"foo\\d"</item> to the array -->
+    <string-array translatable="false" name="config_tether_upstream_regexs">
+    </string-array>
+
+    <!-- Boolean indicating if we require the use of DUN on mobile for tethering -->
+    <bool translatable="false" name="config_tether_dun_required">true</bool>
+
     <!-- Flag indicating whether the keyguard should be bypassed when
          the slider is open.  This can be set or unset depending how easily
          the slider can be opened (for example, in a pocket or purse). -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 5da8e85..36a8f5b 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1232,6 +1232,9 @@
   <public type="attr" name="webTextViewStyle" id="0x010102b9" />
   <public type="attr" name="overscrollMode" id="0x010102ba" />
   <public type="attr" name="restoreAnyVersion" id="0x010102bb" />
+  <public type="attr" name="stripLeft" id="0x010102bc" />
+  <public type="attr" name="stripRight" id="0x010102bd" />
+  <public type="attr" name="stripEnabled" id="0x010102be" />
 
   <public type="anim" name="cycle_interpolator" id="0x010a000c" />
     
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index b791bf8..35ea0cc 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -790,7 +790,7 @@
     <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permdesc_writeCalendar">Allows an application to add or change the 
         events on your calendar, which may send email to guests. Malicious applications can use this 
-	to erase or modify your calendar events or to send email to guests.</string>
+        to erase or modify your calendar events or to send email to guests.</string>
 
     <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
     <string name="permlab_accessMockLocation">mock location sources for testing</string>
@@ -1822,17 +1822,6 @@
     <!-- Appened to express the value is this unit of time. -->
     <string name="years">years</string>
 
-    <!-- Calendar spinner item, to select that an event recurs every weekday. -->
-    <string name="every_weekday">"Every weekday (Mon\u2013Fri)"</string>
-    <!-- Calendar spinner item, to select that an event recurs every day. -->
-    <string name="daily">Daily</string>
-    <!-- Calendar spinner item, to select that an event recurs every week on a particular day of the week. -->
-    <string name="weekly">"Weekly on <xliff:g id="day">%s</xliff:g>"</string>
-    <!-- Calendar spinner item, to select that an event recurs every month. -->
-    <string name="monthly">Monthly</string>
-    <!-- Calendar spinner item, to select that an event recurs every year. -->
-    <string name="yearly">Yearly</string>
-
 
     <!-- Title for error alert when a video cannot be played.  it can be used by any app. -->
     <string name="VideoView_error_title">Cannot play video</string>
@@ -2047,9 +2036,6 @@
     <!-- When installing an application, the less-dangerous permissions are hidden.  This is the text to show those. -->
     <string name="perms_show_all"><b>Show all</b></string>
 
-    <!-- Shown when there is content loading from the internet into a dialog. -->
-    <string name="googlewebcontenthelper_loading">Loading\u2026</string>
-
     <!-- USB storage dialog strings -->
     <!-- This is the title for the activity's window. -->
     <string name="usb_storage_activity_title">USB Mass Storage</string>
@@ -2067,7 +2053,6 @@
     <!-- See USB_STORAGE. This is the message. -->
     <string name="usb_storage_notification_message">Select to copy files to/from your computer.</string>
 
-
     <!-- USB_STORAGE_STOP: While USB storage is enabled, we show a notification dialog asking if he wants to stop. This is the title -->
     <string name="usb_storage_stop_notification_title">Turn off USB storage</string>
     <!-- See USB_STORAGE. This is the message. -->
@@ -2084,6 +2069,15 @@
     <!-- See USB_STORAGE_STOP_DIALOG.  If there was an error stopping, this is the text. -->
     <string name="usb_storage_stop_error_message">There was a problem turning off USB storage. Check to make sure you have unmounted the USB host, then try again.</string>
 
+    <!-- USB_STORAGE_KILL_STORAGE_USERS dialog  -->
+    <string name="dlg_confirm_kill_storage_users_title">Enable Mass Storage</string>
+    <!-- USB_STORAGE_KILL_STORAGE_USERS dialog message text -->
+    <string name="dlg_confirm_kill_storage_users_text">Some processes accessing data on sdcard will be killed. Do you want to continue?</string>
+    <!-- USB_STORAGE_ERROR dialog  dialog-->
+    <string name="dlg_error_title">UMS operation failed</string>
+    <!-- USB_STORAGE_ERROR dialog  ok button-->
+    <string name="dlg_ok">OK</string>
+
     <!-- External media format dialog strings -->
     <!-- This is the label for the activity, and should never be visible to the user. -->
     <!-- See EXTMEDIA_FORMAT.  EXTMEDIA_FORMAT_DIALOG:  After the user selects the notification, a dialog is shown asking if he wants to format the SD card.  This is the title. -->
@@ -2282,6 +2276,6 @@
     <!-- Strings for car mode notification -->
     <!-- Shown when car mode is enabled -->
     <string name="car_mode_disable_notification_title">Car mode enabled</string>
-    <string name="car_mode_disable_notification_message">Select to disable car mode.</string>
+    <string name="car_mode_disable_notification_message">Select to exit car mode.</string>
 
 </resources>
diff --git a/core/tests/coretests/src/android/content/ObserverNodeTest.java b/core/tests/coretests/src/android/content/ObserverNodeTest.java
index 68cc75b..736c759 100644
--- a/core/tests/coretests/src/android/content/ObserverNodeTest.java
+++ b/core/tests/coretests/src/android/content/ObserverNodeTest.java
@@ -24,50 +24,49 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.test.AndroidTestCase;
-import android.util.Log;
 
-public class ObserverNodeTest extends AndroidTestCase {   
+public class ObserverNodeTest extends AndroidTestCase {
     static class TestObserver  extends ContentObserver {
         public TestObserver() {
             super(new Handler());
         }
     }
-    
+
     public void testUri() {
         ObserverNode root = new ObserverNode("");
         Uri[] uris = new Uri[] {
             Uri.parse("content://c/a/"),
             Uri.parse("content://c/"),
-            Uri.parse("content://x/"), 
+            Uri.parse("content://x/"),
             Uri.parse("content://c/b/"),
             Uri.parse("content://c/a/a1/1/"),
             Uri.parse("content://c/a/a1/2/"),
             Uri.parse("content://c/b/1/"),
             Uri.parse("content://c/b/2/"),
         };
-        
+
         int[] nums = new int[] {4, 7, 1, 4, 2, 2, 3, 3};
-        
+
         // special case
-        root.addObserver(uris[0], new TestObserver().getContentObserver(), false);
+        root.addObserverLocked(uris[0], new TestObserver().getContentObserver(), false, root);
         for(int i = 1; i < uris.length; i++) {
-            root.addObserver(uris[i], new TestObserver().getContentObserver(), true);
+            root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), true, root);
         }
-        
+
         ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
-        
+
         for (int i = nums.length - 1; i >=0; --i) {
-            root.collectObservers(uris[i], 0, null, false, calls);
+            root.collectObserversLocked(uris[i], 0, null, false, calls);
             assertEquals(nums[i], calls.size());
             calls.clear();
         }
     }
-    
+
     public void testUriNotNotify() {
         ObserverNode root = new ObserverNode("");
         Uri[] uris = new Uri[] {
             Uri.parse("content://c/"),
-            Uri.parse("content://x/"), 
+            Uri.parse("content://x/"),
             Uri.parse("content://c/a/"),
             Uri.parse("content://c/b/"),
             Uri.parse("content://c/a/1/"),
@@ -76,15 +75,15 @@
             Uri.parse("content://c/b/2/"),
         };
         int[] nums = new int[] {7, 1, 3, 3, 1, 1, 1, 1};
-        
+
         for(int i = 0; i < uris.length; i++) {
-            root.addObserver(uris[i], new TestObserver().getContentObserver(), false);
+            root.addObserverLocked(uris[i], new TestObserver().getContentObserver(), false, root);
         }
-        
+
         ArrayList<ObserverCall> calls = new ArrayList<ObserverCall>();
-        
+
         for (int i = uris.length - 1; i >=0; --i) {
-            root.collectObservers(uris[i], 0, null, false, calls);        
+            root.collectObserversLocked(uris[i], 0, null, false, calls);
             assertEquals(nums[i], calls.size());
             calls.clear();
         }
diff --git a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
index e43031c..ab142c9 100644
--- a/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
+++ b/core/tests/coretests/src/android/database/DatabaseGeneralTest.java
@@ -1009,4 +1009,24 @@
          * mDatabase.close() in tearDown() should release it.
          */
     }
+
+    @MediumTest
+    public void testSemicolonsInStatements() throws Exception {
+        mDatabase.execSQL("CREATE TABLE pragma_test (" +
+                "i INTEGER DEFAULT 1234, " +
+                "j INTEGER, " +
+                "s TEXT DEFAULT 'hello', " +
+                "t TEXT, " +
+                "'select' TEXT DEFAULT \"hello\")");
+        try {
+            // ending the sql statement with  semicolons shouldn't be a problem.
+            Cursor cur = mDatabase.rawQuery("PRAGMA database_list;", null);
+            cur.close();
+            // two semicolons in the statement shouldn't be a problem.
+            cur = mDatabase.rawQuery("PRAGMA database_list;;", null);
+            cur.close();
+        } catch (Throwable t) {
+            fail("unexpected, of course");
+        }
+    }
 }
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index 7511ec1..1f58a2c 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -26,6 +26,11 @@
 
 /**
  * Tests StaticLayout vertical metrics behavior.
+ * 
+ * Requires disabling access checks in the vm since this calls package-private
+ * APIs.
+ * 
+ * @Suppress
  */
 public class StaticLayoutTest extends TestCase {
 
@@ -33,7 +38,7 @@
      * Basic test showing expected behavior and relationship between font
      * metrics and line metrics.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters1() {
         LayoutBuilder b = builder();
         FontMetricsInt fmi = b.paint.getFontMetricsInt();
@@ -59,7 +64,7 @@
      * Basic test showing effect of includePad = true with 1 line.
      * Top and bottom padding are affected, as is the line descent and height.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters2() {
         LayoutBuilder b = builder()
             .setIncludePad(true);
@@ -74,7 +79,7 @@
      * Basic test showing effect of includePad = true wrapping to 2 lines.
      * Ascent of top line and descent of bottom line are affected.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters3() {
         LayoutBuilder b = builder()
             .setIncludePad(true)
@@ -91,7 +96,7 @@
      * Basic test showing effect of includePad = true wrapping to 3 lines.
      * First line ascent is top, bottom line descent is bottom.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters4() {
         LayoutBuilder b = builder()
             .setText("This is a longer test")
@@ -111,7 +116,7 @@
      * large text. See effect of leading. Currently, we don't expect there to
      * even be non-zero leading.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters5() {
         LayoutBuilder b = builder()
             .setText("This is a longer test")
@@ -138,7 +143,7 @@
      * Basic test showing effect of includePad = true, spacingAdd = 2, wrapping
      * to 3 lines.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters6() {
         int spacingAdd = 2; // int so expressions return int
         LayoutBuilder b = builder()
@@ -159,7 +164,7 @@
      * Basic test showing effect of includePad = true, spacingAdd = 2,
      * spacingMult = 1.5, wrapping to 3 lines.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters7() {
         LayoutBuilder b = builder()
             .setText("This is a longer test")
@@ -181,7 +186,7 @@
      * Basic test showing effect of includePad = true, spacingAdd = 0,
      * spacingMult = 0.8 when wrapping to 3 lines.
      */
-    @SmallTest
+    //@SmallTest
     public void testGetters8() {
         LayoutBuilder b = builder()
             .setText("This is a longer test")
diff --git a/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListBasicTest.java b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListBasicTest.java
index 22bbabc..e23b516 100644
--- a/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListBasicTest.java
+++ b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListBasicTest.java
@@ -16,14 +16,12 @@
 
 package android.widget.expandablelistview;
 
-import android.app.Instrumentation;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.util.ExpandableListScenario;
 import android.util.ListUtil;
 import android.util.ExpandableListScenario.MyGroup;
 import android.view.KeyEvent;
-import android.view.View;
 import android.widget.BaseExpandableListAdapter;
 import android.widget.ExpandableListAdapter;
 import android.widget.ExpandableListView;
@@ -32,7 +30,7 @@
 
 public class ExpandableListBasicTest extends ActivityInstrumentationTestCase2<ExpandableListSimple> {
     private ExpandableListScenario mActivity;
-    private ExpandableListView mListView;
+    private ExpandableListView mExpandableListView;
     private ExpandableListAdapter mAdapter;
     private ListUtil mListUtil;
     
@@ -45,28 +43,28 @@
         super.setUp();
         
         mActivity = getActivity();
-        mListView = mActivity.getExpandableListView();
-        mAdapter = mListView.getExpandableListAdapter();
-        mListUtil = new ListUtil(mListView, getInstrumentation());
+        mExpandableListView = mActivity.getExpandableListView();
+        mAdapter = mExpandableListView.getExpandableListAdapter();
+        mListUtil = new ListUtil(mExpandableListView, getInstrumentation());
     }
     
     @MediumTest
     public void testPreconditions() {
         assertNotNull(mActivity);
-        assertNotNull(mListView);
+        assertNotNull(mExpandableListView);
     }
     
     private int expandGroup(int numChildren, boolean atLeastOneChild) {
         final int groupPos = mActivity.findGroupWithNumChildren(numChildren, atLeastOneChild);
-        
         assertTrue("Could not find group to expand", groupPos >= 0);
-        assertFalse("Group is already expanded", mListView.isGroupExpanded(groupPos));
+
+        assertFalse("Group is already expanded", mExpandableListView.isGroupExpanded(groupPos));
         mListUtil.arrowScrollToSelectedPosition(groupPos);
         getInstrumentation().waitForIdleSync();
         sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
         getInstrumentation().waitForIdleSync();
-        assertTrue("Group did not expand", mListView.isGroupExpanded(groupPos));
-        
+        assertTrue("Group did not expand", mExpandableListView.isGroupExpanded(groupPos));
+
         return groupPos;
     }
 
@@ -81,7 +79,7 @@
         
         sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
         getInstrumentation().waitForIdleSync();
-        assertFalse("Group did not collapse", mListView.isGroupExpanded(groupPos));
+        assertFalse("Group did not collapse", mExpandableListView.isGroupExpanded(groupPos));
     }
     
     @MediumTest
@@ -92,13 +90,13 @@
         getInstrumentation().waitForIdleSync();
 
         // Ensure it expanded
-        assertTrue("Group did not expand", mListView.isGroupExpanded(0));
+        assertTrue("Group did not expand", mExpandableListView.isGroupExpanded(0));
         
         // Wait until that's all good
         getInstrumentation().waitForIdleSync();
         
         // Make sure it expanded
-        assertTrue("Group did not expand", mListView.isGroupExpanded(0));
+        assertTrue("Group did not expand", mExpandableListView.isGroupExpanded(0));
         
         // Insert a collapsed group in front of the one just expanded
         List<MyGroup> groups = mActivity.getGroups();
@@ -119,59 +117,28 @@
         
         // Make sure the right group is expanded
         assertTrue("The expanded state didn't stay with the proper group",
-                mListView.isGroupExpanded(1));
+                mExpandableListView.isGroupExpanded(1));
         assertFalse("The expanded state was given to the inserted group",
-                mListView.isGroupExpanded(0));
-    }
-
-    // Static utility method, shared by different ExpandableListView scenario.
-    static void checkGroupAndChildPositions(ExpandableListView elv,
-            ActivityInstrumentationTestCase2<? extends ExpandableListScenario> activityInstrumentation) {
-        // Add a position tester ContextMenu listener to the ExpandableListView
-        PositionTesterContextMenuListener menuListener = new PositionTesterContextMenuListener();
-        elv.setOnCreateContextMenuListener(menuListener);
-
-        ListUtil listUtil = new ListUtil(elv, activityInstrumentation.getInstrumentation());
-        ExpandableListAdapter adapter = elv.getExpandableListAdapter();
-        Instrumentation instrumentation = activityInstrumentation.getInstrumentation();
-
-        int index = elv.getHeaderViewsCount();
-        int groupCount = adapter.getGroupCount();
-        for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
-
-            // Expand group
-            assertFalse("Group is already expanded", elv.isGroupExpanded(groupIndex));
-            listUtil.arrowScrollToSelectedPosition(index);
-            instrumentation.waitForIdleSync();
-            activityInstrumentation.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-            activityInstrumentation.getInstrumentation().waitForIdleSync();
-            assertTrue("Group did not expand " + groupIndex, elv.isGroupExpanded(groupIndex));
-
-            // Check group index in context menu
-            menuListener.expectGroupContextMenu(groupIndex);
-            // Make sure the group is visible so that getChild finds it
-            listUtil.arrowScrollToSelectedPosition(index);
-            View groupChild = elv.getChildAt(index - elv.getFirstVisiblePosition());
-            elv.showContextMenuForChild(groupChild);
-            index++;
-
-            final int childrenCount = adapter.getChildrenCount(groupIndex);
-            for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
-                // Check child index in context menu
-                listUtil.arrowScrollToSelectedPosition(index);
-                menuListener.expectChildContextMenu(groupIndex, childIndex);
-                View child = elv.getChildAt(index - elv.getFirstVisiblePosition());
-                elv.showContextMenuForChild(child);
-                index++;
-            }
-        }
-
-        // Cleanup: remove the listener we added.
-        elv.setOnCreateContextMenuListener(null);
+                mExpandableListView.isGroupExpanded(0));
     }
 
     @MediumTest
-    public void testGroupChildPositions() {
-        checkGroupAndChildPositions(mListView, this);
+    public void testContextMenus() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testContextMenus();
+    }
+
+    @MediumTest
+    public void testConvertionBetweenFlatAndPacked() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testConvertionBetweenFlatAndPackedOnGroups();
+        tester.testConvertionBetweenFlatAndPackedOnChildren();
+    }
+
+    @MediumTest
+    public void testSelectedPosition() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testSelectedPositionOnGroups();
+        tester.testSelectedPositionOnChildren();
     }
 }
diff --git a/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListTester.java b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListTester.java
new file mode 100644
index 0000000..ad99ee8
--- /dev/null
+++ b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListTester.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2007 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.widget.expandablelistview;
+
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.ExpandableListScenario;
+import android.util.ListUtil;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ExpandableListAdapter;
+import android.widget.ExpandableListView;
+
+import junit.framework.Assert;
+
+public class ExpandableListTester {
+    private ExpandableListView mExpandableListView;
+    private ExpandableListAdapter mAdapter;
+    private ListUtil mListUtil;
+
+    private ActivityInstrumentationTestCase2<? extends ExpandableListScenario>
+        mActivityInstrumentation;
+
+    Instrumentation mInstrumentation;
+
+    public ExpandableListTester(
+            ExpandableListView expandableListView,
+            ActivityInstrumentationTestCase2<? extends ExpandableListScenario>
+            activityInstrumentation) {
+        mExpandableListView = expandableListView;
+        Instrumentation instrumentation = activityInstrumentation.getInstrumentation();
+        mListUtil = new ListUtil(mExpandableListView, instrumentation);
+        mAdapter = mExpandableListView.getExpandableListAdapter();
+        mActivityInstrumentation = activityInstrumentation;
+        mInstrumentation = mActivityInstrumentation.getInstrumentation();
+    }
+
+    private void expandGroup(final int groupIndex, int flatPosition) {
+        Assert.assertFalse("Group is already expanded", mExpandableListView
+                .isGroupExpanded(groupIndex));
+        mListUtil.arrowScrollToSelectedPosition(flatPosition);
+        mInstrumentation.waitForIdleSync();
+        mActivityInstrumentation.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        mActivityInstrumentation.getInstrumentation().waitForIdleSync();
+        Assert.assertTrue("Group did not expand " + groupIndex, 
+                mExpandableListView.isGroupExpanded(groupIndex));
+    }
+
+    void testContextMenus() {
+        // Add a position tester ContextMenu listener to the ExpandableListView
+        PositionTesterContextMenuListener menuListener = new PositionTesterContextMenuListener();
+        mExpandableListView.setOnCreateContextMenuListener(menuListener);
+
+        int index = 0;
+
+        // Scrolling on header elements should trigger an AdapterContextMenu
+        for (int i=0; i<mExpandableListView.getHeaderViewsCount(); i++) {
+            // Check group index in context menu
+            menuListener.expectAdapterContextMenu(i);
+            // Make sure the group is visible so that getChild finds it
+            mListUtil.arrowScrollToSelectedPosition(index);
+            View headerChild = mExpandableListView.getChildAt(index
+                    - mExpandableListView.getFirstVisiblePosition());
+            mExpandableListView.showContextMenuForChild(headerChild);
+            index++;
+        }
+
+        int groupCount = mAdapter.getGroupCount();
+        for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
+
+            // Expand group
+            expandGroup(groupIndex, index);
+
+            // Check group index in context menu
+            menuListener.expectGroupContextMenu(groupIndex);
+            // Make sure the group is visible so that getChild finds it
+            mListUtil.arrowScrollToSelectedPosition(index);
+            View groupChild = mExpandableListView.getChildAt(index
+                    - mExpandableListView.getFirstVisiblePosition());
+            mExpandableListView.showContextMenuForChild(groupChild);
+            index++;
+
+            final int childrenCount = mAdapter.getChildrenCount(groupIndex);
+            for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
+                // Check child index in context menu
+                mListUtil.arrowScrollToSelectedPosition(index);
+                menuListener.expectChildContextMenu(groupIndex, childIndex);
+                View child = mExpandableListView.getChildAt(index
+                        - mExpandableListView.getFirstVisiblePosition());
+                mExpandableListView.showContextMenuForChild(child);
+                index++;
+            }
+        }
+
+        // Scrolling on footer elements should trigger an AdapterContextMenu
+        for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
+            // Check group index in context menu
+            menuListener.expectAdapterContextMenu(index);
+            // Make sure the group is visible so that getChild finds it
+            mListUtil.arrowScrollToSelectedPosition(index);
+            View footerChild = mExpandableListView.getChildAt(index
+                    - mExpandableListView.getFirstVisiblePosition());
+            mExpandableListView.showContextMenuForChild(footerChild);
+            index++;
+        }
+
+        // Cleanup: remove the listener we added.
+        mExpandableListView.setOnCreateContextMenuListener(null);
+    }
+
+    private int expandAGroup() {
+        final int groupIndex = 2;
+        final int headerCount = mExpandableListView.getHeaderViewsCount();
+        Assert.assertTrue("Not enough groups", groupIndex < mAdapter.getGroupCount());
+        expandGroup(groupIndex, groupIndex + headerCount);
+        return groupIndex;
+    }
+
+    // This method assumes that NO group is expanded when called
+    void testConvertionBetweenFlatAndPackedOnGroups() {
+        final int headerCount = mExpandableListView.getHeaderViewsCount();
+
+        for (int i=0; i<headerCount; i++) {
+            Assert.assertEquals("Non NULL position for header item",
+                    ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                    mExpandableListView.getExpandableListPosition(i));
+        }
+
+        // Test all (non expanded) groups
+        final int groupCount = mAdapter.getGroupCount();
+        for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
+            int expectedFlatPosition = headerCount + groupIndex;
+            long packedPositionForGroup = ExpandableListView.getPackedPositionForGroup(groupIndex);
+            Assert.assertEquals("Group not found at flat position " + expectedFlatPosition,
+                    packedPositionForGroup,
+                    mExpandableListView.getExpandableListPosition(expectedFlatPosition));
+
+            Assert.assertEquals("Wrong flat position for group " + groupIndex,
+                    expectedFlatPosition,
+                    mExpandableListView.getFlatListPosition(packedPositionForGroup));
+        }
+
+        for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
+            Assert.assertEquals("Non NULL position for header item",
+                    ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                    mExpandableListView.getExpandableListPosition(headerCount + groupCount + i));
+        }
+    }
+
+    // This method assumes that NO group is expanded when called
+    void testConvertionBetweenFlatAndPackedOnChildren() {
+        // Test with an expanded group
+        final int headerCount = mExpandableListView.getHeaderViewsCount();
+        final int groupIndex = expandAGroup();
+
+        final int childrenCount = mAdapter.getChildrenCount(groupIndex);
+        for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
+            int expectedFlatPosition = headerCount + groupIndex + 1 + childIndex;
+            long childPos = ExpandableListView.getPackedPositionForChild(groupIndex, childIndex);
+
+            Assert.assertEquals("Wrong flat position for child ",
+                    childPos,
+                    mExpandableListView.getExpandableListPosition(expectedFlatPosition));
+
+            Assert.assertEquals("Wrong flat position for child ",
+                    expectedFlatPosition,
+                    mExpandableListView.getFlatListPosition(childPos));
+        }
+    }
+
+    // This method assumes that NO group is expanded when called
+    void testSelectedPositionOnGroups() {
+        int index = 0;
+
+        // Scrolling on header elements should not give a valid selected position.
+        for (int i=0; i<mExpandableListView.getHeaderViewsCount(); i++) {
+            mListUtil.arrowScrollToSelectedPosition(index);
+            Assert.assertEquals("Header item is selected",
+                    ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                    mExpandableListView.getSelectedPosition());
+            index++;
+        }
+
+        // Check selection on group items
+        final int groupCount = mAdapter.getGroupCount();
+        for (int groupIndex = 0; groupIndex < groupCount; groupIndex++) {
+            mListUtil.arrowScrollToSelectedPosition(index);
+            Assert.assertEquals("Group item is not selected",
+                    ExpandableListView.getPackedPositionForGroup(groupIndex),
+                    mExpandableListView.getSelectedPosition());
+            index++;
+        }
+
+        // Scrolling on footer elements should not give a valid selected position.
+        for (int i=0; i<mExpandableListView.getFooterViewsCount(); i++) {
+            mListUtil.arrowScrollToSelectedPosition(index);
+            Assert.assertEquals("Footer item is selected",
+                    ExpandableListView.PACKED_POSITION_VALUE_NULL,
+                    mExpandableListView.getSelectedPosition());
+            index++;
+        }
+    }
+
+    // This method assumes that NO group is expanded when called
+    void testSelectedPositionOnChildren() {
+        // Test with an expanded group
+        final int headerCount = mExpandableListView.getHeaderViewsCount();
+        final int groupIndex = expandAGroup();
+
+        final int childrenCount = mAdapter.getChildrenCount(groupIndex);
+        for (int childIndex = 0; childIndex < childrenCount; childIndex++) {
+            int childFlatPosition = headerCount + groupIndex + 1 + childIndex;
+            mListUtil.arrowScrollToSelectedPosition(childFlatPosition);
+            Assert.assertEquals("Group item is not selected",
+                    ExpandableListView.getPackedPositionForChild(groupIndex, childIndex),
+                    mExpandableListView.getSelectedPosition());
+        }
+    }
+}
diff --git a/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListWithHeadersTest.java b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListWithHeadersTest.java
index ca07e6b..64a0fff 100644
--- a/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListWithHeadersTest.java
+++ b/core/tests/coretests/src/android/widget/expandablelistview/ExpandableListWithHeadersTest.java
@@ -63,7 +63,22 @@
     }
 
     @MediumTest
-    public void testGroupChildPositions() {
-        ExpandableListBasicTest.checkGroupAndChildPositions(mExpandableListView, this);
+    public void testContextMenus() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testContextMenus();
+    }
+
+    @MediumTest
+    public void testConvertionBetweenFlatAndPacked() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testConvertionBetweenFlatAndPackedOnGroups();
+        tester.testConvertionBetweenFlatAndPackedOnChildren();
+    }
+
+    @MediumTest
+    public void testSelectedPosition() {
+        ExpandableListTester tester = new ExpandableListTester(mExpandableListView, this);
+        tester.testSelectedPositionOnGroups();
+        tester.testSelectedPositionOnChildren();
     }
 }
diff --git a/core/tests/coretests/src/android/widget/expandablelistview/PositionTesterContextMenuListener.java b/core/tests/coretests/src/android/widget/expandablelistview/PositionTesterContextMenuListener.java
index b96bca1..7036c30 100644
--- a/core/tests/coretests/src/android/widget/expandablelistview/PositionTesterContextMenuListener.java
+++ b/core/tests/coretests/src/android/widget/expandablelistview/PositionTesterContextMenuListener.java
@@ -5,6 +5,7 @@
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.View.OnCreateContextMenuListener;
 import android.widget.ExpandableListView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
 
 import junit.framework.Assert;
 
@@ -12,6 +13,8 @@
 
     private int groupPosition, childPosition;
 
+    // Fake constant to store in testType a test type specific to headers and footers
+    private static final int ADAPTER_TYPE = -1;
     private int testType; // as returned by getPackedPositionType
 
     public void expectGroupContextMenu(int groupPosition) {
@@ -25,19 +28,36 @@
         testType = ExpandableListView.PACKED_POSITION_TYPE_CHILD;
     }
 
+    public void expectAdapterContextMenu(int flatPosition) {
+        this.groupPosition = flatPosition;
+        testType = ADAPTER_TYPE;
+    }
+
     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-        ExpandableListView.ExpandableListContextMenuInfo elvMenuInfo = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
-        long packedPosition = elvMenuInfo.packedPosition;
+        if (testType == ADAPTER_TYPE) {
+            Assert.assertTrue("MenuInfo is not an AdapterContextMenuInfo",
+                    menuInfo instanceof AdapterContextMenuInfo);
+            AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo) menuInfo;
+            Assert.assertEquals("Wrong flat position",
+                    groupPosition,
+                    adapterContextMenuInfo.position);
+        } else {
+            Assert.assertTrue("MenuInfo is not an ExpandableListContextMenuInfo",
+                    menuInfo instanceof ExpandableListView.ExpandableListContextMenuInfo);
+            ExpandableListView.ExpandableListContextMenuInfo elvMenuInfo =
+                (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
+            long packedPosition = elvMenuInfo.packedPosition;
 
-        int packedPositionType = ExpandableListView.getPackedPositionType(packedPosition);
-        Assert.assertEquals("Wrong packed position type", testType, packedPositionType);
+            int packedPositionType = ExpandableListView.getPackedPositionType(packedPosition);
+            Assert.assertEquals("Wrong packed position type", testType, packedPositionType);
 
-        int packedPositionGroup = ExpandableListView.getPackedPositionGroup(packedPosition);
-        Assert.assertEquals("Wrong group position", groupPosition, packedPositionGroup);
+            int packedPositionGroup = ExpandableListView.getPackedPositionGroup(packedPosition);
+            Assert.assertEquals("Wrong group position", groupPosition, packedPositionGroup);
 
-        if (testType == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
-            int packedPositionChild = ExpandableListView.getPackedPositionChild(packedPosition);
-            Assert.assertEquals("Wrong child position", childPosition, packedPositionChild);
+            if (testType == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
+                int packedPosChild = ExpandableListView.getPackedPositionChild(packedPosition);
+                Assert.assertEquals("Wrong child position", childPosition, packedPosChild);
+            }
         }
     }
 }
diff --git a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
index 93bddb0..b9051e9 100644
--- a/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
+++ b/core/tests/coretests/src/android/widget/listview/focus/ListWithEditTextHeaderTest.java
@@ -16,21 +16,21 @@
 
 package android.widget.listview.focus;
 
-import android.test.ActivityInstrumentationTestCase;
+import android.test.ActivityInstrumentationTestCase2;
 import android.test.FlakyTest;
+import android.test.TouchUtils;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.MediumTest;
-import android.test.TouchUtils;
 import android.view.KeyEvent;
 import android.widget.AbsListView;
 import android.widget.ListView;
 import android.widget.listview.ListWithEditTextHeader;
 
-public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase<ListWithEditTextHeader> {
+public class ListWithEditTextHeaderTest extends ActivityInstrumentationTestCase2<ListWithEditTextHeader> {
     private ListView mListView;
 
     public ListWithEditTextHeaderTest() {
-        super("com.android.frameworks.coretests", ListWithEditTextHeader.class);
+        super(ListWithEditTextHeader.class);
     }
 
     @Override
@@ -44,15 +44,15 @@
         assertTrue("listview.getItemsCanFocus()", mListView.getItemsCanFocus());
         assertFalse("out of touch-mode", mListView.isInTouchMode());
         assertEquals("header view count", 1, mListView.getHeaderViewsCount());
-        assertTrue("header has focus", mListView.getChildAt(0).isFocused());
+        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
     }
 
     @FlakyTest(tolerance=2)
     @LargeTest
     public void testClickingHeaderKeepsFocus() {
         TouchUtils.clickView(this, mListView.getChildAt(0));
-        assertTrue("header has focus", mListView.getChildAt(0).isFocused());
-        assertEquals("nothing selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
+        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
+        assertEquals("something is selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
     }
 
     @LargeTest
@@ -60,7 +60,7 @@
         sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
         assertEquals("selected position", 1, mListView.getSelectedItemPosition());
         TouchUtils.clickView(this, mListView.getChildAt(0));
-        assertTrue("header has focus", mListView.getChildAt(0).isFocused());        
-        assertEquals("nothing selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
+        assertTrue("header does not have focus", mListView.getChildAt(0).isFocused());
+        assertEquals("something is selected", AbsListView.INVALID_POSITION, mListView.getSelectedItemPosition());
     }
 }
diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk
index b7491b2..4c40646 100644
--- a/data/fonts/Android.mk
+++ b/data/fonts/Android.mk
@@ -18,6 +18,9 @@
 copy_from :=                \
     DroidSans.ttf           \
     DroidSans-Bold.ttf      \
+    DroidSansArabic.ttf     \
+    DroidSansHebrew.ttf     \
+    DroidSansThai.ttf       \
     DroidSerif-Regular.ttf  \
     DroidSerif-Bold.ttf     \
     DroidSerif-Italic.ttf   \
diff --git a/data/fonts/DroidSansArabic.ttf b/data/fonts/DroidSansArabic.ttf
new file mode 100644
index 0000000..c179bc6
--- /dev/null
+++ b/data/fonts/DroidSansArabic.ttf
Binary files differ
diff --git a/data/fonts/DroidSansHebrew.ttf b/data/fonts/DroidSansHebrew.ttf
new file mode 100644
index 0000000..8cc670d
--- /dev/null
+++ b/data/fonts/DroidSansHebrew.ttf
Binary files differ
diff --git a/data/fonts/DroidSansThai.ttf b/data/fonts/DroidSansThai.ttf
new file mode 100644
index 0000000..f849bae
--- /dev/null
+++ b/data/fonts/DroidSansThai.ttf
Binary files differ
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index e5cf38e..17c0778 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -32,6 +32,7 @@
  **/
 public class Allocation extends BaseObj {
     Type mType;
+    Bitmap mBitmap;
 
     Allocation(int id, RenderScript rs, Type t) {
         super(rs);
@@ -45,7 +46,12 @@
 
     public void uploadToTexture(int baseMipLevel) {
         mRS.validate();
-        mRS.nAllocationUploadToTexture(mID, baseMipLevel);
+        mRS.nAllocationUploadToTexture(mID, false, baseMipLevel);
+    }
+
+    public void uploadToTexture(boolean genMips, int baseMipLevel) {
+        mRS.validate();
+        mRS.nAllocationUploadToTexture(mID, genMips, baseMipLevel);
     }
 
     public void uploadToBufferObject() {
@@ -257,15 +263,58 @@
         return new Allocation(id, rs, t);
     }
 
+    static private Element elementFromBitmap(RenderScript rs, Bitmap b) {
+        final Bitmap.Config bc = b.getConfig();
+        if (bc == Bitmap.Config.ALPHA_8) {
+            return Element.A_8(rs);
+        }
+        if (bc == Bitmap.Config.ARGB_4444) {
+            return Element.RGBA_4444(rs);
+        }
+        if (bc == Bitmap.Config.ARGB_8888) {
+            return Element.RGBA_8888(rs);
+        }
+        if (bc == Bitmap.Config.RGB_565) {
+            return Element.RGB_565(rs);
+        }
+        throw new IllegalStateException("Bad bitmap type.");
+    }
+
+    static private Type typeFromBitmap(RenderScript rs, Bitmap b) {
+        Element e = elementFromBitmap(rs, b);
+        Type.Builder tb = new Type.Builder(rs, e);
+        tb.add(Dimension.X, b.getWidth());
+        tb.add(Dimension.Y, b.getHeight());
+        return tb.create();
+    }
+
     static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
         throws IllegalArgumentException {
 
         rs.validate();
+        Type t = typeFromBitmap(rs, b);
+
         int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
         if(id == 0) {
             throw new IllegalStateException("Load failed.");
         }
-        return new Allocation(id, rs, null);
+        return new Allocation(id, rs, t);
+    }
+
+    static public Allocation createBitmapRef(RenderScript rs, Bitmap b)
+        throws IllegalArgumentException {
+
+        rs.validate();
+        Type t = typeFromBitmap(rs, b);
+
+        int id = rs.nAllocationCreateBitmapRef(t.getID(), b);
+        if(id == 0) {
+            throw new IllegalStateException("Load failed.");
+        }
+
+        Allocation a = new Allocation(id, rs, t);
+        a.mBitmap = b;
+        return a;
     }
 
     static Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 84b1a70..a935243 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -98,10 +98,11 @@
 
     native int  nAllocationCreateTyped(int type);
     native int  nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp);
+    native int  nAllocationCreateBitmapRef(int type, Bitmap bmp);
     native int  nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
     native int  nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream);
 
-    native void nAllocationUploadToTexture(int alloc, int baseMioLevel);
+    native void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel);
     native void nAllocationUploadToBufferObject(int alloc);
 
     native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes);
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 0ffdf71..d8e0393 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -444,11 +444,11 @@
 }
 
 static void
-nAllocationUploadToTexture(JNIEnv *_env, jobject _this, jint a, jint mip)
+nAllocationUploadToTexture(JNIEnv *_env, jobject _this, jint a, jboolean genMip, jint mip)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nAllocationUploadToTexture, con(%p), a(%p), mip(%i)", con, (RsAllocation)a, mip);
-    rsAllocationUploadToTexture(con, (RsAllocation)a, mip);
+    LOG_API("nAllocationUploadToTexture, con(%p), a(%p), genMip(%i), mip(%i)", con, (RsAllocation)a, genMip, mip);
+    rsAllocationUploadToTexture(con, (RsAllocation)a, genMip, mip);
 }
 
 static void
@@ -501,6 +501,26 @@
     return 0;
 }
 
+static void ReleaseBitmapCallback(void *bmp)
+{
+    SkBitmap const * nativeBitmap = (SkBitmap const *)bmp;
+    nativeBitmap->unlockPixels();
+}
+
+static int
+nAllocationCreateBitmapRef(JNIEnv *_env, jobject _this, jint type, jobject jbitmap)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    SkBitmap * nativeBitmap =
+            (SkBitmap *)_env->GetIntField(jbitmap, gNativeBitmapID);
+
+
+    nativeBitmap->lockPixels();
+    void* ptr = nativeBitmap->getPixels();
+    jint id = (jint)rsAllocationCreateBitmapRef(con, (RsType)type, ptr, nativeBitmap, ReleaseBitmapCallback);
+    return id;
+}
+
 static int
 nAllocationCreateFromAssetStream(JNIEnv *_env, jobject _this, jint dstFmt, jboolean genMips, jint native_asset)
 {
@@ -1367,9 +1387,10 @@
 
 {"nAllocationCreateTyped",         "(I)I",                                 (void*)nAllocationCreateTyped },
 {"nAllocationCreateFromBitmap",    "(IZLandroid/graphics/Bitmap;)I",       (void*)nAllocationCreateFromBitmap },
+{"nAllocationCreateBitmapRef",     "(ILandroid/graphics/Bitmap;)I",        (void*)nAllocationCreateBitmapRef },
 {"nAllocationCreateFromBitmapBoxed","(IZLandroid/graphics/Bitmap;)I",      (void*)nAllocationCreateFromBitmapBoxed },
 {"nAllocationCreateFromAssetStream","(IZI)I",                              (void*)nAllocationCreateFromAssetStream },
-{"nAllocationUploadToTexture",     "(II)V",                                (void*)nAllocationUploadToTexture },
+{"nAllocationUploadToTexture",     "(IZI)V",                               (void*)nAllocationUploadToTexture },
 {"nAllocationUploadToBufferObject","(I)V",                                 (void*)nAllocationUploadToBufferObject },
 {"nAllocationSubData1D",           "(III[II)V",                            (void*)nAllocationSubData1D_i },
 {"nAllocationSubData1D",           "(III[SI)V",                            (void*)nAllocationSubData1D_s },
diff --git a/include/camera/CameraParameters.h b/include/camera/CameraParameters.h
index 9df2695..752afc2 100644
--- a/include/camera/CameraParameters.h
+++ b/include/camera/CameraParameters.h
@@ -201,7 +201,29 @@
     // 0.3333, EV is -2.
     // Example value: "0.333333333" or "0.5". Read only.
     static const char KEY_EXPOSURE_COMPENSATION_STEP[];
-
+    // Current zoom value.
+    // Example value: "0" or "6". Read/write.
+    static const char KEY_ZOOM[];
+    // Maximum zoom value.
+    // Example value: "6". Read only.
+    static const char KEY_MAX_ZOOM[];
+    // The zoom ratios of all zoom values. The zoom ratio is in 1/100
+    // increments. Ex: a zoom of 3.2x is returned as 320. The number of list
+    // elements is KEY_MAX_ZOOM + 1. The first element is always 100. The last
+    // element is the zoom ratio of zoom value KEY_MAX_ZOOM.
+    // Example value: "100,150,200,250,300,350,400". Read only.
+    static const char KEY_ZOOM_RATIOS[];
+    // Whether zoom is supported. Zoom is supported if the value is "true". Zoom
+    // is not supported if the value is not "true" or the key does not exist.
+    // Example value: "true". Read only.
+    static const char KEY_ZOOM_SUPPORTED[];
+    // Whether if smooth zoom is supported. Smooth zoom is supported if the
+    // value is "true". It is not supported if the value is not "true" or the
+    // key does not exist.
+    // See CAMERA_CMD_START_SMOOTH_ZOOM, CAMERA_CMD_STOP_SMOOTH_ZOOM, and
+    // CAMERA_MSG_ZOOM in frameworks/base/include/camera/Camera.h.
+    // Example value: "true". Read only.
+    static const char KEY_SMOOTH_ZOOM_SUPPORTED[];
 
     // Values for white balance settings.
     static const char WHITE_BALANCE_AUTO[];
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h
index 622c596..92bc126 100644
--- a/include/media/AudioRecord.h
+++ b/include/media/AudioRecord.h
@@ -294,6 +294,13 @@
      */
             ssize_t     read(void* buffer, size_t size);
 
+    /* Return the amount of input frames lost in the audio driver since the last call of this function.
+     * Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call.
+     * Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers.
+     * Unit: the number of input audio frames
+     */
+            unsigned int  getInputFramesLost();
+
 private:
     /* copying audio tracks is not allowed */
                         AudioRecord(const AudioRecord& other);
@@ -348,6 +355,7 @@
     uint32_t                mUpdatePeriod;
     uint32_t                mFlags;
     uint32_t                mChannels;
+    audio_io_handle_t       mInput;
 };
 
 }; // namespace android
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index 42bb4df..d0ccc505 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -233,6 +233,7 @@
     // necessary to check returned status before using the returned values.
     static status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int stream = DEFAULT);
 
+    static unsigned int  getInputFramesLost(audio_io_handle_t ioHandle);
     //
     // AudioPolicyService interface
     //
diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h
index bddd23e..c147632 100644
--- a/include/media/IAudioFlinger.h
+++ b/include/media/IAudioFlinger.h
@@ -130,7 +130,10 @@
     virtual status_t setStreamOutput(uint32_t stream, int output) = 0;
 
     virtual status_t setVoiceVolume(float volume) = 0;
+
     virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output) = 0;
+
+    virtual unsigned int  getInputFramesLost(int ioHandle) = 0;
 };
 
 
diff --git a/include/surfaceflinger/ISurfaceFlingerClient.h b/include/surfaceflinger/ISurfaceFlingerClient.h
index 1fba162..d257645 100644
--- a/include/surfaceflinger/ISurfaceFlingerClient.h
+++ b/include/surfaceflinger/ISurfaceFlingerClient.h
@@ -61,6 +61,7 @@
 
     virtual sp<ISurface> createSurface( surface_data_t* data,
                                         int pid, 
+                                        const String8& name,
                                         DisplayID display,
                                         uint32_t w,
                                         uint32_t h,
diff --git a/include/surfaceflinger/SurfaceComposerClient.h b/include/surfaceflinger/SurfaceComposerClient.h
index 49e83c0..9d0f0cb 100644
--- a/include/surfaceflinger/SurfaceComposerClient.h
+++ b/include/surfaceflinger/SurfaceComposerClient.h
@@ -65,6 +65,7 @@
     //! Create a surface
     sp<SurfaceControl> createSurface(
             int pid,            // pid of the process the surface is for
+            const String8& name,// name of the surface
             DisplayID display,  // Display to create this surface on
             uint32_t w,         // width in pixel
             uint32_t h,         // height in pixel
@@ -72,6 +73,16 @@
             uint32_t flags = 0  // usage flags
     );
 
+    sp<SurfaceControl> createSurface(
+            int pid,            // pid of the process the surface is for
+            DisplayID display,  // Display to create this surface on
+            uint32_t w,         // width in pixel
+            uint32_t h,         // height in pixel
+            PixelFormat format, // pixel-format desired
+            uint32_t flags = 0  // usage flags
+    );
+
+
     // ------------------------------------------------------------------------
     // Composer parameters
     // All composer parameters must be changed within a transaction
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index cd657e8..cbcef4e 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -944,8 +944,9 @@
     enum {
         // uiMode bits for the mode type.
         MASK_UI_MODE_TYPE = 0x0f,
-        UI_MODE_TYPE_NORMAL = 0x00,
-        UI_MODE_TYPE_CAR = 0x01,
+        UI_MODE_TYPE_ANY = 0x00,
+        UI_MODE_TYPE_NORMAL = 0x01,
+        UI_MODE_TYPE_CAR = 0x02,
 
         // uiMode bits for the night switch.
         MASK_UI_MODE_NIGHT = 0x30,
@@ -1086,7 +1087,7 @@
             }
         }
 
-        if (screenConfig || o.screenConfig) {
+        if (screenLayout || o.screenLayout) {
             if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0) {
                 if (!(screenLayout & MASK_SCREENSIZE)) return false;
                 if (!(o.screenLayout & MASK_SCREENSIZE)) return true;
@@ -1102,7 +1103,7 @@
             if (!o.orientation) return true;
         }
 
-        if (screenConfig || o.screenConfig) {
+        if (uiMode || o.uiMode) {
             if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0) {
                 if (!(uiMode & MASK_UI_MODE_TYPE)) return false;
                 if (!(o.uiMode & MASK_UI_MODE_TYPE)) return true;
@@ -1203,7 +1204,7 @@
                 }
             }
 
-            if (screenConfig || o.screenConfig) {
+            if (screenLayout || o.screenLayout) {
                 if (((screenLayout^o.screenLayout) & MASK_SCREENSIZE) != 0
                         && (requested->screenLayout & MASK_SCREENSIZE)) {
                     return (screenLayout & MASK_SCREENSIZE);
@@ -1218,7 +1219,7 @@
                 return (orientation);
             }
 
-            if (screenConfig || o.screenConfig) {
+            if (uiMode || o.uiMode) {
                 if (((uiMode^o.uiMode) & MASK_UI_MODE_TYPE) != 0
                         && (requested->uiMode & MASK_UI_MODE_TYPE)) {
                     return (uiMode & MASK_UI_MODE_TYPE);
diff --git a/libs/audioflinger/AudioDumpInterface.cpp b/libs/audioflinger/AudioDumpInterface.cpp
index 30e2bc9..a018b4c 100644
--- a/libs/audioflinger/AudioDumpInterface.cpp
+++ b/libs/audioflinger/AudioDumpInterface.cpp
@@ -509,6 +509,12 @@
     return param.toString();
 }
 
+unsigned int AudioStreamInDump::getInputFramesLost() const
+{
+    if (mFinalStream != 0 ) return mFinalStream->getInputFramesLost();
+    return 0;
+}
+
 status_t AudioStreamInDump::dump(int fd, const Vector<String16>& args)
 {
     if (mFinalStream != 0 ) return mFinalStream->dump(fd, args);
diff --git a/libs/audioflinger/AudioDumpInterface.h b/libs/audioflinger/AudioDumpInterface.h
index 5b9a6b1..4c62b3e 100644
--- a/libs/audioflinger/AudioDumpInterface.h
+++ b/libs/audioflinger/AudioDumpInterface.h
@@ -94,6 +94,7 @@
     virtual status_t    standby();
     virtual status_t    setParameters(const String8& keyValuePairs);
     virtual String8     getParameters(const String8& keys);
+    virtual unsigned int  getInputFramesLost() const;
     virtual status_t    dump(int fd, const Vector<String16>& args);
     void                Close(void);
     AudioStreamIn*     finalStream() { return mFinalStream; }
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 9d52882..2269352 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -618,6 +618,21 @@
     return mAudioHardware->getInputBufferSize(sampleRate, format, channelCount);
 }
 
+unsigned int AudioFlinger::getInputFramesLost(int ioHandle)
+{
+    if (ioHandle == 0) {
+        return 0;
+    }
+
+    Mutex::Autolock _l(mLock);
+
+    RecordThread *recordThread = checkRecordThread_l(ioHandle);
+    if (recordThread != NULL) {
+        return recordThread->getInputFramesLost();
+    }
+    return 0;
+}
+
 status_t AudioFlinger::setVoiceVolume(float value)
 {
     // check calling permissions
@@ -3575,6 +3590,11 @@
     mRsmpInIndex = mFrameCount;
 }
 
+unsigned int AudioFlinger::RecordThread::getInputFramesLost()
+{
+    return mInput->getInputFramesLost();
+}
+
 // ----------------------------------------------------------------------------
 
 int AudioFlinger::openOutput(uint32_t *pDevices,
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 44da9ed..739ec33 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -108,6 +108,7 @@
     virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
 
     virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
+    virtual     unsigned int  getInputFramesLost(int ioHandle);
 
     virtual int openOutput(uint32_t *pDevices,
                                     uint32_t *pSamplingRate,
@@ -745,6 +746,7 @@
         virtual String8     getParameters(const String8& keys);
         virtual void        audioConfigChanged(int event, int param = 0);
                 void        readInputParameters();
+        virtual unsigned int  getInputFramesLost();
 
     private:
                 RecordThread();
diff --git a/libs/audioflinger/AudioHardwareGeneric.h b/libs/audioflinger/AudioHardwareGeneric.h
index 95c7ea3..aa4e78d 100644
--- a/libs/audioflinger/AudioHardwareGeneric.h
+++ b/libs/audioflinger/AudioHardwareGeneric.h
@@ -88,6 +88,7 @@
     virtual status_t    standby() { return NO_ERROR; }
     virtual status_t    setParameters(const String8& keyValuePairs);
     virtual String8     getParameters(const String8& keys);
+    virtual unsigned int  getInputFramesLost() const { return 0; }
 
 private:
     AudioHardwareGeneric *mAudioHardware;
diff --git a/libs/audioflinger/AudioHardwareStub.h b/libs/audioflinger/AudioHardwareStub.h
index 769ae3f..06a29de 100644
--- a/libs/audioflinger/AudioHardwareStub.h
+++ b/libs/audioflinger/AudioHardwareStub.h
@@ -57,6 +57,7 @@
     virtual status_t    standby() { return NO_ERROR; }
     virtual status_t    setParameters(const String8& keyValuePairs) { return NO_ERROR;}
     virtual String8     getParameters(const String8& keys);
+    virtual unsigned int  getInputFramesLost() const { return 0; }
 };
 
 class AudioHardwareStub : public  AudioHardwareBase
diff --git a/libs/camera/CameraParameters.cpp b/libs/camera/CameraParameters.cpp
index 8439e2b..cf4cbfa 100644
--- a/libs/camera/CameraParameters.cpp
+++ b/libs/camera/CameraParameters.cpp
@@ -63,6 +63,11 @@
 const char CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION[] = "max-exposure-compensation";
 const char CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION[] = "min-exposure-compensation";
 const char CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP[] = "exposure-compensation-step";
+const char CameraParameters::KEY_ZOOM[] = "zoom";
+const char CameraParameters::KEY_MAX_ZOOM[] = "max-zoom";
+const char CameraParameters::KEY_ZOOM_RATIOS[] = "zoom-ratios";
+const char CameraParameters::KEY_ZOOM_SUPPORTED[] = "zoom-supported";
+const char CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED[] = "smooth-zoom-supported";
 
 // Values for white balance settings.
 const char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 02667d8..cd8361c 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -46,6 +46,8 @@
 typedef void * RsProgramFragmentStore;
 typedef void * RsProgramRaster;
 
+typedef void (* RsBitmapCallback_t)(void *);
+
 enum RsDeviceParam {
     RS_DEVICE_PARAM_FORCE_SOFTWARE_GL,
     RS_DEVICE_PARAM_COUNT
@@ -200,8 +202,9 @@
     RS_PRIMITIVE_TRIANGLE_FAN
 };
 
-
+#ifndef NO_RS_FUNCS
 #include "rsgApiFuncDecl.h"
+#endif
 
 #ifdef __cplusplus
 };
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index 10e5285..4d97c0f 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -90,6 +90,14 @@
 	ret RsAllocation
 	}
 
+AllocationCreateBitmapRef {
+	param RsType type
+	param void * bmpPtr
+	param void * callbackData
+	param RsBitmapCallback_t callback
+	ret RsAllocation
+	}
+
 AllocationCreateFromBitmap {
 	param uint32_t width
 	param uint32_t height
@@ -113,6 +121,7 @@
 
 AllocationUploadToTexture {
 	param RsAllocation alloc
+	param bool genMipMaps
 	param uint32_t baseMipLevel
 	}
 
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index 1ae2317..4e8278d 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -17,6 +17,7 @@
 #include "rsContext.h"
 
 #include <GLES/gl.h>
+#include <GLES2/gl2.h>
 #include <GLES/glext.h>
 
 using namespace android;
@@ -24,6 +25,27 @@
 
 Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc)
 {
+    init(rsc, type);
+
+    mPtr = malloc(mType->getSizeBytes());
+    if (!mPtr) {
+        LOGE("Allocation::Allocation, alloc failure");
+    }
+}
+
+Allocation::Allocation(Context *rsc, const Type *type, void *bmp,
+                       void *callbackData, RsBitmapCallback_t callback)
+: ObjectBase(rsc)
+{
+    init(rsc, type);
+
+    mPtr = bmp;
+    mUserBitmapCallback = callback;
+    mUserBitmapCallbackData = callbackData;
+}
+
+void Allocation::init(Context *rsc, const Type *type)
+{
     mAllocFile = __FILE__;
     mAllocLine = __LINE__;
     mPtr = NULL;
@@ -42,17 +64,22 @@
     mBufferID = 0;
     mUploadDefered = false;
 
+    mUserBitmapCallback = NULL;
+    mUserBitmapCallbackData = NULL;
+
     mType.set(type);
     rsAssert(type);
-    mPtr = malloc(mType->getSizeBytes());
-    if (!mPtr) {
-        LOGE("Allocation::Allocation, alloc failure");
-    }
+
+    mPtr = NULL;
 }
 
 Allocation::~Allocation()
 {
-    free(mPtr);
+    if (mUserBitmapCallback != NULL) {
+        mUserBitmapCallback(mUserBitmapCallbackData);
+    } else {
+        free(mPtr);
+    }
     mPtr = NULL;
 
     if (mBufferID) {
@@ -88,12 +115,13 @@
     return false;
 }
 
-void Allocation::deferedUploadToTexture(const Context *rsc, uint32_t lodOffset)
+void Allocation::deferedUploadToTexture(const Context *rsc, bool genMipmap, uint32_t lodOffset)
 {
     rsAssert(lodOffset < mType->getLODCount());
     mIsTexture = true;
     mTextureLOD = lodOffset;
     mUploadDefered = true;
+    mTextureGenMipmap = !mType->getDimLOD() && genMipmap;
 }
 
 void Allocation::uploadToTexture(const Context *rsc)
@@ -138,6 +166,10 @@
                      adapt.getDimX(), adapt.getDimY(),
                      0, format, type, ptr);
     }
+    if (mTextureGenMipmap) {
+        glGenerateMipmap(GL_TEXTURE_2D);
+    }
+
 }
 
 void Allocation::deferedUploadToBufferObject(const Context *rsc)
@@ -316,10 +348,10 @@
     return rsi_AllocationCreateTyped(rsc, type);
 }
 
-void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, uint32_t baseMipLevel)
+void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel)
 {
     Allocation *alloc = static_cast<Allocation *>(va);
-    alloc->deferedUploadToTexture(rsc, baseMipLevel);
+    alloc->deferedUploadToTexture(rsc, genmip, baseMipLevel);
 }
 
 void rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va)
@@ -480,6 +512,14 @@
     return 0;
 }
 
+RsAllocation rsi_AllocationCreateBitmapRef(Context *rsc, RsType vtype,
+                                           void *bmp, void *callbackData, RsBitmapCallback_t callback)
+{
+    const Type * type = static_cast<const Type *>(vtype);
+    Allocation * alloc = new Allocation(rsc, type, bmp, callbackData, callback);
+    alloc->incUserRef();
+    return alloc;
+}
 
 RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, uint32_t w, uint32_t h, RsElement _dst, RsElement _src,  bool genMips, const void *data)
 {
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index f0b2122..516f8b7 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -29,11 +29,12 @@
 {
     // The graphics equilivent of malloc.  The allocation contains a structure of elements.
 
-
 public:
     // By policy this allocation will hold a pointer to the type
     // but will not destroy it on destruction.
     Allocation(Context *rsc, const Type *);
+    Allocation(Context *rsc, const Type *, void *bmp, void *callbackData, RsBitmapCallback_t callback);
+
     virtual ~Allocation();
 
     void setCpuWritable(bool);
@@ -46,7 +47,7 @@
     void * getPtr() const {return mPtr;}
     const Type * getType() const {return mType.get();}
 
-    void deferedUploadToTexture(const Context *rsc, uint32_t lodOffset);
+    void deferedUploadToTexture(const Context *rsc, bool genMipmap, uint32_t lodOffset);
     void uploadToTexture(const Context *rsc);
     uint32_t getTextureID() const {return mTextureID;}
 
@@ -82,6 +83,11 @@
 
     Vector<const Program *> mToDirtyList;
 
+    // Is we have a non-null user bitmap callback we do not own the bits and
+    // instead call this function to free the memort when its time.
+    RsBitmapCallback_t mUserBitmapCallback;
+    void *mUserBitmapCallbackData;
+
     // Usage restrictions
     bool mCpuWrite;
     bool mCpuRead;
@@ -98,6 +104,7 @@
     // Is this a legal structure to be used as a texture source.
     // Initially this will require 1D or 2D and color data
     bool mIsTexture;
+    bool mTextureGenMipmap;
     uint32_t mTextureLOD;
     uint32_t mTextureID;
 
@@ -108,6 +115,10 @@
     uint32_t mBufferID;
 
     bool mUploadDefered;
+
+private:
+    void init(Context *rsc, const Type *);
+
 };
 
 }
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
index 6b8ed0d..235c153 100644
--- a/libs/rs/rsScriptC_Lib.cpp
+++ b/libs/rs/rsScriptC_Lib.cpp
@@ -975,7 +975,7 @@
 static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
 {
     GET_TLS();
-    rsi_AllocationUploadToTexture(rsc, va, baseMipLevel);
+    rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
 }
 
 static void SC_uploadToBufferObject(RsAllocation va)
diff --git a/libs/rs/rsg_ScriptJavaClass.cpp b/libs/rs/rsg_ScriptJavaClass.cpp
new file mode 100644
index 0000000..cee9f52
--- /dev/null
+++ b/libs/rs/rsg_ScriptJavaClass.cpp
@@ -0,0 +1,254 @@
+#define NO_RS_FUNCS 1
+
+#include "stdio.h"
+#include "RenderScript.h"
+#include <vector>
+
+struct Element;
+
+struct ElementField {
+    const char *name;
+    Element *e;
+    ElementField(const char *n, Element *_e) {
+        name = n;
+        e = _e;
+    }
+    ElementField() {
+        name = NULL;
+        e = NULL;
+    }
+};
+
+struct Element {
+    ElementField *fields;
+    size_t fieldCount;
+    const char *name;
+    bool generated;
+
+    RsDataType compType;
+    uint32_t compVectorSize;
+
+    Element() {
+        fields = NULL;
+        fieldCount = 0;
+        name = NULL;
+        generated = false;
+        compType = RS_TYPE_ELEMENT;
+        compVectorSize = 0;
+    }
+
+    Element(uint32_t _fieldCount, const char *_name) {
+        fields = new ElementField[_fieldCount];
+        fieldCount = _fieldCount;
+        name = _name;
+        generated = false;
+        compType = RS_TYPE_ELEMENT;
+        compVectorSize = 0;
+    }
+
+    Element(RsDataType t, uint32_t s) {
+        fields = NULL;
+        fieldCount = 0;
+        name = NULL;
+        generated = false;
+        compType = t;
+        compVectorSize = s;
+    }
+
+};
+
+
+static void genHeader(FILE *f, const char *packageName)
+{
+    fprintf(f, "package %s;\n", packageName);
+    fprintf(f, "\n");
+    fprintf(f, "import android.renderscript.*;\n");
+    fprintf(f, "\n");
+    fprintf(f, "\n");
+}
+
+static const char * RSTypeToJava(RsDataType dt)
+{
+    switch(dt) {
+    //case RS_TYPE_FLOAT_16:         return "float";
+    case RS_TYPE_FLOAT_32:         return "float";
+    //case RS_TYPE_FLOAT_64:         return "double";
+
+    case RS_TYPE_SIGNED_8:         return "byte";
+    case RS_TYPE_SIGNED_16:        return "short";
+    case RS_TYPE_SIGNED_32:        return "int";
+    //case RS_TYPE_SIGNED_64:        return "long";
+
+    case RS_TYPE_UNSIGNED_8:       return "short";
+    case RS_TYPE_UNSIGNED_16:      return "int";
+    case RS_TYPE_UNSIGNED_32:      return "long";
+    //case RS_TYPE_UNSIGNED_64:      return NULL;
+
+    //case RS_TYPE_ELEMENT:          return "android.renderscript.Element";
+    //case RS_TYPE_TYPE:             return "android.renderscript.Type";
+    //case RS_TYPE_ALLOCATION:       return "android.renderscript.Allocation";
+    //case RS_TYPE_SAMPLER:          return "android.renderscript.Sampler";
+    //case RS_TYPE_SCRIPT:           return "android.renderscript.Script";
+    //case RS_TYPE_MESH:             return "android.renderscript.Mesh";
+    //case RS_TYPE_PROGRAM_FRAGMENT: return "android.renderscript.ProgramFragment";
+    //case RS_TYPE_PROGRAM_VERTEX:   return "android.renderscript.ProgramVertex";
+    //case RS_TYPE_PROGRAM_RASTER:   return "android.renderscript.ProgramRaster";
+    //case RS_TYPE_PROGRAM_STORE:    return "android.renderscript.ProgramStore";
+    default: return NULL;
+    }
+    return NULL;
+}
+
+static const char * RSTypeToString(RsDataType dt)
+{
+    switch(dt) {
+    case RS_TYPE_FLOAT_16:         return "F16";
+    case RS_TYPE_FLOAT_32:         return "F32";
+    case RS_TYPE_FLOAT_64:         return "F64";
+
+    case RS_TYPE_SIGNED_8:         return "I8";
+    case RS_TYPE_SIGNED_16:        return "I16";
+    case RS_TYPE_SIGNED_32:        return "I32";
+    case RS_TYPE_SIGNED_64:        return "I64";
+
+    case RS_TYPE_UNSIGNED_8:       return "U8";
+    case RS_TYPE_UNSIGNED_16:      return "U16";
+    case RS_TYPE_UNSIGNED_32:      return "U32";
+    case RS_TYPE_UNSIGNED_64:      return "U64";
+
+    //case RS_TYPE_ELEMENT:          return "android.renderscript.Element";
+    //case RS_TYPE_TYPE:             return "android.renderscript.Type";
+    //case RS_TYPE_ALLOCATION:       return "android.renderscript.Allocation";
+    //case RS_TYPE_SAMPLER:          return "android.renderscript.Sampler";
+    //case RS_TYPE_SCRIPT:           return "android.renderscript.Script";
+    //case RS_TYPE_MESH:             return "android.renderscript.Mesh";
+    //case RS_TYPE_PROGRAM_FRAGMENT: return "android.renderscript.ProgramFragment";
+    //case RS_TYPE_PROGRAM_VERTEX:   return "android.renderscript.ProgramVertex";
+    //case RS_TYPE_PROGRAM_RASTER:   return "android.renderscript.ProgramRaster";
+    //case RS_TYPE_PROGRAM_STORE:    return "android.renderscript.ProgramStore";
+    default: return NULL;
+    }
+    return NULL;
+}
+
+bool rsGenerateElementClass(const Element *e, const char *packageName, FILE *f)
+{
+    genHeader(f, packageName);
+
+    fprintf(f, "class Element_%s {\n", e->name);
+
+    for (size_t ct=0; ct < e->fieldCount; ct++) {
+        const char *ts = RSTypeToJava(e->fields[ct].e->compType);
+        if (ts == NULL) {
+            return false;
+        }
+        fprintf(f, "    public %s %s;\n", ts, e->fields[ct].name);
+    }
+
+    fprintf(f, "\n");
+    fprintf(f, "    static Element getElement(RenderScript rs) {\n");
+    fprintf(f, "        Element.Builder eb = new Element.Builder(rs);\n");
+    for (size_t ct=0; ct < e->fieldCount; ct++) {
+        const char *ts = RSTypeToString(e->fields[ct].e->compType);
+        fprintf(f, "         eb.add(Element.USER_%s(rs), \"%s\");\n", ts, e->fields[ct].name);
+    }
+    fprintf(f, "        return eb.create();\n");
+    fprintf(f, "    }\n");
+
+    fprintf(f, "    static Allocation createAllocation(RenderScript rs) {\n");
+    fprintf(f, "        Element e = getElement(rs);\n");
+    fprintf(f, "        Allocation a = Allocation.createSized(rs, e, 1);\n");
+    fprintf(f, "        return a;\n");
+    fprintf(f, "    }\n");
+
+
+    fprintf(f, "    void copyToAllocation(Allocation a) {\n");
+    fprintf(f, "        mIOBuffer.reset();\n");
+    for (size_t ct=0; ct < e->fieldCount; ct++) {
+        const char *ts = RSTypeToString(e->fields[ct].e->compType);
+        fprintf(f, "         mIOBuffer.add%s(%s);\n", ts, e->fields[ct].name);
+    }
+    fprintf(f, "        a.data(mIOBuffer.getData());\n");
+    fprintf(f, "    }\n");
+
+
+
+    fprintf(f, "    private FieldPacker mIOBuffer[];\n");
+    fprintf(f, "    public Element_%s() {\n", e->name);
+    fprintf(f, "        mIOBuffer = new FieldPacker(%i);\n", 100/*element->getSizeBytes()*/);
+    fprintf(f, "    }\n");
+
+
+    fprintf(f, "}\n");
+
+    return true;
+}
+
+bool rsGenerateElementClassFile(Element *e, const char *packageName)
+{
+    char buf[1024];
+    sprintf(buf, "Element_%s.java", e->name);
+    printf("Creating file %s \n", buf);
+    FILE *f = fopen(buf, "w");
+    bool ret = rsGenerateElementClass(e, packageName, f);
+    fclose(f);
+    return ret;
+}
+
+
+
+
+/*
+bool rsGenerateScriptClass(const ScriptC *script, const char *packageName, FILE *f)
+{
+    genHeader(f, packageName);
+
+    fprintf(f, "class ScriptC_%s {\n", script->getName());
+
+
+
+        ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS];
+    String8 mSlotNames[MAX_SCRIPT_BANKS];
+    bool mSlotWritable[MAX_SCRIPT_BANKS];
+
+
+}
+*/
+
+
+
+int main(int argc, const char *argv)
+{
+    Element *u8 = new Element(RS_TYPE_UNSIGNED_8, 1);
+    Element *i32 = new Element(RS_TYPE_SIGNED_32, 1);
+    Element *f32 = new Element(RS_TYPE_FLOAT_32, 1);
+
+    Element *e_Pixel = new Element(4, "Pixel");
+    e_Pixel->fields[0].e = u8;
+    e_Pixel->fields[0].name = "a";
+    e_Pixel->fields[1].e = u8;
+    e_Pixel->fields[1].name = "b";
+    e_Pixel->fields[2].e = u8;
+    e_Pixel->fields[2].name = "g";
+    e_Pixel->fields[3].e = u8;
+    e_Pixel->fields[3].name = "r";
+
+    Element *e_Params = new Element(5, "Params");
+    e_Params->fields[0].e = i32;
+    e_Params->fields[0].name = "inHeight";
+    e_Params->fields[1].e = i32;
+    e_Params->fields[1].name = "inWidth";
+    e_Params->fields[2].e = i32;
+    e_Params->fields[2].name = "outHeight";
+    e_Params->fields[3].e = i32;
+    e_Params->fields[3].name = "outWidth";
+    e_Params->fields[4].e = f32;
+    e_Params->fields[4].name = "threshold";
+
+
+    printf("1\n");
+    rsGenerateElementClassFile(e_Pixel, "android");
+    rsGenerateElementClassFile(e_Params, "android");
+
+}
+
diff --git a/libs/rs/rsg_generator.c b/libs/rs/rsg_generator.c
index 74ba248..f4e8c68 100644
--- a/libs/rs/rsg_generator.c
+++ b/libs/rs/rsg_generator.c
@@ -5,7 +5,7 @@
 void printFileHeader(FILE *f)
 {
     fprintf(f, "/*\n");
-    fprintf(f, " * Copyright (C) 2009 The Android Open Source Project\n");
+    fprintf(f, " * Copyright (C) 2010 The Android Open Source Project\n");
     fprintf(f, " *\n");
     fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
     fprintf(f, " * you may not use this file except in compliance with the License.\n");
diff --git a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
index d9d9bfe..5969617 100644
--- a/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
+++ b/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
@@ -246,10 +246,15 @@
     LOGI("version   : %s", glGetString(GL_VERSION));
     LOGI("extensions: %s", gl_extensions);
 
-    if (strstr(gl_renderer, "Adreno")) {
+#if 0
+    // for drivers that don't have proper support for flushing cached buffers
+    // on gralloc unlock, uncomment this block and test for the specific
+    // renderer substring
+    if (strstr(gl_renderer, "<some vendor string>")) {
         LOGD("Assuming uncached graphics buffers.");
         mFlags &= ~CACHED_BUFFERS;
     }
+#endif
 
     if (strstr(gl_extensions, "GL_ARB_texture_non_power_of_two")) {
         mFlags |= NPOT_EXTENSION;
diff --git a/libs/surfaceflinger/Layer.h b/libs/surfaceflinger/Layer.h
index 1310ecc..743afb4 100644
--- a/libs/surfaceflinger/Layer.h
+++ b/libs/surfaceflinger/Layer.h
@@ -78,6 +78,8 @@
     inline const sp<FreezeLock>&  getFreezeLock() const { return mFreezeLock; }
     // only for debugging
     inline PixelFormat pixelFormat() const { return mFormat; }
+    // only for debugging
+    inline int getFrontBufferIndex() const { return mFrontBufferIndex; }
 
 private:
     inline sp<GraphicBuffer> getFrontBufferLocked() {
diff --git a/libs/surfaceflinger/LayerBase.cpp b/libs/surfaceflinger/LayerBase.cpp
index a3d293f..b0109ca 100644
--- a/libs/surfaceflinger/LayerBase.cpp
+++ b/libs/surfaceflinger/LayerBase.cpp
@@ -728,6 +728,14 @@
     delete lcblk;
 }
 
+void LayerBaseClient::setName(const String8& name) {
+    mName = name;
+}
+
+String8 LayerBaseClient::getName() const {
+    return mName;
+}
+
 int32_t LayerBaseClient::serverIndex() const 
 {
     sp<Client> client(this->client.promote());
diff --git a/libs/surfaceflinger/LayerBase.h b/libs/surfaceflinger/LayerBase.h
index 6aacd82..7ac8bc5 100644
--- a/libs/surfaceflinger/LayerBase.h
+++ b/libs/surfaceflinger/LayerBase.h
@@ -320,6 +320,8 @@
             const sp<Client>& client, int32_t i);
     virtual ~LayerBaseClient();
     virtual void onFirstRef();
+    void setName(const String8& name);
+    String8 getName() const;
 
     const wp<Client>    client;
 
@@ -333,6 +335,7 @@
     
     virtual void onRemoved();
 
+
     class Surface : public BnSurface 
     {
     public:
@@ -371,6 +374,7 @@
     mutable     Mutex           mLock;
     mutable     wp<Surface>     mClientSurface;
     // only read
+                String8         mName;
     const       uint32_t        mIdentity;
     static      int32_t         sIdentity;
 };
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index b408779..2598440 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -625,12 +625,13 @@
 
             mVisibleRegionsDirty = true;
             mDirtyRegion.set(hw.bounds());
-            mFreezeDisplayTime = 0;
         }
 
         if (mCurrentState.freezeDisplay != mDrawingState.freezeDisplay) {
             // freezing or unfreezing the display -> trigger animation if needed
             mFreezeDisplay = mCurrentState.freezeDisplay;
+            if (mFreezeDisplay)
+                 mFreezeDisplayTime = 0;
         }
 
         if (currentLayers.size() > mDrawingState.layersSortedByZ.size()) {
@@ -1186,7 +1187,7 @@
 }
 
 sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
-        ISurfaceFlingerClient::surface_data_t* params,
+        const String8& name, ISurfaceFlingerClient::surface_data_t* params,
         DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
         uint32_t flags)
 {
@@ -1232,6 +1233,7 @@
     }
 
     if (layer != 0) {
+        layer->setName(name);
         setTransactionFlags(eTransactionNeeded);
         surfaceHandle = layer->getSurface();
         if (surfaceHandle != 0) { 
@@ -1506,8 +1508,10 @@
             if (lbc != 0) {
                 sp<Client> client(lbc->client.promote());
                 snprintf(buffer, SIZE,
-                        "      "
-                        "id=0x%08x, client=0x%08x, identity=%u\n",
+                        "      name=%s\n", lbc->getName().string());
+                result.append(buffer);
+                snprintf(buffer, SIZE,
+                        "      id=0x%08x, client=0x%08x, identity=%u\n",
                         lbc->clientIndex(), client.get() ? client->cid : 0,
                         lbc->getIdentity());
 
@@ -1519,6 +1523,10 @@
             if (l != 0) {
                 SharedBufferStack::Statistics stats = l->lcblk->getStats();
                 result.append( l->lcblk->dump("      ") );
+                snprintf(buffer, SIZE,
+                        "      front-index=%u\n", l->getFrontBufferIndex());
+                result.append(buffer);
+
                 sp<const GraphicBuffer> buf0(l->getBuffer(0));
                 sp<const GraphicBuffer> buf1(l->getBuffer(1));
                 uint32_t w0=0, h0=0, s0=0;
@@ -1756,10 +1764,12 @@
 
 sp<ISurface> BClient::createSurface(
         ISurfaceFlingerClient::surface_data_t* params, int pid,
+        const String8& name,
         DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
         uint32_t flags)
 {
-    return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags);
+    return mFlinger->createSurface(mId, pid, name, params, display, w, h,
+            format, flags);
 }
 
 status_t BClient::destroySurface(SurfaceID sid)
diff --git a/libs/surfaceflinger/SurfaceFlinger.h b/libs/surfaceflinger/SurfaceFlinger.h
index 4520c0e..d75dc15 100644
--- a/libs/surfaceflinger/SurfaceFlinger.h
+++ b/libs/surfaceflinger/SurfaceFlinger.h
@@ -189,7 +189,7 @@
     friend class LayerBlur;
     friend class LayerDim;
 
-    sp<ISurface> createSurface(ClientID client, int pid, 
+    sp<ISurface> createSurface(ClientID client, int pid, const String8& name,
             ISurfaceFlingerClient::surface_data_t* params,
             DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
             uint32_t flags);
@@ -401,7 +401,7 @@
     virtual sp<IMemoryHeap> getControlBlock() const;
 
     virtual sp<ISurface> createSurface(
-            surface_data_t* params, int pid,
+            surface_data_t* params, int pid, const String8& name,
             DisplayID display, uint32_t w, uint32_t h,PixelFormat format,
             uint32_t flags);
 
diff --git a/libs/surfaceflinger_client/ISurfaceFlingerClient.cpp b/libs/surfaceflinger_client/ISurfaceFlingerClient.cpp
index e636c52..def96d7 100644
--- a/libs/surfaceflinger_client/ISurfaceFlingerClient.cpp
+++ b/libs/surfaceflinger_client/ISurfaceFlingerClient.cpp
@@ -74,6 +74,7 @@
 
     virtual sp<ISurface> createSurface( surface_data_t* params,
                                         int pid,
+                                        const String8& name,
                                         DisplayID display,
                                         uint32_t w,
                                         uint32_t h,
@@ -83,6 +84,7 @@
         Parcel data, reply;
         data.writeInterfaceToken(ISurfaceFlingerClient::getInterfaceDescriptor());
         data.writeInt32(pid);
+        data.writeString8(name);
         data.writeInt32(display);
         data.writeInt32(w);
         data.writeInt32(h);
@@ -154,12 +156,14 @@
             CHECK_INTERFACE(ISurfaceFlingerClient, data, reply);
             surface_data_t params;
             int32_t pid = data.readInt32();
+            String8 name = data.readString8();
             DisplayID display = data.readInt32();
             uint32_t w = data.readInt32();
             uint32_t h = data.readInt32();
             PixelFormat format = data.readInt32();
             uint32_t flags = data.readInt32();
-            sp<ISurface> s = createSurface(&params, pid, display, w, h, format, flags);
+            sp<ISurface> s = createSurface(&params, pid, name, display, w, h,
+                    format, flags);
             params.writeToParcel(reply);
             reply->writeStrongBinder(s->asBinder());
             return NO_ERROR;
diff --git a/libs/surfaceflinger_client/SurfaceComposerClient.cpp b/libs/surfaceflinger_client/SurfaceComposerClient.cpp
index 0b5e504..3117495 100644
--- a/libs/surfaceflinger_client/SurfaceComposerClient.cpp
+++ b/libs/surfaceflinger_client/SurfaceComposerClient.cpp
@@ -319,10 +319,30 @@
         PixelFormat format,
         uint32_t flags)
 {
+    String8 name;
+    const size_t SIZE = 128;
+    char buffer[SIZE];
+    snprintf(buffer, SIZE, "<pid_%d>", getpid());
+    name.append(buffer);
+
+    return SurfaceComposerClient::createSurface(pid, name, display,
+            w, h, format, flags);
+
+}
+
+sp<SurfaceControl> SurfaceComposerClient::createSurface(
+        int pid,
+        const String8& name,
+        DisplayID display,
+        uint32_t w,
+        uint32_t h,
+        PixelFormat format,
+        uint32_t flags)
+{
     sp<SurfaceControl> result;
     if (mStatus == NO_ERROR) {
         ISurfaceFlingerClient::surface_data_t data;
-        sp<ISurface> surface = mClient->createSurface(&data, pid,
+        sp<ISurface> surface = mClient->createSurface(&data, pid, name,
                 display, w, h, format, flags);
         if (surface != 0) {
             if (uint32_t(data.token) < NUM_LAYERS_MAX) {
diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp
index c4d4f99..57192a5 100644
--- a/libs/ui/EventHub.cpp
+++ b/libs/ui/EventHub.cpp
@@ -604,8 +604,11 @@
 
     // figure out the kinds of events the device reports
     
-    // See if this is a keyboard, and classify it.
-    uint8_t key_bitmask[(KEY_MAX+1)/8];
+    // See if this is a keyboard, and classify it.  Note that we only
+    // consider up through the function keys; we don't want to include
+    // ones after that (play cd etc) so we don't mistakenly consider a
+    // controller to be a keyboard.
+    uint8_t key_bitmask[(KEY_PLAYCD+1)/8];
     memset(key_bitmask, 0, sizeof(key_bitmask));
     LOGV("Getting keys...");
     if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) >= 0) {
@@ -702,22 +705,20 @@
         device->layoutMap->load(keylayoutFilename);
 
         // tell the world about the devname (the descriptive name)
-        int32_t publicID;
-        if (!mHaveFirstKeyboard && !defaultKeymap) {
-            publicID = 0;
+        if (!mHaveFirstKeyboard && !defaultKeymap && strstr(name, "-keypad")) {
             // the built-in keyboard has a well-known device ID of 0,
             // this device better not go away.
             mHaveFirstKeyboard = true;
             mFirstKeyboardId = device->id;
+            property_set("hw.keyboards.0.devname", name);
         } else {
-            publicID = device->id;
             // ensure mFirstKeyboardId is set to -something-.
             if (mFirstKeyboardId == 0) {
                 mFirstKeyboardId = device->id;
             }
         }
         char propName[100];
-        sprintf(propName, "hw.keyboards.%u.devname", publicID);
+        sprintf(propName, "hw.keyboards.%u.devname", device->id);
         property_set(propName, name);
 
         // 'Q' key support = cheap test of whether this is an alpha-capable kbd
@@ -734,8 +735,8 @@
             device->classes |= CLASS_DPAD;
         }
         
-        LOGI("New keyboard: publicID=%d device->id=0x%x devname='%s' propName='%s' keylayout='%s'\n",
-                publicID, device->id, name, propName, keylayoutFilename);
+        LOGI("New keyboard: device->id=0x%x devname='%s' propName='%s' keylayout='%s'\n",
+                device->id, name, propName, keylayoutFilename);
     }
 
     LOGI("New device: path=%s name=%s id=0x%x (of 0x%x) index=%d fd=%d classes=0x%x\n",
@@ -808,18 +809,15 @@
             device->next = mClosingDevices;
             mClosingDevices = device;
 
-            uint32_t publicID;
             if (device->id == mFirstKeyboardId) {
                 LOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this",
                         device->path.string(), mFirstKeyboardId);
                 mFirstKeyboardId = 0;
-                publicID = 0;
-            } else {
-                publicID = device->id;
+                property_set("hw.keyboards.0.devname", NULL);
             }
             // clear the property
             char propName[100];
-            sprintf(propName, "hw.keyboards.%u.devname", publicID);
+            sprintf(propName, "hw.keyboards.%u.devname", device->id);
             property_set(propName, NULL);
             return 0;
         }
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 38600b9..6da11b5 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -1850,7 +1850,7 @@
         if (Res_GETPACKAGE(resID)+1 == 0) {
             LOGW("No package identifier when getting name for resource number 0x%08x", resID);
         } else {
-            LOGW("Resources don't contain package for resource number 0x%08x", resID);
+            LOGV("Resources don't contain package for resource number 0x%08x", resID);
         }
         return false;
     }
@@ -1900,7 +1900,7 @@
         if (Res_GETPACKAGE(resID)+1 == 0) {
             LOGW("No package identifier when getting name for resource number 0x%08x", resID);
         } else {
-            LOGW("Resources don't contain package for resource number 0x%08x", resID);
+            LOGV("Resources don't contain package for resource number 0x%08x", resID);
         }
         return BAD_INDEX;
     }
@@ -4149,22 +4149,165 @@
                     } else {
                         sprintf(density, "%d", (int)dval);
                     }
-                    printf("      config %d lang=%c%c cnt=%c%c orien=%d touch=%d density=%s key=%d infl=%d nav=%d w=%d h=%d sz=%d lng=%d\n",
-                           (int)configIndex,
-                           type->config.language[0] ? type->config.language[0] : '-',
-                           type->config.language[1] ? type->config.language[1] : '-',
-                           type->config.country[0] ? type->config.country[0] : '-',
-                           type->config.country[1] ? type->config.country[1] : '-',
-                           type->config.orientation,
-                           type->config.touchscreen,
-                           density,
-                           type->config.keyboard,
-                           type->config.inputFlags,
-                           type->config.navigation,
-                           dtohs(type->config.screenWidth),
-                           dtohs(type->config.screenHeight),
-                           type->config.screenLayout&ResTable_config::MASK_SCREENSIZE,
-                           type->config.screenLayout&ResTable_config::MASK_SCREENLONG);
+                    printf("      config %d", (int)configIndex);
+                    if (type->config.mcc != 0) {
+                        printf(" mcc=%d", dtohs(type->config.mcc));
+                    }
+                    if (type->config.mnc != 0) {
+                        printf(" mnc=%d", dtohs(type->config.mnc));
+                    }
+                    if (type->config.locale != 0) {
+                        printf(" lang=%c%c cnt=%c%c",
+                               type->config.language[0] ? type->config.language[0] : '-',
+                               type->config.language[1] ? type->config.language[1] : '-',
+                               type->config.country[0] ? type->config.country[0] : '-',
+                               type->config.country[1] ? type->config.country[1] : '-');
+                    }
+                    if (type->config.screenLayout != 0) {
+                        printf(" sz=%d",
+                                type->config.screenLayout&ResTable_config::MASK_SCREENSIZE);
+                        switch (type->config.screenLayout&ResTable_config::MASK_SCREENSIZE) {
+                            case ResTable_config::SCREENSIZE_SMALL:
+                                printf(" (small)");
+                                break;
+                            case ResTable_config::SCREENSIZE_NORMAL:
+                                printf(" (normal)");
+                                break;
+                            case ResTable_config::SCREENSIZE_LARGE:
+                                printf(" (large)");
+                                break;
+                        }
+                        printf(" lng=%d",
+                                type->config.screenLayout&ResTable_config::MASK_SCREENLONG);
+                        switch (type->config.screenLayout&ResTable_config::MASK_SCREENLONG) {
+                            case ResTable_config::SCREENLONG_NO:
+                                printf(" (notlong)");
+                                break;
+                            case ResTable_config::SCREENLONG_YES:
+                                printf(" (long)");
+                                break;
+                        }
+                    }
+                    if (type->config.orientation != 0) {
+                        printf(" orient=%d", type->config.orientation);
+                        switch (type->config.orientation) {
+                            case ResTable_config::ORIENTATION_PORT:
+                                printf(" (port)");
+                                break;
+                            case ResTable_config::ORIENTATION_LAND:
+                                printf(" (land)");
+                                break;
+                            case ResTable_config::ORIENTATION_SQUARE:
+                                printf(" (square)");
+                                break;
+                        }
+                    }
+                    if (type->config.uiMode != 0) {
+                        printf(" type=%d",
+                                type->config.uiMode&ResTable_config::MASK_UI_MODE_TYPE);
+                        switch (type->config.uiMode&ResTable_config::MASK_UI_MODE_TYPE) {
+                            case ResTable_config::UI_MODE_TYPE_NORMAL:
+                                printf(" (normal)");
+                                break;
+                            case ResTable_config::UI_MODE_TYPE_CAR:
+                                printf(" (car)");
+                                break;
+                        }
+                        printf(" night=%d",
+                                type->config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT);
+                        switch (type->config.uiMode&ResTable_config::MASK_UI_MODE_NIGHT) {
+                            case ResTable_config::UI_MODE_NIGHT_NO:
+                                printf(" (no)");
+                                break;
+                            case ResTable_config::UI_MODE_NIGHT_YES:
+                                printf(" (yes)");
+                                break;
+                        }
+                    }
+                    if (dval != 0) {
+                        printf(" density=%s", density);
+                    }
+                    if (type->config.touchscreen != 0) {
+                        printf(" touch=%d", type->config.touchscreen);
+                        switch (type->config.touchscreen) {
+                            case ResTable_config::TOUCHSCREEN_NOTOUCH:
+                                printf(" (notouch)");
+                                break;
+                            case ResTable_config::TOUCHSCREEN_STYLUS:
+                                printf(" (stylus)");
+                                break;
+                            case ResTable_config::TOUCHSCREEN_FINGER:
+                                printf(" (finger)");
+                                break;
+                        }
+                    }
+                    if (type->config.inputFlags != 0) {
+                        printf(" keyhid=%d", type->config.inputFlags&ResTable_config::MASK_KEYSHIDDEN);
+                        switch (type->config.inputFlags&ResTable_config::MASK_KEYSHIDDEN) {
+                            case ResTable_config::KEYSHIDDEN_NO:
+                                printf(" (no)");
+                                break;
+                            case ResTable_config::KEYSHIDDEN_YES:
+                                printf(" (yes)");
+                                break;
+                            case ResTable_config::KEYSHIDDEN_SOFT:
+                                printf(" (soft)");
+                                break;
+                        }
+                        printf(" navhid=%d", type->config.inputFlags&ResTable_config::MASK_NAVHIDDEN);
+                        switch (type->config.inputFlags&ResTable_config::MASK_NAVHIDDEN) {
+                            case ResTable_config::NAVHIDDEN_NO:
+                                printf(" (no)");
+                                break;
+                            case ResTable_config::NAVHIDDEN_YES:
+                                printf(" (yes)");
+                                break;
+                        }
+                    }
+                    if (type->config.keyboard != 0) {
+                        printf(" kbd=%d", type->config.keyboard);
+                        switch (type->config.keyboard) {
+                            case ResTable_config::KEYBOARD_NOKEYS:
+                                printf(" (nokeys)");
+                                break;
+                            case ResTable_config::KEYBOARD_QWERTY:
+                                printf(" (qwerty)");
+                                break;
+                            case ResTable_config::KEYBOARD_12KEY:
+                                printf(" (12key)");
+                                break;
+                        }
+                    }
+                    if (type->config.navigation != 0) {
+                        printf(" nav=%d", type->config.navigation);
+                        switch (type->config.navigation) {
+                            case ResTable_config::NAVIGATION_NONAV:
+                                printf(" (nonav)");
+                                break;
+                            case ResTable_config::NAVIGATION_DPAD:
+                                printf(" (dpad)");
+                                break;
+                            case ResTable_config::NAVIGATION_TRACKBALL:
+                                printf(" (trackball)");
+                                break;
+                            case ResTable_config::NAVIGATION_WHEEL:
+                                printf(" (wheel)");
+                                break;
+                        }
+                    }
+                    if (type->config.screenWidth != 0) {
+                        printf(" w=%d", dtohs(type->config.screenWidth));
+                    }
+                    if (type->config.screenHeight != 0) {
+                        printf(" h=%d", dtohs(type->config.screenHeight));
+                    }
+                    if (type->config.sdkVersion != 0) {
+                        printf(" sdk=%d", dtohs(type->config.sdkVersion));
+                    }
+                    if (type->config.minorVersion != 0) {
+                        printf(" mver=%d", dtohs(type->config.minorVersion));
+                    }
+                    printf("\n");
                     size_t entryCount = dtohl(type->entryCount);
                     uint32_t entriesStart = dtohl(type->entriesStart);
                     if ((entriesStart&0x3) != 0) {
diff --git a/location/java/android/location/GeocoderParams.java b/location/java/android/location/GeocoderParams.java
index 8b8e63b..174fe3e 100644
--- a/location/java/android/location/GeocoderParams.java
+++ b/location/java/android/location/GeocoderParams.java
@@ -29,6 +29,8 @@
  * as well as the Geocoder client's package name for geocoder server
  * logging.  This information is kept in a separate class to allow for
  * future expansion of the IGeocodeProvider interface.
+ *
+ * @hide
  */
 public class GeocoderParams implements Parcelable {
     private Locale mLocale;
diff --git a/media/java/android/media/AsyncPlayer.java b/media/java/android/media/AsyncPlayer.java
index e1e09b9..09aec2e 100644
--- a/media/java/android/media/AsyncPlayer.java
+++ b/media/java/android/media/AsyncPlayer.java
@@ -72,10 +72,8 @@
                 Log.w(mTag, "Notification sound delayed by " + delay + "msecs");
             }
         }
-        catch (IOException e) {
+        catch (Exception e) {
             Log.w(mTag, "error loading sound for " + cmd.uri, e);
-        } catch (IllegalStateException e) {
-            Log.w(mTag, "IllegalStateException (content provider died?) " + cmd.uri, e);
         }
     }
 
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 32c5c23..b0a179f 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -23,11 +23,16 @@
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
 import android.util.Log;
 
+import java.util.Iterator;
+import java.util.HashMap;
+
 /**
  * AudioManager provides access to volume and ringer mode control.
  * <p>
@@ -1127,6 +1132,241 @@
     }
 
     /**
+     * TODO unhide for SDK
+     * Used to indicate a loss of audio focus of unknown duration.
+     * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_LOSS = -1;
+    /**
+     * TODO unhide for SDK
+     * Used to indicate a transient loss of audio focus.
+     * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2;
+    /**
+     * TODO unhide for SDK
+     * Used to indicate a gain of audio focus, or a request of audio focus, of unknown duration.
+     * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+     * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_GAIN = 1;
+    /**
+     * TODO unhide for SDK
+     * Used to indicate a temporary gain or request of audio focus, anticipated to last a short
+     * amount of time. Examples of temporary changes are the playback of driving directions, or an
+     * event notification.
+     * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+     * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2;
+
+    /**
+     * TODO unhide for SDK
+     * {@hide}
+     * Interface definition for a callback to be invoked when the audio focus of the system is
+     * updated.
+     */
+    public interface OnAudioFocusChangeListener {
+        /**
+         * Called on the listener to notify it the audio focus for this listener has been changed.
+         * The focusChange value indicates whether the focus was gained,
+         * whether the focus was lost, and whether that loss is transient, or whether the new focus
+         * holder will hold it for an unknown amount of time.
+         * When losing focus, listeners can use the duration hint to decide what
+         * behavior to adopt when losing focus. A music player could for instance elect to duck its
+         * music stream for transient focus losses, and pause otherwise.
+         * @param focusChange one of {@link AudioManager#AUDIOFOCUS_GAIN}, 
+         *   {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT}.
+         */
+        public void onAudioFocusChanged(int focusChange);
+    }
+
+    /**
+     * Map to convert focus event listener IDs, as used in the AudioService audio focus stack,
+     * to actual listener objects.
+     */
+    private HashMap<String, OnAudioFocusChangeListener> mFocusIdListenerMap =
+            new HashMap<String, OnAudioFocusChangeListener>();
+    /**
+     * Lock to prevent concurrent changes to the list of focus listeners for this AudioManager
+     * instance.
+     */
+    private final Object mFocusListenerLock = new Object();
+
+    private OnAudioFocusChangeListener findFocusListener(String id) {
+        return mFocusIdListenerMap.get(id);
+    }
+
+    /**
+     * Handler for audio focus events coming from the audio service.
+     */
+    private FocusEventHandlerDelegate mFocusEventHandlerDelegate = new FocusEventHandlerDelegate();
+    /**
+     * Event id denotes a loss of focus
+     */
+    private static final int AUDIOFOCUS_EVENT_LOSS  = 0;
+    /**
+     * Event id denotes a gain of focus
+     */
+    private static final int AUDIOFOCUS_EVENT_GAIN  = 1;
+    /**
+     * Helper class to handle the forwarding of audio focus events to the appropriate listener
+     */
+    private class FocusEventHandlerDelegate {
+        private final Handler mHandler;
+
+        FocusEventHandlerDelegate() {
+            Looper looper;
+            if ((looper = Looper.myLooper()) == null) {
+                looper = Looper.getMainLooper();
+            }
+
+            if (looper != null) {
+                // implement the event handler delegate to receive audio focus events
+                mHandler = new Handler(looper) {
+                    @Override
+                    public void handleMessage(Message msg) {
+                        OnAudioFocusChangeListener listener = null;
+                        synchronized(mFocusListenerLock) {
+                            listener = findFocusListener((String)msg.obj);
+                        }
+                        if (listener != null) {
+                            listener.onAudioFocusChanged(msg.what);
+                        }
+                    }
+                };
+            } else {
+                mHandler = null;
+            }
+        }
+
+        Handler getHandler() {
+            return mHandler;
+        }
+    }
+
+    private IAudioFocusDispatcher mFocusDispatcher = new IAudioFocusDispatcher.Stub() {
+
+        public void dispatchAudioFocusChange(int focusChange, String id) {
+            Message m = mFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id);
+            mFocusEventHandlerDelegate.getHandler().sendMessage(m);
+        }
+
+    };
+
+    private String getIdForFocusListener(OnAudioFocusChangeListener l) {
+        if (l == null) {
+            return new String();
+        } else {
+            return new String(this.toString() + l.toString());
+        }
+    }
+
+    /**
+     * TODO unhide for SDK
+     * {@hide}
+     * Register a listener for audio focus updates.
+     */
+    public void registerAudioFocusListener(OnAudioFocusChangeListener l) {
+        if (l == null) {
+            return;
+        }
+        synchronized(mFocusListenerLock) {
+            if (mFocusIdListenerMap.containsKey(getIdForFocusListener(l))) {
+                return;
+            }
+            mFocusIdListenerMap.put(getIdForFocusListener(l), l);
+        }
+    }
+
+    /**
+     * TODO unhide for SDK
+     * TODO document for SDK
+     * {@hide}
+     */
+    public void unregisterAudioFocusListener(OnAudioFocusChangeListener l) {
+        // notify service to remove it from audio focus stack
+        IAudioService service = getService();
+        try {
+            service.unregisterFocusClient(getIdForFocusListener(l));
+        } catch (RemoteException e) {
+            Log.e(TAG, "Can't call unregisterFocusClient() from AudioService due to "+e);
+        }
+        // remove locally
+        synchronized(mFocusListenerLock) {
+            mFocusIdListenerMap.remove(getIdForFocusListener(l));
+        }
+    }
+
+
+    /**
+     * TODO unhide for SDK
+     * TODO document for SDK
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_REQUEST_FAILED = 0;
+    /**
+     * TODO unhide for SDK
+     * TODO document for SDK
+     * {@hide}
+     */
+    public static final int AUDIOFOCUS_REQUEST_GRANTED = 1;
+
+
+    /**
+     *  TODO unhide for SDK
+     *  {@hide}
+     *  Request audio focus.
+     *  Send a request to obtain the audio focus for a specific stream type
+     *  @param l the listener to be notified of audio focus changes
+     *  @param streamType the main audio stream type affected by the focus request
+     *  @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request
+     *      is temporary, and focus will be abandonned shortly. Examples of transient requests are
+     *      for the playback of driving directions, or notifications sounds. Use
+     *      {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such
+     *      as the playback of a song or a video.
+     *  @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
+     */
+    public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) {
+        int status = AUDIOFOCUS_REQUEST_FAILED;
+        registerAudioFocusListener(l);
+        //TODO protect request by permission check?
+        IAudioService service = getService();
+        try {
+            status = service.requestAudioFocus(streamType, durationHint, mICallBack,
+                    mFocusDispatcher, getIdForFocusListener(l));
+        } catch (RemoteException e) {
+            Log.e(TAG, "Can't call requestAudioFocus() from AudioService due to "+e);
+        }
+        return status;
+    }
+
+
+    /**
+     *  TODO unhide for SDK
+     *  TODO document for SDK
+     *  {@hide}
+     *  Abandon audio focus.
+     *  @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
+     */
+    public int abandonAudioFocus(OnAudioFocusChangeListener l) {
+        int status = AUDIOFOCUS_REQUEST_FAILED;
+        registerAudioFocusListener(l);
+        IAudioService service = getService();
+        try {
+            status = service.abandonAudioFocus(mFocusDispatcher, getIdForFocusListener(l));
+        } catch (RemoteException e) {
+            Log.e(TAG, "Can't call abandonAudioFocus() from AudioService due to "+e);
+        }
+        return status;
+    }
+
+
+    /**
      *  @hide
      *  Reload audio settings. This method is called by Settings backup
      *  agent when audio settings are restored and causes the AudioService
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 668917e..a36ee85 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -26,7 +26,6 @@
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothHeadset;
-
 import android.content.pm.PackageManager;
 import android.database.ContentObserver;
 import android.media.MediaPlayer.OnCompletionListener;
@@ -47,12 +46,15 @@
 
 import com.android.internal.telephony.ITelephony;
 
+import java.io.FileDescriptor;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.Stack;
 
 /**
  * The implementation of the volume manager service.
@@ -76,6 +78,7 @@
     private Context mContext;
     private ContentResolver mContentResolver;
 
+
     /** The UI */
     private VolumePanel mVolumePanel;
 
@@ -888,6 +891,7 @@
         }
     }
 
+
     ///////////////////////////////////////////////////////////////////////////
     // Internal methods
     ///////////////////////////////////////////////////////////////////////////
@@ -901,18 +905,20 @@
         boolean adjustVolumeIndex = true;
         int newRingerMode = mRingerMode;
 
-        if (mRingerMode == AudioManager.RINGER_MODE_NORMAL && (oldIndex + 5) / 10 == 1
-                && direction == AudioManager.ADJUST_LOWER) {
-            newRingerMode = AudioManager.RINGER_MODE_VIBRATE;
-        } else if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
-            if (direction == AudioManager.ADJUST_RAISE) {
-                newRingerMode = AudioManager.RINGER_MODE_NORMAL;
-            } else if (direction == AudioManager.ADJUST_LOWER) {
-                newRingerMode = AudioManager.RINGER_MODE_SILENT;
+        if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
+            // audible mode, at the bottom of the scale
+            if (direction == AudioManager.ADJUST_LOWER
+                    && (oldIndex + 5) / 10 == 1) {
+                // "silent mode", but which one?
+                newRingerMode = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1
+                    ? AudioManager.RINGER_MODE_VIBRATE
+                    : AudioManager.RINGER_MODE_SILENT;
             }
-        } else if (direction == AudioManager.ADJUST_RAISE
-                && mRingerMode == AudioManager.RINGER_MODE_SILENT) {
-            newRingerMode = AudioManager.RINGER_MODE_VIBRATE;
+        } else {
+            if (direction == AudioManager.ADJUST_RAISE) {
+                // exiting silent mode
+                newRingerMode = AudioManager.RINGER_MODE_NORMAL;
+            }
         }
 
         if (newRingerMode != mRingerMode) {
@@ -1598,4 +1604,223 @@
             }
         }
     }
+
+    //==========================================================================================
+    // AudioFocus
+    //==========================================================================================
+    private static class FocusStackEntry {
+        public int mStreamType = -1;// no stream type
+        public boolean mIsTransportControlReceiver = false;
+        public IAudioFocusDispatcher mFocusDispatcher = null;
+        public IBinder mSourceRef = null;
+        public String mClientId;
+        public int mDurationHint;
+
+        public FocusStackEntry() {
+        }
+
+        public FocusStackEntry(int streamType, int duration, boolean isTransportControlReceiver,
+                IAudioFocusDispatcher afl, IBinder source, String id) {
+            mStreamType = streamType;
+            mIsTransportControlReceiver = isTransportControlReceiver;
+            mFocusDispatcher = afl;
+            mSourceRef = source;
+            mClientId = id;
+            mDurationHint = duration;
+        }
+    }
+
+    private Stack<FocusStackEntry> mFocusStack = new Stack<FocusStackEntry>();
+
+    /**
+     * Helper function:
+     * Display in the log the current entries in the audio focus stack
+     */
+    private void dumpFocusStack(PrintWriter pw) {
+        pw.println("Audio Focus stack entries:");
+        synchronized(mFocusStack) {
+            Iterator<FocusStackEntry> stackIterator = mFocusStack.iterator();
+            while(stackIterator.hasNext()) {
+                FocusStackEntry fse = stackIterator.next();
+                pw.println("     source:" + fse.mSourceRef + " -- client: " + fse.mClientId
+                        + " -- duration: " +fse.mDurationHint);
+            }
+        }
+    }
+
+    /**
+     * Helper function:
+     * Remove a focus listener from the focus stack.
+     * @param focusListenerToRemove the focus listener
+     * @param signal if true and the listener was at the top of the focus stack, i.e. it was holding
+     *   focus, notify the next item in the stack it gained focus.
+     */
+    private void removeFocusStackEntry(String clientToRemove, boolean signal) {
+        // is the current top of the focus stack abandoning focus? (because of death or request)
+        if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientToRemove))
+        {
+            //Log.i(TAG, "   removeFocusStackEntry() removing top of stack");
+            mFocusStack.pop();
+            if (signal) {
+                // notify the new top of the stack it gained focus
+                if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)
+                        && canReassignFocus()) {
+                    try {
+                        mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange(
+                                AudioManager.AUDIOFOCUS_GAIN, mFocusStack.peek().mClientId);
+                    } catch (RemoteException e) {
+                        Log.e(TAG, " Failure to signal gain of focus due to "+ e);
+                        e.printStackTrace();
+                    }
+                }
+            }
+        } else {
+            // focus is abandoned by a client that's not at the top of the stack,
+            // no need to update focus.
+            Iterator<FocusStackEntry> stackIterator = mFocusStack.iterator();
+            while(stackIterator.hasNext()) {
+                FocusStackEntry fse = (FocusStackEntry)stackIterator.next();
+                if(fse.mClientId.equals(clientToRemove)) {
+                    Log.i(TAG, " AudioFocus  abandonAudioFocus(): removing entry for "
+                            + fse.mClientId);
+                    mFocusStack.remove(fse);
+                }
+            }
+        }
+    }
+
+    /**
+     * Helper function:
+     * Remove focus listeners from the focus stack for a particular client.
+     */
+    private void removeFocusStackEntryForClient(IBinder cb) {
+        // focus is abandoned by a client that's not at the top of the stack,
+        // no need to update focus.
+        Iterator<FocusStackEntry> stackIterator = mFocusStack.iterator();
+        while(stackIterator.hasNext()) {
+            FocusStackEntry fse = (FocusStackEntry)stackIterator.next();
+            if(fse.mSourceRef.equals(cb)) {
+                Log.i(TAG, " AudioFocus  abandonAudioFocus(): removing entry for "
+                        + fse.mClientId);
+                mFocusStack.remove(fse);
+            }
+        }
+    }
+
+    /**
+     * Helper function:
+     * Returns true if the system is in a state where the focus can be reevaluated, false otherwise.
+     */
+    private boolean canReassignFocus() {
+        // focus requests are rejected during a phone call
+        if (getMode() == AudioSystem.MODE_IN_CALL) {
+            Log.i(TAG, " AudioFocus  can't be reassigned during a call, exiting");
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Inner class to monitor audio focus client deaths, and remove them from the audio focus
+     * stack if necessary.
+     */
+    private class AudioFocusDeathHandler implements IBinder.DeathRecipient {
+        private IBinder mCb; // To be notified of client's death
+
+        AudioFocusDeathHandler(IBinder cb) {
+            mCb = cb;
+        }
+
+        public void binderDied() {
+            synchronized(mFocusStack) {
+                Log.w(TAG, "  AudioFocus   audio focus client died");
+                removeFocusStackEntryForClient(mCb);
+            }
+        }
+
+        public IBinder getBinder() {
+            return mCb;
+        }
+    }
+
+
+    /** @see AudioManager#requestAudioFocus(int, int, IBinder, IAudioFocusDispatcher, String) */
+    public int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb,
+            IAudioFocusDispatcher fd, String clientId) {
+        Log.i(TAG, " AudioFocus  requestAudioFocus() from " + clientId);
+        // the main stream type for the audio focus request is currently not used. It may
+        // potentially be used to handle multiple stream type-dependent audio focuses.
+
+        if ((cb == null) || !cb.pingBinder()) {
+            Log.i(TAG, " AudioFocus  DOA client for requestAudioFocus(), exiting");
+            return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+        }
+
+        if (!canReassignFocus()) {
+            return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
+        }
+
+        synchronized(mFocusStack) {
+            if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientId)) {
+                mFocusStack.peek().mDurationHint = durationHint;
+                // if focus is already owned by this client, don't do anything
+                return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+            }
+
+            // notify current top of stack it is losing focus
+            if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
+                try {
+                    mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange(
+                            (durationHint == AudioManager.AUDIOFOCUS_GAIN) ?
+                                    AudioManager.AUDIOFOCUS_LOSS :
+                                        AudioManager.AUDIOFOCUS_LOSS_TRANSIENT,
+                            mFocusStack.peek().mClientId);
+                } catch (RemoteException e) {
+                    Log.e(TAG, " Failure to signal loss of focus due to "+ e);
+                    e.printStackTrace();
+                }
+            }
+
+            // push focus requester at the top of the audio focus stack
+            mFocusStack.push(new FocusStackEntry(mainStreamType, durationHint, false, fd, cb,
+                    clientId));
+        }//synchronized(mFocusStack)
+
+        // handle the potential premature death of the new holder of the focus
+        // (premature death == death before abandoning focus)
+        // Register for client death notification
+        AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb);
+        try {
+            cb.linkToDeath(afdh, 0);
+        } catch (RemoteException e) {
+            // client has already died!
+            Log.w(TAG, " AudioFocus  requestAudioFocus() could not link to "+cb+" binder death");
+        }
+
+        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+    }
+
+    /** @see AudioManager#abandonAudioFocus(IBinder, IAudioFocusDispatcher, String) */
+    public int abandonAudioFocus(IAudioFocusDispatcher fl, String clientId) {
+        Log.i(TAG, " AudioFocus  abandonAudioFocus() from " + clientId);
+
+        // this will take care of notifying the new focus owner if needed
+        removeFocusStackEntry(clientId, true);
+
+        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
+    }
+
+
+    public void unregisterFocusClient(String clientId) {
+        removeFocusStackEntry(clientId, false);
+    }
+
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        // TODO probably a lot more to do here than just the audio focus stack
+        dumpFocusStack(pw);
+    }
+
+
 }
diff --git a/core/java/android/pim/DateException.java b/media/java/android/media/IAudioFocusDispatcher.aidl
old mode 100644
new mode 100755
similarity index 65%
rename from core/java/android/pim/DateException.java
rename to media/java/android/media/IAudioFocusDispatcher.aidl
index 90bfe7f..09575f7
--- a/core/java/android/pim/DateException.java
+++ b/media/java/android/media/IAudioFocusDispatcher.aidl
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 The Android Open Source Project
+ * Copyright (C) 2010 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.
@@ -14,13 +14,15 @@
  * limitations under the License.
  */
 
-package android.pim;
+package android.media;
 
-public class DateException extends Exception
-{
-    public DateException(String message)
-    {
-        super(message);
-    }
+/**
+ * AIDL for the AudioService to signal audio focus listeners of focus updates.
+ *
+ * {@hide}
+ */
+oneway interface IAudioFocusDispatcher {
+
+    void dispatchAudioFocusChange(int focusChange, String clientId);
+
 }
-
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 83581d2..b275488 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -16,6 +16,8 @@
 
 package android.media;
 
+import android.media.IAudioFocusDispatcher;
+
 /**
  * {@hide}
  */
@@ -68,4 +70,11 @@
     void setBluetoothScoOn(boolean on);
 
     boolean isBluetoothScoOn();
+
+    int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb, IAudioFocusDispatcher l,
+            String clientId);
+
+    int abandonAudioFocus(IAudioFocusDispatcher l, String clientId);
+    
+    void unregisterFocusClient(String clientId);
 }
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index 7bbd0b2..bce3371 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -199,6 +199,7 @@
     mUpdatePeriod = 0;
     mInputSource = (uint8_t)inputSource;
     mFlags = flags;
+    mInput = input;
 
     return NO_ERROR;
 }
@@ -384,6 +385,13 @@
     return NO_ERROR;
 }
 
+unsigned int AudioRecord::getInputFramesLost()
+{
+    if (mActive)
+        return AudioSystem::getInputFramesLost(mInput);
+    else
+        return 0;
+}
 
 // -------------------------------------------------------------------------
 
@@ -517,10 +525,11 @@
 
 audio_io_handle_t AudioRecord::getInput()
 {
-   return AudioSystem::getInput(mInputSource,
+    mInput = AudioSystem::getInput(mInputSource,
                                 mCblk->sampleRate,
                                 mFormat, mChannels,
                                 (AudioSystem::audio_in_acoustics)mFlags);
+    return mInput;
 }
 
 // -------------------------------------------------------------------------
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp
index 3f9c6d6..4b364f2 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -354,6 +354,16 @@
     return af->getRenderPosition(halFrames, dspFrames, getOutput((stream_type)stream));
 }
 
+unsigned int AudioSystem::getInputFramesLost(audio_io_handle_t ioHandle) {
+    const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
+    unsigned int result = 0;
+    if (af == 0) return result;
+    if (ioHandle == NULL) return result;
+
+    result = af->getInputFramesLost(ioHandle);
+    return result;
+}
+
 // ---------------------------------------------------------------------------
 
 void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who) {
diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp
index ca3a2a6..47bcc12 100644
--- a/media/libmedia/IAudioFlinger.cpp
+++ b/media/libmedia/IAudioFlinger.cpp
@@ -61,7 +61,8 @@
     CLOSE_INPUT,
     SET_STREAM_OUTPUT,
     SET_VOICE_VOLUME,
-    GET_RENDER_POSITION
+    GET_RENDER_POSITION,
+    GET_INPUT_FRAMES_LOST
 };
 
 class BpAudioFlinger : public BpInterface<IAudioFlinger>
@@ -487,6 +488,15 @@
         }
         return status;
     }
+
+    virtual unsigned int getInputFramesLost(int ioHandle)
+    {
+        Parcel data, reply;
+        data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
+        data.writeInt32(ioHandle);
+        remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply);
+        return reply.readInt32();
+    }
 };
 
 IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger");
@@ -752,6 +762,13 @@
             }
             return NO_ERROR;
         }
+        case GET_INPUT_FRAMES_LOST: {
+            CHECK_INTERFACE(IAudioFlinger, data, reply);
+            int ioHandle = data.readInt32();
+            reply->writeInt32(getInputFramesLost(ioHandle));
+            return NO_ERROR;
+        } break;
+
         default:
             return BBinder::onTransact(code, data, reply, flags);
     }
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 2157814..d2cec0c 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -304,7 +304,7 @@
 {
     LOGV("pause");
     Mutex::Autolock _l(mLock);
-    if (mCurrentState & MEDIA_PLAYER_PAUSED)
+    if (mCurrentState & (MEDIA_PLAYER_PAUSED|MEDIA_PLAYER_PLAYBACK_COMPLETE))
         return NO_ERROR;
     if ((mPlayer != 0) && (mCurrentState & MEDIA_PLAYER_STARTED)) {
         status_t ret = mPlayer->pause();
diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp
index 23024e9..5adc116 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -365,6 +365,15 @@
         return INVALID_OPERATION;
     }
 
+    bool isInvalidState = (mCurrentState &
+                           (MEDIA_RECORDER_PREPARED |
+                            MEDIA_RECORDER_RECORDING |
+                            MEDIA_RECORDER_ERROR));
+    if (isInvalidState) {
+        LOGE("setParameters is called in an invalid state: %d", mCurrentState);
+        return INVALID_OPERATION;
+    }
+
     status_t ret = mMediaRecorder->setParameters(params);
     if (OK != ret) {
         LOGE("setParameters(%s) failed: %d", params.string(), ret);
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index c26d682..594e010 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1768,7 +1768,7 @@
 status_t MediaPlayerService::AudioCache::wait()
 {
     Mutex::Autolock lock(mLock);
-    if (!mCommandComplete) {
+    while (!mCommandComplete) {
         mSignal.wait(mLock);
     }
     mCommandComplete = false;
@@ -1805,6 +1805,7 @@
     }
 
     // wake up thread
+    Mutex::Autolock lock(p->mLock);
     p->mCommandComplete = true;
     p->mSignal.signal();
 }
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index 57f58be..5e6e0da 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -18,6 +18,7 @@
 #define LOG_TAG "AudioPlayer"
 #include <utils/Log.h>
 
+#include <binder/IPCThreadState.h>
 #include <media/AudioTrack.h>
 #include <media/stagefright/AudioPlayer.h>
 #include <media/stagefright/MediaDebug.h>
@@ -164,6 +165,16 @@
 
     mSource->stop();
 
+    // The following hack is necessary to ensure that the OMX
+    // component is completely released by the time we may try
+    // to instantiate it again.
+    wp<MediaSource> tmp = mSource;
+    mSource.clear();
+    while (tmp.promote() != NULL) {
+        usleep(1000);
+    }
+    IPCThreadState::self()->flushCommands();
+
     mNumFramesPlayed = 0;
     mPositionTimeMediaUs = -1;
     mPositionTimeRealUs = -1;
diff --git a/media/libstagefright/codecs/aacdec/AACDecoder.cpp b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
index ff51e88..f0b66c9 100644
--- a/media/libstagefright/codecs/aacdec/AACDecoder.cpp
+++ b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
@@ -57,9 +57,9 @@
     mConfig->aacPlusUpsamplingFactor = 0;
     mConfig->aacPlusEnabled = false;
 
-    int32_t numChannels;
-    CHECK(mSource->getFormat()->findInt32(kKeyChannelCount, &numChannels));
-    mConfig->desiredChannels = numChannels;
+    // The software decoder doesn't properly support mono output on
+    // AACplus files. Always output stereo.
+    mConfig->desiredChannels = 2;
 
     UInt32 memRequirements = PVMP4AudioDecoderGetMemRequirements();
     mDecoderBuf = malloc(memRequirements);
@@ -127,14 +127,16 @@
 sp<MetaData> AACDecoder::getFormat() {
     sp<MetaData> srcFormat = mSource->getFormat();
 
-    int32_t numChannels;
     int32_t sampleRate;
-    CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
     CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
 
     sp<MetaData> meta = new MetaData;
     meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
-    meta->setInt32(kKeyChannelCount, numChannels);
+
+    // We'll always output stereo, regardless of how many channels are
+    // present in the input due to decoder limitations.
+    meta->setInt32(kKeyChannelCount, 2);
+
     meta->setInt32(kKeySampleRate, sampleRate);
 
     int64_t durationUs;
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 88e171d..a3bbb74 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -20,8 +20,11 @@
 import com.android.mediaframeworktest.MediaNames;
 
 import android.database.sqlite.SQLiteDatabase;
+import android.hardware.Camera;
+import android.hardware.Camera.PreviewCallback;
 import android.media.MediaPlayer;
 import android.media.MediaRecorder;
+import android.os.Looper;
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase;
 import android.test.suitebuilder.annotation.LargeTest;
@@ -42,6 +45,8 @@
 import android.media.MediaMetadataRetriever;
 import com.android.mediaframeworktest.MediaProfileReader;
 
+import android.hardware.Camera.PreviewCallback;
+
 /**
  * Junit / Instrumentation - performance measurement for media player and 
  * recorder
@@ -58,14 +63,24 @@
     private static final String MEDIA_MEMORY_OUTPUT =
         "/sdcard/mediaMemOutput.txt";
 
-    //the tolerant memory leak
-    private static final int MAX_ACCEPTED_MEMORY_LEAK_KB = 150;
-
     private static int mStartMemory = 0;
     private static int mEndMemory = 0;
     private static int mStartPid = 0;
     private static int mEndPid = 0;
 
+    private boolean mInitialized = false;
+    private Looper mLooper = null;
+    private RawPreviewCallback mRawPreviewCallback = new RawPreviewCallback();
+    private final Object lock = new Object();
+    private final Object previewDone = new Object();
+    private static int WAIT_FOR_COMMAND_TO_COMPLETE = 10000;  // Milliseconds.
+
+    //the tolerant memory leak
+    private static int ENCODER_LIMIT = 150;
+    private static int DECODER_LIMIT = 150;
+    private static int CAMERA_LIMIT = 80;
+
+    Camera mCamera;
 
     public MediaPlayerPerformance() {
         super("com.android.mediaframeworktest", MediaFrameworkTest.class);
@@ -178,6 +193,66 @@
         Log.v(TAG, "Average duration = " + sum / testFile.length);
     }
 
+    private void initializeMessageLooper() {
+        new Thread() {
+            @Override
+            public void run() {
+                Looper.prepare();
+                Log.v(TAG, "start loopRun");
+                mLooper = Looper.myLooper();
+                mCamera = Camera.open();
+                synchronized (lock) {
+                    mInitialized = true;
+                    lock.notify();
+                }
+                Looper.loop();
+                Log.v(TAG, "initializeMessageLooper: quit.");
+            }
+        }.start();
+    }
+
+    private void terminateMessageLooper() {
+        mLooper.quit();
+        mCamera.release();
+    }
+
+    private final class RawPreviewCallback implements PreviewCallback {
+        public void onPreviewFrame(byte[] rawData, Camera camera) {
+            synchronized (previewDone) {
+                previewDone.notify();
+            }
+        }
+    }
+
+    public void stressCameraPreview() {
+        try {
+            synchronized (lock) {
+                initializeMessageLooper();
+                try {
+                    lock.wait(WAIT_FOR_COMMAND_TO_COMPLETE);
+                } catch (Exception e) {
+                    Log.v(TAG, "runTestOnMethod: wait was interrupted.");
+                }
+            }
+            mCamera.setPreviewCallback(mRawPreviewCallback);
+            mSurfaceHolder = MediaFrameworkTest.mSurfaceView.getHolder();
+            mCamera.setPreviewDisplay(mSurfaceHolder);
+            mCamera.startPreview();
+            synchronized (previewDone) {
+                try {
+                    previewDone.wait(WAIT_FOR_COMMAND_TO_COMPLETE);
+                    Log.v(TAG, "Preview Done");
+                } catch (Exception e) {
+                    Log.v(TAG, "wait was interrupted.");
+                }
+            }
+            Thread.sleep(1000);
+            mCamera.stopPreview();
+            terminateMessageLooper();
+        } catch (Exception e) {
+            Log.v(TAG, e.toString());
+        }
+    }
 
     // Note: This test is to assume the mediaserver's pid is 34
     public void mediaStressPlayback(String testFilePath) {
@@ -314,8 +389,9 @@
         return vsizevalue;
     }
 
-    public boolean validateMemoryResult (int startPid, int startMemory, Writer output) throws Exception {
-        //Wait for 10 seconds to make sure the memory settle.
+    public boolean validateMemoryResult(int startPid, int startMemory, Writer output, int limit)
+            throws Exception {
+        // Wait for 10 seconds to make sure the memory settle.
         Thread.sleep(10000);
         mEndPid = getMediaserverPid();
         int memDiff = mEndMemory - startMemory;
@@ -329,9 +405,8 @@
             output.write("mediaserver died. Test failed\n");
             return false;
         }
-        //memory leak greter than the tolerant
-        if (memDiff > MAX_ACCEPTED_MEMORY_LEAK_KB )
-            return false;
+        // memory leak greter than the tolerant
+        if (memDiff > limit) return false;
         return true;
     }
 
@@ -356,7 +431,7 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, DECODER_LIMIT);
         output.close();
         assertTrue("H263 playback memory test", memoryResult);
     }
@@ -375,7 +450,7 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, DECODER_LIMIT);
         output.close();
         assertTrue("H264 playback memory test", memoryResult);
     }
@@ -394,7 +469,7 @@
                 getMemoryWriteToLog(output, i);
             }
             output.write("\n");
-            memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+            memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, DECODER_LIMIT);
             output.close();
             assertTrue("wmv playback memory test", memoryResult);
         }
@@ -415,7 +490,7 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, ENCODER_LIMIT);
         output.close();
         assertTrue("H263 record only memory test", memoryResult);
     }
@@ -435,7 +510,7 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, ENCODER_LIMIT);
         output.close();
         assertTrue("mpeg4 record only memory test", memoryResult);
     }
@@ -456,7 +531,7 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, ENCODER_LIMIT);
         output.close();
         assertTrue("H263 audio video record memory test", memoryResult);
     }
@@ -475,8 +550,27 @@
             getMemoryWriteToLog(output, i);
         }
         output.write("\n");
-        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output);
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, ENCODER_LIMIT);
         output.close();
         assertTrue("audio record only memory test", memoryResult);
     }
+
+    // Test case 8: Capture the memory usage after every 20 camera preview
+    @LargeTest
+    public void testCameraPreviewMemoryUsage() throws Exception {
+        boolean memoryResult = false;
+        mStartPid = getMediaserverPid();
+
+        File cameraPreviewMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
+        Writer output = new BufferedWriter(new FileWriter(cameraPreviewMemoryOut, true));
+        output.write("Camera Preview Only\n");
+        for (int i = 0; i < NUM_STRESS_LOOP; i++) {
+            stressCameraPreview();
+            getMemoryWriteToLog(output, i);
+        }
+        output.write("\n");
+        memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, CAMERA_LIMIT);
+        output.close();
+        assertTrue("camera preview memory test", memoryResult);
+    }
 }
diff --git a/mms-common/java/com/android/mmscommon/mms/pdu/PduPersister.java b/mms-common/java/com/android/mmscommon/mms/pdu/PduPersister.java
index 46f28c7..d92f0e1 100644
--- a/mms-common/java/com/android/mmscommon/mms/pdu/PduPersister.java
+++ b/mms-common/java/com/android/mmscommon/mms/pdu/PduPersister.java
@@ -1145,6 +1145,10 @@
             }
         }
 
+        // mark "read" and "seen"
+        values.put(Mms.READ, 0);
+        values.put(Mms.SEEN, 0);
+
         Uri res = SqliteWrapper.insert(mContext, mContentResolver, uri, values);
         if (res == null) {
             throw new MmsException("persist() failed: return null.");
diff --git a/mms-common/java/com/android/mmscommon/telephony/TelephonyProvider.java b/mms-common/java/com/android/mmscommon/telephony/TelephonyProvider.java
index 87e4758..cfc9231 100644
--- a/mms-common/java/com/android/mmscommon/telephony/TelephonyProvider.java
+++ b/mms-common/java/com/android/mmscommon/telephony/TelephonyProvider.java
@@ -51,37 +51,6 @@
     private static final boolean DEBUG = true;
     private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
 
-//    public static final Pattern EMAIL_ADDRESS
-//        = Pattern.compile(
-//            "[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}" +
-//            "\\@" +
-//            "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
-//            "(" +
-//                "\\." +
-//                "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
-//            ")+"
-//        );
-//
-//    /**
-//     * This pattern is intended for searching for things that look like they
-//     * might be phone numbers in arbitrary text, not for validating whether
-//     * something is in fact a phone number.  It will miss many things that
-//     * are legitimate phone numbers.
-//     *
-//     * <p> The pattern matches the following:
-//     * <ul>
-//     * <li>Optionally, a + sign followed immediately by one or more digits. Spaces, dots, or dashes
-//     * may follow.
-//     * <li>Optionally, sets of digits in parentheses, separated by spaces, dots, or dashes.
-//     * <li>A string starting and ending with a digit, containing digits, spaces, dots, and/or dashes.
-//     * </ul>
-//     */
-//    public static final Pattern PHONE
-//        = Pattern.compile(                                  // sdd = space, dot, or dash
-//                "(\\+[0-9]+[\\- \\.]*)?"                    // +<digits><sdd>*
-//                + "(\\([0-9]+\\)[\\- \\.]*)?"               // (<digits>)<sdd>*
-//                + "([0-9][0-9\\- \\.][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit>
-
     // Constructor
     public TelephonyProvider() {
     }
@@ -136,6 +105,12 @@
         public static final String READ = "read";
 
         /**
+         * Indicates whether this message has been seen by the user. The "seen" flag will be
+         * used to figure out whether we need to throw up a statusbar notification or not.
+         */
+        public static final String SEEN = "seen";
+
+        /**
          * The TP-Status value for the message, or -1 if no status has
          * been received
          */
@@ -706,6 +681,12 @@
         public static final String READ = "read";
 
         /**
+         * Indicates whether this message has been seen by the user. The "seen" flag will be
+         * used to figure out whether we need to throw up a statusbar notification or not.
+         */
+        public static final String SEEN = "seen";
+
+        /**
          * The Message-ID of the message.
          * <P>Type: TEXT</P>
          */
@@ -1157,6 +1138,7 @@
          * <P>Type: INTEGER</P>
          */
         public static final String READ = "read";
+
         /**
          * The snippet of the latest message in the thread.
          * <P>Type: TEXT</P>
@@ -1697,6 +1679,13 @@
              */
             public static final String LAST_TRY = "last_try";
         }
+
+        public static final class WordsTable {
+            public static final String ID = "_id";
+            public static final String SOURCE_ROW_ID = "source_id";
+            public static final String TABLE_ID = "table_to_use";
+            public static final String INDEXED_TEXT = "index_text";
+        }
     }
 
     public static final class Carriers implements BaseColumns {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index bc95b21..d24814d 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -21,6 +21,7 @@
 import android.app.ActivityManagerNative;
 import android.app.IActivityManager;
 import android.backup.BackupDataInput;
+import android.backup.IBackupManager;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.IContentService;
@@ -71,10 +72,22 @@
         } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) {
             setGpsLocation(value);
             return false;
+        } else if (Settings.Secure.BACKUP_AUTO_RESTORE.equals(name)) {
+            setAutoRestore(Integer.parseInt(value) == 1);
         }
         return true;
     }
 
+    private void setAutoRestore(boolean enabled) {
+        try {
+            IBackupManager bm = IBackupManager.Stub.asInterface(
+                    ServiceManager.getService(Context.BACKUP_SERVICE));
+            if (bm != null) {
+                bm.setAutoRestore(enabled);
+            }
+        } catch (RemoteException e) {}
+    }
+
     private void setGpsLocation(String value) {
         final String GPS = LocationManager.GPS_PROVIDER;
         boolean enabled = 
diff --git a/packages/TtsService/Android.mk b/packages/TtsService/Android.mk
index 5eb6b9c..75b26a2 100644
--- a/packages/TtsService/Android.mk
+++ b/packages/TtsService/Android.mk
@@ -8,6 +8,8 @@
 LOCAL_PACKAGE_NAME := TtsService
 LOCAL_CERTIFICATE := platform
 
+LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
+
 include $(BUILD_PACKAGE)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/packages/TtsService/proguard.flags b/packages/TtsService/proguard.flags
new file mode 100644
index 0000000..e8bee6b
--- /dev/null
+++ b/packages/TtsService/proguard.flags
@@ -0,0 +1,5 @@
+-keep class android.tts.SynthProxy {
+  int mJniData;
+  # keep all declarations for native methods
+  <methods>;
+}
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index c0e4cc0..7f76425 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -206,6 +206,9 @@
 
     private int setEngine(String enginePackageName) {
         String soFilename = "";
+        if (isDefaultEnforced()) {
+            enginePackageName = getDefaultEngine();
+        }
         // The SVOX TTS is an exception to how the TTS packaging scheme works
         // because it is part of the system and not a 3rd party add-on; thus
         // its binary is actually located under /system/lib/
@@ -779,12 +782,19 @@
                     if (mKillList.get(speechItem) == null) {
                         if (engine.length() > 0) {
                             setEngine(engine);
+                        } else {
+                            setEngine(getDefaultEngine());
                         }
                         if (language.length() > 0){
                             setLanguage("", language, country, variant);
+                        } else {
+                            setLanguage("", getDefaultLanguage(), getDefaultCountry(),
+                                    getDefaultLocVariant());
                         }
                         if (speechRate.length() > 0){
                             setSpeechRate("", Integer.parseInt(speechRate));
+                        } else {
+                            setSpeechRate("", getDefaultRate());
                         }
                         try {
                             sNativeSynth.speak(speechItem.mText, streamType);
@@ -864,12 +874,19 @@
                     if (mKillList.get(speechItem) == null){
                         if (engine.length() > 0) {
                             setEngine(engine);
+                        } else {
+                            setEngine(getDefaultEngine());
                         }
                         if (language.length() > 0){
                             setLanguage("", language, country, variant);
+                        } else {
+                            setLanguage("", getDefaultLanguage(), getDefaultCountry(),
+                                    getDefaultLocVariant());
                         }
                         if (speechRate.length() > 0){
                             setSpeechRate("", Integer.parseInt(speechRate));
+                        } else {
+                            setSpeechRate("", getDefaultRate());
                         }
                         try {
                             sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename);
diff --git a/preloaded-classes b/preloaded-classes
index 9fc000f..28cbba3 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -31,7 +31,6 @@
 android.app.IActivityManager
 android.app.IActivityManager$ContentProviderHolder
 android.app.IAlarmManager$Stub
-android.app.IDevicePolicyManager$Stub
 android.app.IStatusBar$Stub
 android.app.ITransientNotification$Stub
 android.app.Instrumentation
@@ -51,6 +50,7 @@
 android.app.SuperNotCalledException
 android.app.TabActivity
 android.app.TimePickerDialog
+android.app.admin.IDevicePolicyManager$Stub
 android.appwidget.AppWidgetHost
 android.appwidget.AppWidgetHostView
 android.appwidget.AppWidgetHostView$ParcelableSparseArray
diff --git a/services/java/com/android/server/AccessibilityManagerService.java b/services/java/com/android/server/AccessibilityManagerService.java
index c55dcb3..87de79a 100644
--- a/services/java/com/android/server/AccessibilityManagerService.java
+++ b/services/java/com/android/server/AccessibilityManagerService.java
@@ -47,7 +47,7 @@
 import android.text.TextUtils;
 import android.text.TextUtils.SimpleStringSplitter;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
 import android.util.SparseArray;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.IAccessibilityManager;
@@ -275,7 +275,7 @@
                 client.setEnabled(mIsEnabled);
                 mClients.add(client);
             } catch (RemoteException re) {
-                Log.w(LOG_TAG, "Dead AccessibilityManagerClient: " + client, re);
+                Slog.w(LOG_TAG, "Dead AccessibilityManagerClient: " + client, re);
             }
         }
     }
@@ -309,13 +309,13 @@
                     service.mServiceInterface.onInterrupt();
                 } catch (RemoteException re) {
                     if (re instanceof DeadObjectException) {
-                        Log.w(LOG_TAG, "Dead " + service.mService + ". Cleaning up.");
+                        Slog.w(LOG_TAG, "Dead " + service.mService + ". Cleaning up.");
                         if (removeDeadServiceLocked(service)) {
                             count--;
                             i--;
                         }
                     } else {
-                        Log.e(LOG_TAG, "Error during sending interrupt request to "
+                        Slog.e(LOG_TAG, "Error during sending interrupt request to "
                                 + service.mService, re);
                     }
                 }
@@ -343,7 +343,7 @@
                 }
                 return;
             default:
-                Log.w(LOG_TAG, "Unknown message type: " + message.what);
+                Slog.w(LOG_TAG, "Unknown message type: " + message.what);
         }
     }
 
@@ -451,16 +451,16 @@
         try {
             listener.onAccessibilityEvent(event);
             if (Config.DEBUG) {
-                Log.i(LOG_TAG, "Event " + event + " sent to " + listener);
+                Slog.i(LOG_TAG, "Event " + event + " sent to " + listener);
             }
         } catch (RemoteException re) {
             if (re instanceof DeadObjectException) {
-                Log.w(LOG_TAG, "Dead " + service.mService + ". Cleaning up.");
+                Slog.w(LOG_TAG, "Dead " + service.mService + ". Cleaning up.");
                 synchronized (mLock) {
                     removeDeadServiceLocked(service);
                 }
             } else {
-                Log.e(LOG_TAG, "Error during sending " + event + " to " + service.mService, re);
+                Slog.e(LOG_TAG, "Error during sending " + event + " to " + service.mService, re);
             }
         }
     }
@@ -476,7 +476,7 @@
         mHandler.removeMessages(service.mId);
 
         if (Config.DEBUG) {
-            Log.i(LOG_TAG, "Dead service " + service.mService + " removed");
+            Slog.i(LOG_TAG, "Dead service " + service.mService + " removed");
         }
 
         if (mServices.isEmpty()) {
@@ -722,7 +722,7 @@
                     }
                 }
             } catch (RemoteException re) {
-                Log.w(LOG_TAG, "Error while setting Controller for service: " + service, re);
+                Slog.w(LOG_TAG, "Error while setting Controller for service: " + service, re);
             }
         }
 
diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java
index f480209..43fe6ab 100644
--- a/services/java/com/android/server/AlarmManagerService.java
+++ b/services/java/com/android/server/AlarmManagerService.java
@@ -37,7 +37,7 @@
 import android.text.TextUtils;
 import android.text.format.Time;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -141,7 +141,7 @@
         if (mDescriptor != -1) {
             mWaitThread.start();
         } else {
-            Log.w(TAG, "Failed to open alarm driver. Falling back to a handler.");
+            Slog.w(TAG, "Failed to open alarm driver. Falling back to a handler.");
         }
     }
     
@@ -160,7 +160,7 @@
     public void setRepeating(int type, long triggerAtTime, long interval, 
             PendingIntent operation) {
         if (operation == null) {
-            Log.w(TAG, "set/setRepeating ignored because there is no intent");
+            Slog.w(TAG, "set/setRepeating ignored because there is no intent");
             return;
         }
         synchronized (mLock) {
@@ -173,7 +173,7 @@
             // Remove this alarm if already scheduled.
             removeLocked(operation);
 
-            if (localLOGV) Log.v(TAG, "set: " + alarm);
+            if (localLOGV) Slog.v(TAG, "set: " + alarm);
 
             int index = addAlarmLocked(alarm);
             if (index == 0) {
@@ -185,7 +185,7 @@
     public void setInexactRepeating(int type, long triggerAtTime, long interval, 
             PendingIntent operation) {
         if (operation == null) {
-            Log.w(TAG, "setInexactRepeating ignored because there is no intent");
+            Slog.w(TAG, "setInexactRepeating ignored because there is no intent");
             return;
         }
 
@@ -237,7 +237,7 @@
 
         // Remember where this bucket started (reducing the amount of later 
         // fixup required) and set the alarm with the new, bucketed start time.
-        if (localLOGV) Log.v(TAG, "setInexactRepeating: interval=" + interval
+        if (localLOGV) Slog.v(TAG, "setInexactRepeating: interval=" + interval
                 + " bucketTime=" + bucketTime);
         mInexactDeliveryTimes[intervalSlot] = bucketTime;
         setRepeating(type, bucketTime, interval, operation);
@@ -264,7 +264,7 @@
         synchronized (this) {
             String current = SystemProperties.get(TIMEZONE_PROPERTY);
             if (current == null || !current.equals(zone.getID())) {
-                if (localLOGV) Log.v(TAG, "timezone changed: " + current + ", new=" + zone.getID());
+                if (localLOGV) Slog.v(TAG, "timezone changed: " + current + ", new=" + zone.getID());
                 timeZoneWasChanged = true; 
                 SystemProperties.set(TIMEZONE_PROPERTY, zone.getID());
             }
@@ -379,18 +379,18 @@
         if (index < 0) {
             index = 0 - index - 1;
         }
-        if (localLOGV) Log.v(TAG, "Adding alarm " + alarm + " at " + index);
+        if (localLOGV) Slog.v(TAG, "Adding alarm " + alarm + " at " + index);
         alarmList.add(index, alarm);
 
         if (localLOGV) {
             // Display the list of alarms for this alarm type
-            Log.v(TAG, "alarms: " + alarmList.size() + " type: " + alarm.type);
+            Slog.v(TAG, "alarms: " + alarmList.size() + " type: " + alarm.type);
             int position = 0;
             for (Alarm a : alarmList) {
                 Time time = new Time();
                 time.set(a.when);
                 String timeStr = time.format("%b %d %I:%M:%S %p");
-                Log.v(TAG, position + ": " + timeStr
+                Slog.v(TAG, position + ": " + timeStr
                         + " " + a.operation.getTargetPackage());
                 position += 1;
             }
@@ -514,7 +514,7 @@
         {
             Alarm alarm = it.next();
 
-            if (localLOGV) Log.v(TAG, "Checking active alarm when=" + alarm.when + " " + alarm);
+            if (localLOGV) Slog.v(TAG, "Checking active alarm when=" + alarm.when + " " + alarm);
 
             if (alarm.when > now) {
                 // don't fire alarms in the future
@@ -526,14 +526,14 @@
             // the Calendar app with a reminder that is in the past. In that
             // case, the reminder alarm will fire immediately.
             if (localLOGV && now - alarm.when > LATE_ALARM_THRESHOLD) {
-                Log.v(TAG, "alarm is late! alarm time: " + alarm.when
+                Slog.v(TAG, "alarm is late! alarm time: " + alarm.when
                         + " now: " + now + " delay (in seconds): "
                         + (now - alarm.when) / 1000);
             }
 
             // Recurring alarms may have passed several alarm intervals while the
             // phone was asleep or off, so pass a trigger count when sending them.
-            if (localLOGV) Log.v(TAG, "Alarm triggering: " + alarm);
+            if (localLOGV) Slog.v(TAG, "Alarm triggering: " + alarm);
             alarm.count = 1;
             if (alarm.repeatInterval > 0) {
                 // this adjustment will be zero if we're late by
@@ -644,7 +644,7 @@
                 synchronized (mLock) {
                     final long nowRTC = System.currentTimeMillis();
                     final long nowELAPSED = SystemClock.elapsedRealtime();
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                         TAG, "Checking for alarms... rtc=" + nowRTC
                         + ", elapsed=" + nowELAPSED);
 
@@ -665,7 +665,7 @@
                     while (it.hasNext()) {
                         Alarm alarm = it.next();
                         try {
-                            if (localLOGV) Log.v(TAG, "sending alarm " + alarm);
+                            if (localLOGV) Slog.v(TAG, "sending alarm " + alarm);
                             alarm.operation.send(mContext, 0,
                                     mBackgroundIntent.putExtra(
                                             Intent.EXTRA_ALARM_COUNT, alarm.count),
@@ -696,7 +696,7 @@
                                 remove(alarm.operation);
                             }
                         } catch (RuntimeException e) {
-                            Log.w(TAG, "Failure sending alarm.", e);
+                            Slog.w(TAG, "Failure sending alarm.", e);
                         }
                     }
                 }
diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java
index a5b0db9..e5a5e03 100644
--- a/services/java/com/android/server/AppWidgetService.java
+++ b/services/java/com/android/server/AppWidgetService.java
@@ -38,7 +38,7 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.util.AttributeSet;
-import android.util.Log;
+import android.util.Slog;
 import android.util.TypedValue;
 import android.util.Xml;
 import android.widget.RemoteViews;
@@ -428,7 +428,7 @@
         synchronized (mAppWidgetIds) {
             Provider p = lookupProviderLocked(provider);
             if (p == null) {
-                Log.w(TAG, "updateAppWidgetProvider: provider doesn't exist: " + provider);
+                Slog.w(TAG, "updateAppWidgetProvider: provider doesn't exist: " + provider);
                 return;
             }
             ArrayList<AppWidgetId> instances = p.instances;
@@ -683,7 +683,7 @@
             parser = activityInfo.loadXmlMetaData(mPackageManager,
                     AppWidgetManager.META_DATA_APPWIDGET_PROVIDER);
             if (parser == null) {
-                Log.w(TAG, "No " + AppWidgetManager.META_DATA_APPWIDGET_PROVIDER + " meta-data for "
+                Slog.w(TAG, "No " + AppWidgetManager.META_DATA_APPWIDGET_PROVIDER + " meta-data for "
                         + "AppWidget provider '" + component + '\'');
                 return null;
             }
@@ -698,7 +698,7 @@
             
             String nodeName = parser.getName();
             if (!"appwidget-provider".equals(nodeName)) {
-                Log.w(TAG, "Meta-data does not start with appwidget-provider tag for"
+                Slog.w(TAG, "Meta-data does not start with appwidget-provider tag for"
                         + " AppWidget provider '" + component + '\'');
                 return null;
             }
@@ -737,7 +737,7 @@
             // Ok to catch Exception here, because anything going wrong because
             // of what a client process passes to us should not be fatal for the
             // system process.
-            Log.w(TAG, "XML parsing failed for AppWidget provider '" + component + '\'', e);
+            Slog.w(TAG, "XML parsing failed for AppWidget provider '" + component + '\'', e);
             return null;
         } finally {
             if (parser != null) parser.close();
@@ -829,7 +829,7 @@
         }
 
         if (!writeStateToFileLocked(temp)) {
-            Log.w(TAG, "Failed to persist new settings");
+            Slog.w(TAG, "Failed to persist new settings");
             return;
         }
 
@@ -980,7 +980,7 @@
                             int pIndex = Integer.parseInt(providerString, 16);
                             id.provider = loadedProviders.get(pIndex);
                             if (false) {
-                                Log.d(TAG, "bound appWidgetId=" + id.appWidgetId + " to provider "
+                                Slog.d(TAG, "bound appWidgetId=" + id.appWidgetId + " to provider "
                                         + pIndex + " which is " + id.provider);
                             }
                             if (id.provider == null) {
@@ -1007,15 +1007,15 @@
             } while (type != XmlPullParser.END_DOCUMENT);
             success = true;
         } catch (NullPointerException e) {
-            Log.w(TAG, "failed parsing " + file, e);
+            Slog.w(TAG, "failed parsing " + file, e);
         } catch (NumberFormatException e) {
-            Log.w(TAG, "failed parsing " + file, e);
+            Slog.w(TAG, "failed parsing " + file, e);
         } catch (XmlPullParserException e) {
-            Log.w(TAG, "failed parsing " + file, e);
+            Slog.w(TAG, "failed parsing " + file, e);
         } catch (IOException e) {
-            Log.w(TAG, "failed parsing " + file, e);
+            Slog.w(TAG, "failed parsing " + file, e);
         } catch (IndexOutOfBoundsException e) {
-            Log.w(TAG, "failed parsing " + file, e);
+            Slog.w(TAG, "failed parsing " + file, e);
         }
         try {
             if (stream != null) {
@@ -1055,7 +1055,7 @@
     BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
-            //Log.d(TAG, "received " + action);
+            //Slog.d(TAG, "received " + action);
             if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
                 sendInitialBroadcasts();
             } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 27faf3d..8b0c264 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -56,7 +56,7 @@
 import android.os.SystemClock;
 import android.provider.Settings;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 
@@ -261,7 +261,7 @@
 
                 IBackupTransport transport = getTransport(mCurrentTransport);
                 if (transport == null) {
-                    Log.v(TAG, "Backup requested but no transport available");
+                    Slog.v(TAG, "Backup requested but no transport available");
                     mWakelock.release();
                     break;
                 }
@@ -277,7 +277,7 @@
                         for (BackupRequest b: mPendingBackups.values()) {
                             queue.add(b);
                         }
-                        if (DEBUG) Log.v(TAG, "clearing pending backups");
+                        if (DEBUG) Slog.v(TAG, "clearing pending backups");
                         mPendingBackups.clear();
 
                         // Start a new backup-queue journal file too
@@ -294,7 +294,7 @@
                     // at next boot and the journaled requests fulfilled.
                     (new PerformBackupTask(transport, queue, oldJournal)).run();
                 } else {
-                    Log.v(TAG, "Backup requested but nothing pending");
+                    Slog.v(TAG, "Backup requested but nothing pending");
                     mWakelock.release();
                 }
                 break;
@@ -306,7 +306,7 @@
             case MSG_RUN_RESTORE:
             {
                 RestoreParams params = (RestoreParams)msg.obj;
-                Log.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
+                Slog.d(TAG, "MSG_RUN_RESTORE observer=" + params.observer);
                 (new PerformRestoreTask(params.transport, params.observer,
                         params.token, params.pkgInfo, params.pmToken)).run();
                 break;
@@ -339,7 +339,7 @@
                     final int token = msg.arg1;
                     int state = mCurrentOperations.get(token, OP_TIMEOUT);
                     if (state == OP_PENDING) {
-                        if (DEBUG) Log.v(TAG, "TIMEOUT: token=" + token);
+                        if (DEBUG) Slog.v(TAG, "TIMEOUT: token=" + token);
                         mCurrentOperations.put(token, OP_TIMEOUT);
                     }
                     mCurrentOpLock.notifyAll();
@@ -430,7 +430,7 @@
         if ("".equals(mCurrentTransport)) {
             mCurrentTransport = null;
         }
-        if (DEBUG) Log.v(TAG, "Starting with transport " + mCurrentTransport);
+        if (DEBUG) Slog.v(TAG, "Starting with transport " + mCurrentTransport);
 
         // Attach to the Google backup transport.  When this comes up, it will set
         // itself as the current transport because we explicitly reset mCurrentTransport
@@ -458,19 +458,19 @@
                     if (mPendingInits.size() > 0) {
                         // If there are pending init operations, we process those
                         // and then settle into the usual periodic backup schedule.
-                        if (DEBUG) Log.v(TAG, "Init pending at scheduled backup");
+                        if (DEBUG) Slog.v(TAG, "Init pending at scheduled backup");
                         try {
                             mAlarmManager.cancel(mRunInitIntent);
                             mRunInitIntent.send();
                         } catch (PendingIntent.CanceledException ce) {
-                            Log.e(TAG, "Run init intent cancelled");
+                            Slog.e(TAG, "Run init intent cancelled");
                             // can't really do more than bail here
                         }
                     } else {
                         // Don't run backups now if we're disabled or not yet
                         // fully set up.
                         if (mEnabled && mProvisioned) {
-                            if (DEBUG) Log.v(TAG, "Running a backup pass");
+                            if (DEBUG) Slog.v(TAG, "Running a backup pass");
 
                             // Acquire the wakelock and pass it to the backup thread.  it will
                             // be released once backup concludes.
@@ -479,7 +479,7 @@
                             Message msg = mBackupHandler.obtainMessage(MSG_RUN_BACKUP);
                             mBackupHandler.sendMessage(msg);
                         } else {
-                            Log.w(TAG, "Backup pass but e=" + mEnabled + " p=" + mProvisioned);
+                            Slog.w(TAG, "Backup pass but e=" + mEnabled + " p=" + mProvisioned);
                         }
                     }
                 }
@@ -491,7 +491,7 @@
         public void onReceive(Context context, Intent intent) {
             if (RUN_INITIALIZE_ACTION.equals(intent.getAction())) {
                 synchronized (mQueueLock) {
-                    if (DEBUG) Log.v(TAG, "Running a device init");
+                    if (DEBUG) Slog.v(TAG, "Running a device init");
 
                     // Acquire the wakelock and pass it to the init thread.  it will
                     // be released once init concludes.
@@ -505,7 +505,7 @@
     }
 
     private void initPackageTracking() {
-        if (DEBUG) Log.v(TAG, "Initializing package tracking");
+        if (DEBUG) Slog.v(TAG, "Initializing package tracking");
 
         // Remember our ancestral dataset
         mTokenFile = new File(mBaseStateDir, "ancestral");
@@ -527,9 +527,9 @@
             }
         } catch (FileNotFoundException fnf) {
             // Probably innocuous
-            Log.v(TAG, "No ancestral data");
+            Slog.v(TAG, "No ancestral data");
         } catch (IOException e) {
-            Log.w(TAG, "Unable to read token file", e);
+            Slog.w(TAG, "Unable to read token file", e);
         }
 
         // Keep a log of what apps we've ever backed up.  Because we might have
@@ -562,20 +562,20 @@
                         info = mPackageManager.getPackageInfo(pkg, 0);
                         mEverStoredApps.add(pkg);
                         temp.writeUTF(pkg);
-                        if (DEBUG) Log.v(TAG, "   + " + pkg);
+                        if (DEBUG) Slog.v(TAG, "   + " + pkg);
                     } catch (NameNotFoundException e) {
                         // nope, this package was uninstalled; don't include it
-                        if (DEBUG) Log.v(TAG, "   - " + pkg);
+                        if (DEBUG) Slog.v(TAG, "   - " + pkg);
                     }
                 }
             } catch (EOFException e) {
                 // Once we've rewritten the backup history log, atomically replace the
                 // old one with the new one then reopen the file for continuing use.
                 if (!tempProcessedFile.renameTo(mEverStored)) {
-                    Log.e(TAG, "Error renaming " + tempProcessedFile + " to " + mEverStored);
+                    Slog.e(TAG, "Error renaming " + tempProcessedFile + " to " + mEverStored);
                 }
             } catch (IOException e) {
-                Log.e(TAG, "Error in processed file", e);
+                Slog.e(TAG, "Error in processed file", e);
             } finally {
                 try { if (temp != null) temp.close(); } catch (IOException e) {}
                 try { if (in != null) in.close(); } catch (IOException e) {}
@@ -604,17 +604,17 @@
                 // backup.
                 RandomAccessFile in = null;
                 try {
-                    Log.i(TAG, "Found stale backup journal, scheduling:");
+                    Slog.i(TAG, "Found stale backup journal, scheduling:");
                     in = new RandomAccessFile(f, "r");
                     while (true) {
                         String packageName = in.readUTF();
-                        Log.i(TAG, "    + " + packageName);
+                        Slog.i(TAG, "    + " + packageName);
                         dataChanged(packageName);
                     }
                 } catch (EOFException e) {
                     // no more data; we're done
                 } catch (Exception e) {
-                    Log.e(TAG, "Can't read " + f, e);
+                    Slog.e(TAG, "Can't read " + f, e);
                 } finally {
                     // close/delete the file
                     try { if (in != null) in.close(); } catch (IOException e) {}
@@ -627,7 +627,7 @@
     // Maintain persistent state around whether need to do an initialize operation.
     // Must be called with the queue lock held.
     void recordInitPendingLocked(boolean isPending, String transportName) {
-        if (DEBUG) Log.i(TAG, "recordInitPendingLocked: " + isPending
+        if (DEBUG) Slog.i(TAG, "recordInitPendingLocked: " + isPending
                 + " on transport " + transportName);
         try {
             IBackupTransport transport = getTransport(transportName);
@@ -691,7 +691,7 @@
     // is an unregistration, and the transport's entry is removed from our bookkeeping.
     private void registerTransport(String name, IBackupTransport transport) {
         synchronized (mTransports) {
-            if (DEBUG) Log.v(TAG, "Registering transport " + name + " = " + transport);
+            if (DEBUG) Slog.v(TAG, "Registering transport " + name + " = " + transport);
             if (transport != null) {
                 mTransports.put(name, transport);
             } else {
@@ -731,7 +731,7 @@
     // ----- Track installation/removal of packages -----
     BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         public void onReceive(Context context, Intent intent) {
-            if (DEBUG) Log.d(TAG, "Received broadcast " + intent);
+            if (DEBUG) Slog.d(TAG, "Received broadcast " + intent);
 
             String action = intent.getAction();
             boolean replacing = false;
@@ -789,13 +789,13 @@
     // ----- Track connection to GoogleBackupTransport service -----
     ServiceConnection mGoogleConnection = new ServiceConnection() {
         public void onServiceConnected(ComponentName name, IBinder service) {
-            if (DEBUG) Log.v(TAG, "Connected to Google transport");
+            if (DEBUG) Slog.v(TAG, "Connected to Google transport");
             mGoogleTransport = IBackupTransport.Stub.asInterface(service);
             registerTransport(name.flattenToShortString(), mGoogleTransport);
         }
 
         public void onServiceDisconnected(ComponentName name) {
-            if (DEBUG) Log.v(TAG, "Disconnected from Google transport");
+            if (DEBUG) Slog.v(TAG, "Disconnected from Google transport");
             mGoogleTransport = null;
             registerTransport(name.flattenToShortString(), null);
         }
@@ -805,7 +805,7 @@
     // If 'packageName' is null, adds all backup agents in the whole system.
     void addPackageParticipantsLocked(String packageName) {
         // Look for apps that define the android:backupAgent attribute
-        if (DEBUG) Log.v(TAG, "addPackageParticipantsLocked: " + packageName);
+        if (DEBUG) Slog.v(TAG, "addPackageParticipantsLocked: " + packageName);
         List<PackageInfo> targetApps = allAgentPackages();
         addPackageParticipantsLockedInner(packageName, targetApps);
     }
@@ -813,9 +813,9 @@
     private void addPackageParticipantsLockedInner(String packageName,
             List<PackageInfo> targetPkgs) {
         if (DEBUG) {
-            Log.v(TAG, "Adding " + targetPkgs.size() + " backup participants:");
+            Slog.v(TAG, "Adding " + targetPkgs.size() + " backup participants:");
             for (PackageInfo p : targetPkgs) {
-                Log.v(TAG, "    " + p + " agent=" + p.applicationInfo.backupAgentName
+                Slog.v(TAG, "    " + p + " agent=" + p.applicationInfo.backupAgentName
                         + " uid=" + p.applicationInfo.uid
                         + " killAfterRestore="
                         + (((p.applicationInfo.flags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) ? "true" : "false")
@@ -837,7 +837,7 @@
 
                 // If we've never seen this app before, schedule a backup for it
                 if (!mEverStoredApps.contains(pkg.packageName)) {
-                    if (DEBUG) Log.i(TAG, "New app " + pkg.packageName
+                    if (DEBUG) Slog.i(TAG, "New app " + pkg.packageName
                             + " never backed up; scheduling");
                     dataChanged(pkg.packageName);
                 }
@@ -848,7 +848,7 @@
     // Remove the given package's entry from our known active set.  If
     // 'packageName' is null, *all* participating apps will be removed.
     void removePackageParticipantsLocked(String packageName) {
-        if (DEBUG) Log.v(TAG, "removePackageParticipantsLocked: " + packageName);
+        if (DEBUG) Slog.v(TAG, "removePackageParticipantsLocked: " + packageName);
         List<PackageInfo> allApps = null;
         if (packageName != null) {
             allApps = new ArrayList<PackageInfo>();
@@ -868,10 +868,10 @@
     private void removePackageParticipantsLockedInner(String packageName,
             List<PackageInfo> agents) {
         if (DEBUG) {
-            Log.v(TAG, "removePackageParticipantsLockedInner (" + packageName
+            Slog.v(TAG, "removePackageParticipantsLockedInner (" + packageName
                     + ") removing " + agents.size() + " entries");
             for (PackageInfo p : agents) {
-                Log.v(TAG, "    - " + p);
+                Slog.v(TAG, "    - " + p);
             }
         }
         for (PackageInfo pkg : agents) {
@@ -927,10 +927,10 @@
     // action cannot be passed a null package name.
     void updatePackageParticipantsLocked(String packageName) {
         if (packageName == null) {
-            Log.e(TAG, "updatePackageParticipants called with null package name");
+            Slog.e(TAG, "updatePackageParticipants called with null package name");
             return;
         }
-        if (DEBUG) Log.v(TAG, "updatePackageParticipantsLocked: " + packageName);
+        if (DEBUG) Slog.v(TAG, "updatePackageParticipantsLocked: " + packageName);
 
         // brute force but small code size
         List<PackageInfo> allApps = allAgentPackages();
@@ -952,7 +952,7 @@
                 out.seek(out.length());
                 out.writeUTF(packageName);
             } catch (IOException e) {
-                Log.e(TAG, "Can't log backup of " + packageName + " to " + mEverStored);
+                Slog.e(TAG, "Can't log backup of " + packageName + " to " + mEverStored);
             } finally {
                 try { if (out != null) out.close(); } catch (IOException e) {}
             }
@@ -961,7 +961,7 @@
 
     // Remove our awareness of having ever backed up the given package
     void removeEverBackedUp(String packageName) {
-        if (DEBUG) Log.v(TAG, "Removing backed-up knowledge of " + packageName + ", new set:");
+        if (DEBUG) Slog.v(TAG, "Removing backed-up knowledge of " + packageName + ", new set:");
 
         synchronized (mEverStoredApps) {
             // Rewrite the file and rename to overwrite.  If we reboot in the middle,
@@ -974,7 +974,7 @@
                 mEverStoredApps.remove(packageName);
                 for (String s : mEverStoredApps) {
                     known.writeUTF(s);
-                    if (DEBUG) Log.v(TAG, "    " + s);
+                    if (DEBUG) Slog.v(TAG, "    " + s);
                 }
                 known.close();
                 known = null;
@@ -986,7 +986,7 @@
                 // abandon the whole process and remove all what's-backed-up
                 // state entirely, meaning we'll force a backup pass for every
                 // participant on the next boot or [re]install.
-                Log.w(TAG, "Error rewriting " + mEverStored, e);
+                Slog.w(TAG, "Error rewriting " + mEverStored, e);
                 mEverStoredApps.clear();
                 tempKnownFile.delete();
                 mEverStored.delete();
@@ -1015,15 +1015,15 @@
                 af.writeInt(-1);
             } else {
                 af.writeInt(mAncestralPackages.size());
-                if (DEBUG) Log.v(TAG, "Ancestral packages:  " + mAncestralPackages.size());
+                if (DEBUG) Slog.v(TAG, "Ancestral packages:  " + mAncestralPackages.size());
                 for (String pkgName : mAncestralPackages) {
                     af.writeUTF(pkgName);
-                    if (DEBUG) Log.v(TAG, "   " + pkgName);
+                    if (DEBUG) Slog.v(TAG, "   " + pkgName);
                 }
             }
             af.close();
         } catch (IOException e) {
-            Log.w(TAG, "Unable to write token file:", e);
+            Slog.w(TAG, "Unable to write token file:", e);
         }
     }
 
@@ -1032,7 +1032,7 @@
         synchronized (mTransports) {
             IBackupTransport transport = mTransports.get(transportName);
             if (transport == null) {
-                Log.w(TAG, "Requested unavailable transport: " + transportName);
+                Slog.w(TAG, "Requested unavailable transport: " + transportName);
             }
             return transport;
         }
@@ -1046,7 +1046,7 @@
             mConnectedAgent = null;
             try {
                 if (mActivityManager.bindBackupAgent(app, mode)) {
-                    Log.d(TAG, "awaiting agent for " + app);
+                    Slog.d(TAG, "awaiting agent for " + app);
 
                     // success; wait for the agent to arrive
                     // only wait 10 seconds for the clear data to happen
@@ -1063,7 +1063,7 @@
 
                     // if we timed out with no connect, abort and move on
                     if (mConnecting == true) {
-                        Log.w(TAG, "Timeout waiting for agent " + app);
+                        Slog.w(TAG, "Timeout waiting for agent " + app);
                         return null;
                     }
                     agent = mConnectedAgent;
@@ -1081,12 +1081,12 @@
         try {
             PackageInfo info = mPackageManager.getPackageInfo(packageName, 0);
             if ((info.applicationInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) {
-                if (DEBUG) Log.i(TAG, "allowClearUserData=false so not wiping "
+                if (DEBUG) Slog.i(TAG, "allowClearUserData=false so not wiping "
                         + packageName);
                 return;
             }
         } catch (NameNotFoundException e) {
-            Log.w(TAG, "Tried to clear data for " + packageName + " but not found");
+            Slog.w(TAG, "Tried to clear data for " + packageName + " but not found");
             return;
         }
 
@@ -1151,13 +1151,13 @@
             }
         }
         mBackupHandler.removeMessages(MSG_TIMEOUT);
-        if (DEBUG) Log.v(TAG, "operation " + Integer.toHexString(token)
+        if (DEBUG) Slog.v(TAG, "operation " + Integer.toHexString(token)
                 + " complete: finalState=" + finalState);
         return finalState == OP_ACKNOWLEDGED;
     }
 
     void prepareOperationTimeout(int token, long interval) {
-        if (DEBUG) Log.v(TAG, "starting timeout: token=" + Integer.toHexString(token)
+        if (DEBUG) Slog.v(TAG, "starting timeout: token=" + Integer.toHexString(token)
                 + " interval=" + interval);
         mCurrentOperations.put(token, OP_PENDING);
         Message msg = mBackupHandler.obtainMessage(MSG_TIMEOUT, token, 0);
@@ -1189,7 +1189,7 @@
         public void run() {
             int status = BackupConstants.TRANSPORT_OK;
             long startRealtime = SystemClock.elapsedRealtime();
-            if (DEBUG) Log.v(TAG, "Beginning backup of " + mQueue.size() + " targets");
+            if (DEBUG) Slog.v(TAG, "Beginning backup of " + mQueue.size() + " targets");
 
             // Backups run at background priority
             Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
@@ -1200,14 +1200,14 @@
                 // If we haven't stored package manager metadata yet, we must init the transport.
                 File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
                 if (status == BackupConstants.TRANSPORT_OK && pmState.length() <= 0) {
-                    Log.i(TAG, "Initializing (wiping) backup state and transport storage");
+                    Slog.i(TAG, "Initializing (wiping) backup state and transport storage");
                     resetBackupState(mStateDir);  // Just to make sure.
                     status = mTransport.initializeDevice();
                     if (status == BackupConstants.TRANSPORT_OK) {
                         EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
                     } else {
                         EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
-                        Log.e(TAG, "Transport error in initializeDevice()");
+                        Slog.e(TAG, "Transport error in initializeDevice()");
                     }
                 }
 
@@ -1238,7 +1238,7 @@
                         EventLog.writeEvent(EventLogTags.BACKUP_SUCCESS, mQueue.size(), millis);
                     } else {
                         EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(finish)");
-                        Log.e(TAG, "Transport error in finishBackup()");
+                        Slog.e(TAG, "Transport error in finishBackup()");
                     }
                 }
 
@@ -1250,7 +1250,7 @@
                     resetBackupState(mStateDir);
                 }
             } catch (Exception e) {
-                Log.e(TAG, "Error in backup thread", e);
+                Slog.e(TAG, "Error in backup thread", e);
                 status = BackupConstants.TRANSPORT_ERROR;
             } finally {
                 // If everything actually went through and this is the first time we've
@@ -1268,7 +1268,7 @@
                 // the current active pending-backup file, not in the we are holding
                 // here in mJournal.
                 if (status != BackupConstants.TRANSPORT_OK) {
-                    Log.w(TAG, "Backup pass unsuccessful, restaging");
+                    Slog.w(TAG, "Backup pass unsuccessful, restaging");
                     for (BackupRequest req : mQueue) {
                         dataChanged(req.appInfo.packageName);
                     }
@@ -1285,7 +1285,7 @@
                 // re-enqueued all of these packages in the current active journal.
                 // Either way, we no longer need this pass's journal.
                 if (mJournal != null && !mJournal.delete()) {
-                    Log.e(TAG, "Unable to remove backup journal file " + mJournal);
+                    Slog.e(TAG, "Unable to remove backup journal file " + mJournal);
                 }
 
                 // Only once we're entirely finished do we release the wakelock
@@ -1299,7 +1299,7 @@
 
         private int doQueuedBackups(IBackupTransport transport) {
             for (BackupRequest request : mQueue) {
-                Log.d(TAG, "starting agent for backup of " + request);
+                Slog.d(TAG, "starting agent for backup of " + request);
 
                 IBackupAgent agent = null;
                 int mode = (request.fullBackup)
@@ -1313,7 +1313,7 @@
                     }
                 } catch (SecurityException ex) {
                     // Try for the next one.
-                    Log.d(TAG, "error in bind/backup", ex);
+                    Slog.d(TAG, "error in bind/backup", ex);
                 } finally {
                     try {  // unbind even on timeout, just in case
                         mActivityManager.unbindBackupAgent(request.appInfo);
@@ -1327,7 +1327,7 @@
         private int processOneBackup(BackupRequest request, IBackupAgent agent,
                 IBackupTransport transport) {
             final String packageName = request.appInfo.packageName;
-            if (DEBUG) Log.d(TAG, "processOneBackup doBackup() on " + packageName);
+            if (DEBUG) Slog.d(TAG, "processOneBackup doBackup() on " + packageName);
 
             File savedStateName = new File(mStateDir, packageName);
             File backupDataName = new File(mDataDir, packageName + ".data");
@@ -1381,9 +1381,9 @@
                 }
 
                 logBackupComplete(packageName);
-                if (DEBUG) Log.v(TAG, "doBackup() success");
+                if (DEBUG) Slog.v(TAG, "doBackup() success");
             } catch (Exception e) {
-                Log.e(TAG, "Error backing up " + packageName, e);
+                Slog.e(TAG, "Error backing up " + packageName, e);
                 EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName, e.toString());
                 backupDataName.delete();
                 newStateName.delete();
@@ -1418,7 +1418,7 @@
                         result = transport.finishBackup();
                     }
                 } else {
-                    if (DEBUG) Log.i(TAG, "no backup data written; not calling transport");
+                    if (DEBUG) Slog.i(TAG, "no backup data written; not calling transport");
                 }
 
                 // After successful transport, delete the now-stale data
@@ -1432,7 +1432,7 @@
                     EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
                 }
             } catch (Exception e) {
-                Log.e(TAG, "Transport error backing up " + packageName, e);
+                Slog.e(TAG, "Transport error backing up " + packageName, e);
                 EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
                 result = BackupConstants.TRANSPORT_ERROR;
             } finally {
@@ -1453,14 +1453,14 @@
         // partition will be signed with the device's platform certificate, so on
         // different phones the same system app will have different signatures.)
         if ((target.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
-            if (DEBUG) Log.v(TAG, "System app " + target.packageName + " - skipping sig check");
+            if (DEBUG) Slog.v(TAG, "System app " + target.packageName + " - skipping sig check");
             return true;
         }
 
         // Allow unsigned apps, but not signed on one device and unsigned on the other
         // !!! TODO: is this the right policy?
         Signature[] deviceSigs = target.signatures;
-        if (DEBUG) Log.v(TAG, "signaturesMatch(): stored=" + storedSigs
+        if (DEBUG) Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs
                 + " device=" + deviceSigs);
         if ((storedSigs == null || storedSigs.length == 0)
                 && (deviceSigs == null || deviceSigs.length == 0)) {
@@ -1526,7 +1526,7 @@
 
         public void run() {
             long startRealtime = SystemClock.elapsedRealtime();
-            if (DEBUG) Log.v(TAG, "Beginning restore process mTransport=" + mTransport
+            if (DEBUG) Slog.v(TAG, "Beginning restore process mTransport=" + mTransport
                     + " mObserver=" + mObserver + " mToken=" + Long.toHexString(mToken)
                     + " mTargetPackage=" + mTargetPackage + " mPmToken=" + mPmToken);
 
@@ -1560,30 +1560,30 @@
                         // its startRestore() runs?
                         mObserver.restoreStarting(restorePackages.size());
                     } catch (RemoteException e) {
-                        Log.d(TAG, "Restore observer died at restoreStarting");
+                        Slog.d(TAG, "Restore observer died at restoreStarting");
                         mObserver = null;
                     }
                 }
 
                 if (mTransport.startRestore(mToken, restorePackages.toArray(new PackageInfo[0])) !=
                         BackupConstants.TRANSPORT_OK) {
-                    Log.e(TAG, "Error starting restore operation");
+                    Slog.e(TAG, "Error starting restore operation");
                     EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 }
 
                 String packageName = mTransport.nextRestorePackage();
                 if (packageName == null) {
-                    Log.e(TAG, "Error getting first restore package");
+                    Slog.e(TAG, "Error getting first restore package");
                     EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 } else if (packageName.equals("")) {
-                    Log.i(TAG, "No restore data available");
+                    Slog.i(TAG, "No restore data available");
                     int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
                     EventLog.writeEvent(EventLogTags.RESTORE_SUCCESS, 0, millis);
                     return;
                 } else if (!packageName.equals(PACKAGE_MANAGER_SENTINEL)) {
-                    Log.e(TAG, "Expected restore data for \"" + PACKAGE_MANAGER_SENTINEL
+                    Slog.e(TAG, "Expected restore data for \"" + PACKAGE_MANAGER_SENTINEL
                           + "\", found only \"" + packageName + "\"");
                     EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, PACKAGE_MANAGER_SENTINEL,
                             "Package manager data missing");
@@ -1599,7 +1599,7 @@
                 // signature/version verification etc, so we simply do not proceed with
                 // the restore operation.
                 if (!pmAgent.hasMetadata()) {
-                    Log.e(TAG, "No restore metadata available, so not restoring settings");
+                    Slog.e(TAG, "No restore metadata available, so not restoring settings");
                     EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, PACKAGE_MANAGER_SENTINEL,
                             "Package manager restore metadata missing");
                     return;
@@ -1610,11 +1610,11 @@
                     packageName = mTransport.nextRestorePackage();
 
                     if (packageName == null) {
-                        Log.e(TAG, "Error getting next restore package");
+                        Slog.e(TAG, "Error getting next restore package");
                         EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                         return;
                     } else if (packageName.equals("")) {
-                        if (DEBUG) Log.v(TAG, "No next package, finishing restore");
+                        if (DEBUG) Slog.v(TAG, "No next package, finishing restore");
                         break;
                     }
 
@@ -1622,14 +1622,14 @@
                         try {
                             mObserver.onUpdate(count);
                         } catch (RemoteException e) {
-                            Log.d(TAG, "Restore observer died in onUpdate");
+                            Slog.d(TAG, "Restore observer died in onUpdate");
                             mObserver = null;
                         }
                     }
 
                     Metadata metaInfo = pmAgent.getRestoredMetadata(packageName);
                     if (metaInfo == null) {
-                        Log.e(TAG, "Missing metadata for " + packageName);
+                        Slog.e(TAG, "Missing metadata for " + packageName);
                         EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Package metadata missing");
                         continue;
@@ -1640,7 +1640,7 @@
                         int flags = PackageManager.GET_SIGNATURES;
                         packageInfo = mPackageManager.getPackageInfo(packageName, flags);
                     } catch (NameNotFoundException e) {
-                        Log.e(TAG, "Invalid package restoring data", e);
+                        Slog.e(TAG, "Invalid package restoring data", e);
                         EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Package missing on device");
                         continue;
@@ -1654,25 +1654,25 @@
                                 & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) == 0) {
                             String message = "Version " + metaInfo.versionCode
                                     + " > installed version " + packageInfo.versionCode;
-                            Log.w(TAG, "Package " + packageName + ": " + message);
+                            Slog.w(TAG, "Package " + packageName + ": " + message);
                             EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
                                     packageName, message);
                             continue;
                         } else {
-                            if (DEBUG) Log.v(TAG, "Version " + metaInfo.versionCode
+                            if (DEBUG) Slog.v(TAG, "Version " + metaInfo.versionCode
                                     + " > installed " + packageInfo.versionCode
                                     + " but restoreAnyVersion");
                         }
                     }
 
                     if (!signaturesMatch(metaInfo.signatures, packageInfo)) {
-                        Log.w(TAG, "Signature mismatch restoring " + packageName);
+                        Slog.w(TAG, "Signature mismatch restoring " + packageName);
                         EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Signature mismatch");
                         continue;
                     }
 
-                    if (DEBUG) Log.v(TAG, "Package " + packageName
+                    if (DEBUG) Slog.v(TAG, "Package " + packageName
                             + " restore version [" + metaInfo.versionCode
                             + "] is compatible with installed version ["
                             + packageInfo.versionCode + "]");
@@ -1682,14 +1682,14 @@
                     boolean useRealApp = (packageInfo.applicationInfo.flags
                             & ApplicationInfo.FLAG_RESTORE_NEEDS_APPLICATION) != 0;
                     if (DEBUG && useRealApp) {
-                        Log.v(TAG, "agent requires real Application subclass for restore");
+                        Slog.v(TAG, "agent requires real Application subclass for restore");
                     }
                     IBackupAgent agent = bindToAgentSynchronous(
                             packageInfo.applicationInfo,
                             (useRealApp ? IApplicationThread.BACKUP_MODE_INCREMENTAL
                                     : IApplicationThread.BACKUP_MODE_RESTORE));
                     if (agent == null) {
-                        Log.w(TAG, "Can't find backup agent for " + packageName);
+                        Slog.w(TAG, "Can't find backup agent for " + packageName);
                         EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Restore agent missing");
                         continue;
@@ -1711,7 +1711,7 @@
                         // it is explicitly not killed following that operation.
                         if (mTargetPackage == null && (packageInfo.applicationInfo.flags
                                 & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0) {
-                            if (DEBUG) Log.d(TAG, "Restore complete, killing host process of "
+                            if (DEBUG) Slog.d(TAG, "Restore complete, killing host process of "
                                     + packageInfo.applicationInfo.processName);
                             mActivityManager.killApplicationProcess(
                                     packageInfo.applicationInfo.processName,
@@ -1725,21 +1725,21 @@
                 int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
                 EventLog.writeEvent(EventLogTags.RESTORE_SUCCESS, count, millis);
             } catch (Exception e) {
-                Log.e(TAG, "Error in restore thread", e);
+                Slog.e(TAG, "Error in restore thread", e);
             } finally {
-                if (DEBUG) Log.d(TAG, "finishing restore mObserver=" + mObserver);
+                if (DEBUG) Slog.d(TAG, "finishing restore mObserver=" + mObserver);
 
                 try {
                     mTransport.finishRestore();
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Error finishing restore", e);
+                    Slog.e(TAG, "Error finishing restore", e);
                 }
 
                 if (mObserver != null) {
                     try {
                         mObserver.restoreFinished(error);
                     } catch (RemoteException e) {
-                        Log.d(TAG, "Restore observer died at restoreFinished");
+                        Slog.d(TAG, "Restore observer died at restoreFinished");
                     }
                 }
 
@@ -1755,7 +1755,7 @@
                 // We must under all circumstances tell the Package Manager to
                 // proceed with install notifications if it's waiting for us.
                 if (mPmToken > 0) {
-                    if (DEBUG) Log.v(TAG, "finishing PM token " + mPmToken);
+                    if (DEBUG) Slog.v(TAG, "finishing PM token " + mPmToken);
                     try {
                         mPackageManagerBinder.finishPackageInstall(mPmToken);
                     } catch (RemoteException e) { /* can't happen */ }
@@ -1771,7 +1771,7 @@
             // !!! TODO: actually run the restore through mTransport
             final String packageName = app.packageName;
 
-            if (DEBUG) Log.d(TAG, "processOneRestore packageName=" + packageName);
+            if (DEBUG) Slog.d(TAG, "processOneRestore packageName=" + packageName);
 
             // !!! TODO: get the dirs from the transport
             File backupDataName = new File(mDataDir, packageName + ".restore");
@@ -1790,7 +1790,7 @@
                             ParcelFileDescriptor.MODE_TRUNCATE);
 
                 if (mTransport.getRestoreData(backupData) != BackupConstants.TRANSPORT_OK) {
-                    Log.e(TAG, "Error getting restore data for " + packageName);
+                    Slog.e(TAG, "Error getting restore data for " + packageName);
                     EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 }
@@ -1833,7 +1833,7 @@
                 int size = (int) backupDataName.length();
                 EventLog.writeEvent(EventLogTags.RESTORE_PACKAGE, packageName, size);
             } catch (Exception e) {
-                Log.e(TAG, "Error restoring data for " + packageName, e);
+                Slog.e(TAG, "Error restoring data for " + packageName, e);
                 EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
 
                 // If the agent fails restore, it might have put the app's data
@@ -1897,11 +1897,11 @@
                 for (String transportName : mQueue) {
                     IBackupTransport transport = getTransport(transportName);
                     if (transport == null) {
-                        Log.e(TAG, "Requested init for " + transportName + " but not found");
+                        Slog.e(TAG, "Requested init for " + transportName + " but not found");
                         continue;
                     }
 
-                    Log.i(TAG, "Initializing (wiping) backup transport storage: " + transportName);
+                    Slog.i(TAG, "Initializing (wiping) backup transport storage: " + transportName);
                     EventLog.writeEvent(EventLogTags.BACKUP_START, transport.transportDirName());
                     long startRealtime = SystemClock.elapsedRealtime();
                     int status = transport.initializeDevice();
@@ -1912,7 +1912,7 @@
 
                     // Okay, the wipe really happened.  Clean up our local bookkeeping.
                     if (status == BackupConstants.TRANSPORT_OK) {
-                        Log.i(TAG, "Device init successful");
+                        Slog.i(TAG, "Device init successful");
                         int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
                         EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
                         resetBackupState(new File(mBaseStateDir, transport.transportDirName()));
@@ -1923,14 +1923,14 @@
                     } else {
                         // If this didn't work, requeue this one and try again
                         // after a suitable interval
-                        Log.e(TAG, "Transport error in initializeDevice()");
+                        Slog.e(TAG, "Transport error in initializeDevice()");
                         EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
                         synchronized (mQueueLock) {
                             recordInitPendingLocked(true, transportName);
                         }
                         // do this via another alarm to make sure of the wakelock states
                         long delay = transport.requestBackupTime();
-                        if (DEBUG) Log.w(TAG, "init failed on "
+                        if (DEBUG) Slog.w(TAG, "init failed on "
                                 + transportName + " resched in " + delay);
                         mAlarmManager.set(AlarmManager.RTC_WAKEUP,
                                 System.currentTimeMillis() + delay, mRunInitIntent);
@@ -1939,7 +1939,7 @@
             } catch (RemoteException e) {
                 // can't happen; the transports are local
             } catch (Exception e) {
-                Log.e(TAG, "Unexpected error performing init", e);
+                Slog.e(TAG, "Unexpected error performing init", e);
             } finally {
                 // Done; release the wakelock
                 mWakelock.release();
@@ -1992,9 +1992,9 @@
 
                             if (DEBUG) {
                                 int numKeys = mPendingBackups.size();
-                                Log.d(TAG, "Now awaiting backup for " + numKeys + " participants:");
+                                Slog.d(TAG, "Now awaiting backup for " + numKeys + " participants:");
                                 for (BackupRequest b : mPendingBackups.values()) {
-                                    Log.d(TAG, "    + " + b + " agent=" + b.appInfo.backupAgentName);
+                                    Slog.d(TAG, "    + " + b + " agent=" + b.appInfo.backupAgentName);
                                 }
                             }
                         }
@@ -2002,7 +2002,7 @@
                 }
             }
         } else {
-            Log.w(TAG, "dataChanged but no participant pkg='" + packageName + "'"
+            Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'"
                     + " uid=" + Binder.getCallingUid());
         }
     }
@@ -2015,7 +2015,7 @@
             out.seek(out.length());
             out.writeUTF(str);
         } catch (IOException e) {
-            Log.e(TAG, "Can't write " + str + " to backup journal", e);
+            Slog.e(TAG, "Can't write " + str + " to backup journal", e);
             mJournal = null;
         } finally {
             try { if (out != null) out.close(); } catch (IOException e) {}
@@ -2024,12 +2024,12 @@
 
     // Clear the given package's backup data from the current transport
     public void clearBackupData(String packageName) {
-        if (DEBUG) Log.v(TAG, "clearBackupData() of " + packageName);
+        if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName);
         PackageInfo info;
         try {
             info = mPackageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
         } catch (NameNotFoundException e) {
-            Log.d(TAG, "No such package '" + packageName + "' - not clearing backup data");
+            Slog.d(TAG, "No such package '" + packageName + "' - not clearing backup data");
             return;
         }
 
@@ -2042,7 +2042,7 @@
         } else {
             // a caller with full permission can ask to back up any participating app
             // !!! TODO: allow data-clear of ANY app?
-            if (DEBUG) Log.v(TAG, "Privileged caller, allowing clear of other apps");
+            if (DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps");
             apps = new HashSet<ApplicationInfo>();
             int N = mBackupParticipants.size();
             for (int i = 0; i < N; i++) {
@@ -2056,7 +2056,7 @@
         // now find the given package in the set of candidate apps
         for (ApplicationInfo app : apps) {
             if (app.packageName.equals(packageName)) {
-                if (DEBUG) Log.v(TAG, "Found the app - running clear process");
+                if (DEBUG) Slog.v(TAG, "Found the app - running clear process");
                 // found it; fire off the clear request
                 synchronized (mQueueLock) {
                     long oldId = Binder.clearCallingIdentity();
@@ -2076,7 +2076,7 @@
     public void backupNow() {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "backupNow");
 
-        if (DEBUG) Log.v(TAG, "Scheduling immediate backup pass");
+        if (DEBUG) Slog.v(TAG, "Scheduling immediate backup pass");
         synchronized (mQueueLock) {
             // Because the alarms we are using can jitter, and we want an *immediate*
             // backup pass to happen, we restart the timer beginning with "next time,"
@@ -2086,7 +2086,7 @@
                 mRunBackupIntent.send();
             } catch (PendingIntent.CanceledException e) {
                 // should never happen
-                Log.e(TAG, "run-backup intent cancelled!");
+                Slog.e(TAG, "run-backup intent cancelled!");
             }
         }
     }
@@ -2096,7 +2096,7 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
                 "setBackupEnabled");
 
-        Log.i(TAG, "Backup enabled => " + enable);
+        Slog.i(TAG, "Backup enabled => " + enable);
 
         boolean wasEnabled = mEnabled;
         synchronized (this) {
@@ -2111,7 +2111,7 @@
                 startBackupAlarmsLocked(BACKUP_INTERVAL);
             } else if (!enable) {
                 // No longer enabled, so stop running backups
-                if (DEBUG) Log.i(TAG, "Opting out of backup");
+                if (DEBUG) Slog.i(TAG, "Opting out of backup");
 
                 mAlarmManager.cancel(mRunBackupIntent);
 
@@ -2141,7 +2141,7 @@
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
         "setBackupEnabled");
 
-        Log.i(TAG, "Auto restore => " + doAutoRestore);
+        Slog.i(TAG, "Auto restore => " + doAutoRestore);
 
         synchronized (this) {
             Settings.Secure.putInt(mContext.getContentResolver(),
@@ -2168,7 +2168,7 @@
                 startBackupAlarmsLocked(FIRST_BACKUP_INTERVAL);
             } else if (!available) {
                 // No longer enabled, so stop running backups
-                Log.w(TAG, "Backup service no longer provisioned");
+                Slog.w(TAG, "Backup service no longer provisioned");
                 mAlarmManager.cancel(mRunBackupIntent);
             }
         }
@@ -2197,7 +2197,7 @@
     public String getCurrentTransport() {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
                 "getCurrentTransport");
-        if (DEBUG) Log.v(TAG, "... getCurrentTransport() returning " + mCurrentTransport);
+        if (DEBUG) Slog.v(TAG, "... getCurrentTransport() returning " + mCurrentTransport);
         return mCurrentTransport;
     }
 
@@ -2233,10 +2233,10 @@
                 mCurrentTransport = transport;
                 Settings.Secure.putString(mContext.getContentResolver(),
                         Settings.Secure.BACKUP_TRANSPORT, transport);
-                Log.v(TAG, "selectBackupTransport() set " + mCurrentTransport
+                Slog.v(TAG, "selectBackupTransport() set " + mCurrentTransport
                         + " returning " + prevTransport);
             } else {
-                Log.w(TAG, "Attempt to select unavailable transport " + transport);
+                Slog.w(TAG, "Attempt to select unavailable transport " + transport);
             }
             return prevTransport;
         }
@@ -2247,12 +2247,12 @@
     public void agentConnected(String packageName, IBinder agentBinder) {
         synchronized(mAgentConnectLock) {
             if (Binder.getCallingUid() == Process.SYSTEM_UID) {
-                Log.d(TAG, "agentConnected pkg=" + packageName + " agent=" + agentBinder);
+                Slog.d(TAG, "agentConnected pkg=" + packageName + " agent=" + agentBinder);
                 IBackupAgent agent = IBackupAgent.Stub.asInterface(agentBinder);
                 mConnectedAgent = agent;
                 mConnecting = false;
             } else {
-                Log.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
+                Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
                         + " claiming agent connected");
             }
             mAgentConnectLock.notifyAll();
@@ -2269,7 +2269,7 @@
                 mConnectedAgent = null;
                 mConnecting = false;
             } else {
-                Log.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
+                Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
                         + " claiming agent disconnected");
             }
             mAgentConnectLock.notifyAll();
@@ -2280,13 +2280,13 @@
     // will need to be told when the restore is finished.
     public void restoreAtInstall(String packageName, int token) {
         if (Binder.getCallingUid() != Process.SYSTEM_UID) {
-            Log.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
+            Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid()
                     + " attemping install-time restore");
             return;
         }
 
         long restoreSet = getAvailableRestoreToken(packageName);
-        if (DEBUG) Log.v(TAG, "restoreAtInstall pkg=" + packageName
+        if (DEBUG) Slog.v(TAG, "restoreAtInstall pkg=" + packageName
                 + " token=" + Integer.toHexString(token));
 
         if (mAutoRestore && mProvisioned && restoreSet != 0) {
@@ -2308,7 +2308,7 @@
         } else {
             // Auto-restore disabled or no way to attempt a restore; just tell the Package
             // Manager to proceed with the post-install handling for this package.
-            if (DEBUG) Log.v(TAG, "No restore set -- skipping restore");
+            if (DEBUG) Slog.v(TAG, "No restore set -- skipping restore");
             try {
                 mPackageManagerBinder.finishPackageInstall(token);
             } catch (RemoteException e) { /* can't happen */ }
@@ -2321,7 +2321,7 @@
 
         synchronized(this) {
             if (mActiveRestoreSession != null) {
-                Log.d(TAG, "Restore session requested but one already active");
+                Slog.d(TAG, "Restore session requested but one already active");
                 return null;
             }
             mActiveRestoreSession = new ActiveRestoreSession(transport);
@@ -2333,7 +2333,7 @@
     // completed the given outstanding asynchronous backup/restore operation.
     public void opComplete(int token) {
         synchronized (mCurrentOpLock) {
-            if (DEBUG) Log.v(TAG, "opComplete: " + Integer.toHexString(token));
+            if (DEBUG) Slog.v(TAG, "opComplete: " + Integer.toHexString(token));
             mCurrentOperations.put(token, OP_ACKNOWLEDGED);
             mCurrentOpLock.notifyAll();
         }
@@ -2359,7 +2359,7 @@
             long oldId = Binder.clearCallingIdentity();
             try {
                 if (mRestoreTransport == null) {
-                    Log.w(TAG, "Null transport getting restore sets");
+                    Slog.w(TAG, "Null transport getting restore sets");
                     return null;
                 }
                 if (mRestoreSets == null) { // valid transport; do the one-time fetch
@@ -2368,7 +2368,7 @@
                 }
                 return mRestoreSets;
             } catch (Exception e) {
-                Log.e(TAG, "Error in getAvailableRestoreSets", e);
+                Slog.e(TAG, "Error in getAvailableRestoreSets", e);
                 return null;
             } finally {
                 Binder.restoreCallingIdentity(oldId);
@@ -2379,11 +2379,11 @@
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
                     "performRestore");
 
-            if (DEBUG) Log.d(TAG, "performRestore token=" + Long.toHexString(token)
+            if (DEBUG) Slog.d(TAG, "performRestore token=" + Long.toHexString(token)
                     + " observer=" + observer);
 
             if (mRestoreTransport == null || mRestoreSets == null) {
-                Log.e(TAG, "Ignoring performRestore() with no restore set");
+                Slog.e(TAG, "Ignoring performRestore() with no restore set");
                 return -1;
             }
 
@@ -2401,18 +2401,18 @@
                 }
             }
 
-            Log.w(TAG, "Restore token " + Long.toHexString(token) + " not found");
+            Slog.w(TAG, "Restore token " + Long.toHexString(token) + " not found");
             return -1;
         }
 
         public synchronized int restorePackage(String packageName, IRestoreObserver observer) {
-            if (DEBUG) Log.v(TAG, "restorePackage pkg=" + packageName + " obs=" + observer);
+            if (DEBUG) Slog.v(TAG, "restorePackage pkg=" + packageName + " obs=" + observer);
 
             PackageInfo app = null;
             try {
                 app = mPackageManager.getPackageInfo(packageName, 0);
             } catch (NameNotFoundException nnf) {
-                Log.w(TAG, "Asked to restore nonexistent pkg " + packageName);
+                Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName);
                 return -1;
             }
 
@@ -2422,11 +2422,17 @@
                     Binder.getCallingPid(), Binder.getCallingUid());
             if ((perm == PackageManager.PERMISSION_DENIED) &&
                     (app.applicationInfo.uid != Binder.getCallingUid())) {
-                Log.w(TAG, "restorePackage: bad packageName=" + packageName
+                Slog.w(TAG, "restorePackage: bad packageName=" + packageName
                         + " or calling uid=" + Binder.getCallingUid());
                 throw new SecurityException("No permission to restore other packages");
             }
 
+            // If the package has no backup agent, we obviously cannot proceed
+            if (app.applicationInfo.backupAgentName == null) {
+                Slog.w(TAG, "Asked to restore package " + packageName + " with no agent");
+                return -1;
+            }
+
             // So far so good; we're allowed to try to restore this package.  Now
             // check whether there is data for it in the current dataset, falling back
             // to the ancestral dataset if not.
@@ -2453,14 +2459,14 @@
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
                     "endRestoreSession");
 
-            if (DEBUG) Log.d(TAG, "endRestoreSession");
+            if (DEBUG) Slog.d(TAG, "endRestoreSession");
 
             synchronized (this) {
                 long oldId = Binder.clearCallingIdentity();
                 try {
                     if (mRestoreTransport != null) mRestoreTransport.finishRestore();
                 } catch (Exception e) {
-                    Log.e(TAG, "Error in finishRestore", e);
+                    Slog.e(TAG, "Error in finishRestore", e);
                 } finally {
                     mRestoreTransport = null;
                     Binder.restoreCallingIdentity(oldId);
@@ -2471,7 +2477,7 @@
                 if (BackupManagerService.this.mActiveRestoreSession == this) {
                     BackupManagerService.this.mActiveRestoreSession = null;
                 } else {
-                    Log.e(TAG, "ending non-current restore session");
+                    Slog.e(TAG, "ending non-current restore session");
                 }
             }
         }
@@ -2498,7 +2504,7 @@
                         pw.println("       " + f.getName() + " - " + f.length() + " state bytes");
                     }
                 } catch (RemoteException e) {
-                    Log.e(TAG, "Error in transportDirName()", e);
+                    Slog.e(TAG, "Error in transportDirName()", e);
                     pw.println("        Error: " + e);
                 }
             }
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index dc41ff9..57944fb 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -34,7 +34,7 @@
 import android.os.UEventObserver;
 import android.provider.Settings;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.File;
 import java.io.FileDescriptor;
@@ -349,7 +349,7 @@
         intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology);
 
         if (false) {
-            Log.d(TAG, "updateBattery level:" + mBatteryLevel +
+            Slog.d(TAG, "updateBattery level:" + mBatteryLevel +
                     " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus +
                     " health:" + mBatteryHealth +  " present:" + mBatteryPresent +
                     " voltage: " + mBatteryVoltage +
@@ -381,20 +381,20 @@
             // add dump file to drop box
             db.addFile("BATTERY_DISCHARGE_INFO", dumpFile, DropBoxManager.IS_TEXT);
         } catch (RemoteException e) {
-            Log.e(TAG, "failed to dump battery service", e);
+            Slog.e(TAG, "failed to dump battery service", e);
         } catch (IOException e) {
-            Log.e(TAG, "failed to write dumpsys file", e);
+            Slog.e(TAG, "failed to write dumpsys file", e);
         } finally {
             // make sure we clean up
             if (dumpStream != null) {
                 try {
                     dumpStream.close();
                 } catch (IOException e) {
-                    Log.e(TAG, "failed to close dumpsys output stream");
+                    Slog.e(TAG, "failed to close dumpsys output stream");
                 }
             }
             if (dumpFile != null && !dumpFile.delete()) {
-                Log.e(TAG, "failed to delete temporary dumpsys file: "
+                Slog.e(TAG, "failed to delete temporary dumpsys file: "
                         + dumpFile.getAbsolutePath());
             }
         }
@@ -416,12 +416,12 @@
                     // If the discharge cycle is bad enough we want to know about it.
                     logBatteryStats();
                 }
-                if (LOCAL_LOGV) Log.v(TAG, "duration threshold: " + durationThreshold +
+                if (LOCAL_LOGV) Slog.v(TAG, "duration threshold: " + durationThreshold +
                         " discharge threshold: " + dischargeThreshold);
-                if (LOCAL_LOGV) Log.v(TAG, "duration: " + duration + " discharge: " +
+                if (LOCAL_LOGV) Slog.v(TAG, "duration: " + duration + " discharge: " +
                         (mDischargeStartLevel - mBatteryLevel));
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Invalid DischargeThresholds GService string: " +
+                Slog.e(TAG, "Invalid DischargeThresholds GService string: " +
                         durationThresholdString + " or " + dischargeThresholdString);
                 return;
             }
diff --git a/services/java/com/android/server/BootReceiver.java b/services/java/com/android/server/BootReceiver.java
index 5c1af7e..eeb91fa 100644
--- a/services/java/com/android/server/BootReceiver.java
+++ b/services/java/com/android/server/BootReceiver.java
@@ -28,7 +28,7 @@
 import android.os.RecoverySystem;
 import android.os.SystemProperties;
 import android.provider.Settings;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.File;
 import java.io.IOException;
@@ -53,13 +53,13 @@
         try {
             logBootEvents(context);
         } catch (Exception e) {
-            Log.e(TAG, "Can't log boot events", e);
+            Slog.e(TAG, "Can't log boot events", e);
         }
 
         try {
             RecoverySystem.handleAftermath();
         } catch (Exception e) {
-            Log.e(TAG, "Can't handle recovery aftermath", e);
+            Slog.e(TAG, "Can't handle recovery aftermath", e);
         }
 
         try {
@@ -70,7 +70,7 @@
                 context.startService(loadavg);
             }
         } catch (Exception e) {
-            Log.e(TAG, "Can't start load average service", e);
+            Slog.e(TAG, "Can't start load average service", e);
         }
     }
 
@@ -122,7 +122,7 @@
                     String filename = new File(TOMBSTONE_DIR, path).getPath();
                     addFileToDropBox(db, prefs, props, filename, LOG_SIZE, "SYSTEM_TOMBSTONE");
                 } catch (IOException e) {
-                    Log.e(TAG, "Can't log tombstone", e);
+                    Slog.e(TAG, "Can't log tombstone", e);
                 }
             }
         };
@@ -133,7 +133,7 @@
     private static void addFileToDropBox(
             DropBoxManager db, SharedPreferences prefs,
             String headers, String filename, int maxSize, String tag) throws IOException {
-        if (!db.isTagEnabled(tag)) return;  // Logging disabled
+        if (!db.isTagEnabled(tag)) return;  // Slog.ing disabled
 
         File file = new File(filename);
         long fileTime = file.lastModified();
@@ -146,6 +146,6 @@
         StringBuilder report = new StringBuilder(headers).append("\n");
         report.append(FileUtils.readTextFile(file, maxSize, "[[TRUNCATED]]\n"));
         db.addText(tag, report.toString());
-        Log.i(TAG, "Logging " + filename + " to DropBox (" + tag + ")");
+        Slog.i(TAG, "Slog.ing " + filename + " to DropBox (" + tag + ")");
     }
 }
diff --git a/services/java/com/android/server/BrickReceiver.java b/services/java/com/android/server/BrickReceiver.java
index 6c4db0d..cff3805 100644
--- a/services/java/com/android/server/BrickReceiver.java
+++ b/services/java/com/android/server/BrickReceiver.java
@@ -20,12 +20,12 @@
 import android.content.Intent;
 import android.content.BroadcastReceiver;
 import android.os.SystemService;
-import android.util.Log;
+import android.util.Slog;
 
 public class BrickReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
-        Log.w("BrickReceiver", "!!! BRICKING DEVICE !!!");
+        Slog.w("BrickReceiver", "!!! BRICKING DEVICE !!!");
         SystemService.start("brick");
     }
 }
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 19f4b8a..67b6200 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -39,7 +39,7 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.telephony.Phone;
 
@@ -66,6 +66,7 @@
 
 
     private Tethering mTethering;
+    private boolean mTetheringConfigValid = false;
 
     /**
      * Sometimes we want to refer to the individual network state
@@ -168,7 +169,7 @@
                         // Wait until sServiceInstance has been initialized.
                         thread.wait();
                     } catch (InterruptedException ignore) {
-                        Log.e(TAG,
+                        Slog.e(TAG,
                             "Unexpected InterruptedException while waiting"+
                             " for ConnectivityService thread");
                     }
@@ -184,7 +185,7 @@
     }
 
     private ConnectivityService(Context context) {
-        if (DBG) Log.v(TAG, "ConnectivityService starting up");
+        if (DBG) Slog.v(TAG, "ConnectivityService starting up");
 
         // setup our unique device name
         String id = Settings.Secure.getString(context.getContentResolver(),
@@ -210,11 +211,11 @@
         for (String raString : raStrings) {
             RadioAttributes r = new RadioAttributes(raString);
             if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {
-                Log.e(TAG, "Error in radioAttributes - ignoring attempt to define type " + r.mType);
+                Slog.e(TAG, "Error in radioAttributes - ignoring attempt to define type " + r.mType);
                 continue;
             }
             if (mRadioAttributes[r.mType] != null) {
-                Log.e(TAG, "Error in radioAttributes - ignoring attempt to redefine type " +
+                Slog.e(TAG, "Error in radioAttributes - ignoring attempt to redefine type " +
                         r.mType);
                 continue;
             }
@@ -227,17 +228,17 @@
             try {
                 NetworkAttributes n = new NetworkAttributes(naString);
                 if (n.mType > ConnectivityManager.MAX_NETWORK_TYPE) {
-                    Log.e(TAG, "Error in networkAttributes - ignoring attempt to define type " +
+                    Slog.e(TAG, "Error in networkAttributes - ignoring attempt to define type " +
                             n.mType);
                     continue;
                 }
                 if (mNetAttributes[n.mType] != null) {
-                    Log.e(TAG, "Error in networkAttributes - ignoring attempt to redefine type " +
+                    Slog.e(TAG, "Error in networkAttributes - ignoring attempt to redefine type " +
                             n.mType);
                     continue;
                 }
                 if (mRadioAttributes[n.mRadio] == null) {
-                    Log.e(TAG, "Error in networkAttributes - ignoring attempt to use undefined " +
+                    Slog.e(TAG, "Error in networkAttributes - ignoring attempt to use undefined " +
                             "radio " + n.mRadio + " in network type " + n.mType);
                     continue;
                 }
@@ -293,7 +294,7 @@
         for (int netType : mPriorityList) {
             switch (mNetAttributes[netType].mRadio) {
             case ConnectivityManager.TYPE_WIFI:
-                if (DBG) Log.v(TAG, "Starting Wifi Service.");
+                if (DBG) Slog.v(TAG, "Starting Wifi Service.");
                 WifiStateTracker wst = new WifiStateTracker(context, mHandler);
                 WifiService wifiService = new WifiService(context, wst);
                 ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
@@ -308,18 +309,24 @@
                     netType, mNetAttributes[netType].mName);
                 mNetTrackers[netType].startMonitoring();
                 if (noMobileData) {
-                    if (DBG) Log.d(TAG, "tearing down Mobile networks due to setting");
+                    if (DBG) Slog.d(TAG, "tearing down Mobile networks due to setting");
                     mNetTrackers[netType].teardown();
                 }
                 break;
             default:
-                Log.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
+                Slog.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
                         mNetAttributes[netType].mRadio);
                 continue;
             }
         }
 
         mTethering = new Tethering(mContext);
+        mTetheringConfigValid = (((mNetTrackers[ConnectivityManager.TYPE_MOBILE_DUN] != null) ||
+                                  !mTethering.isDunRequired()) &&
+                                 (mTethering.getTetherableUsbRegexs().length != 0 ||
+                                  mTethering.getTetherableWifiRegexs().length != 0) &&
+                                 mTethering.getUpstreamIfaceRegexs().length != 0);
+
     }
 
 
@@ -381,7 +388,7 @@
             if (t != mNetworkPreference && mNetTrackers[t] != null &&
                     mNetTrackers[t].getNetworkInfo().isConnected()) {
                 if (DBG) {
-                    Log.d(TAG, "tearing down " +
+                    Slog.d(TAG, "tearing down " +
                             mNetTrackers[t].getNetworkInfo() +
                             " in enforcePreference");
                 }
@@ -415,7 +422,7 @@
             NetworkStateTracker t = mNetTrackers[type];
             NetworkInfo info = t.getNetworkInfo();
             if (info.isConnected()) {
-                if (DBG && type != mActiveDefaultNetwork) Log.e(TAG,
+                if (DBG && type != mActiveDefaultNetwork) Slog.e(TAG,
                         "connected default network is not " +
                         "mActiveDefaultNetwork!");
                 return info;
@@ -498,14 +505,14 @@
         }
 
         public void binderDied() {
-            Log.d(TAG, "ConnectivityService FeatureUser binderDied(" +
+            Slog.d(TAG, "ConnectivityService FeatureUser binderDied(" +
                     mNetworkType + ", " + mFeature + ", " + mBinder + "), created " +
                     (System.currentTimeMillis() - mCreateTime) + " mSec ago");
             stopUsingNetworkFeature(this, false);
         }
 
         public void expire() {
-            Log.d(TAG, "ConnectivityService FeatureUser expire(" +
+            Slog.d(TAG, "ConnectivityService FeatureUser expire(" +
                     mNetworkType + ", " + mFeature + ", " + mBinder +"), created " +
                     (System.currentTimeMillis() - mCreateTime) + " mSec ago");
             stopUsingNetworkFeature(this, false);
@@ -521,7 +528,7 @@
     public int startUsingNetworkFeature(int networkType, String feature,
             IBinder binder) {
         if (DBG) {
-            Log.d(TAG, "startUsingNetworkFeature for net " + networkType +
+            Slog.d(TAG, "startUsingNetworkFeature for net " + networkType +
                     ": " + feature);
         }
         enforceChangePermission();
@@ -536,7 +543,7 @@
         int usedNetworkType = networkType;
         if(networkType == ConnectivityManager.TYPE_MOBILE) {
             if (!getMobileDataEnabled()) {
-                if (DBG) Log.d(TAG, "requested special network with data disabled - rejected");
+                if (DBG) Slog.d(TAG, "requested special network with data disabled - rejected");
                 return Phone.APN_TYPE_NOT_AVAILABLE;
             }
             if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) {
@@ -558,7 +565,7 @@
                 NetworkInfo ni = network.getNetworkInfo();
 
                 if (ni.isAvailable() == false) {
-                    if (DBG) Log.d(TAG, "special network not available");
+                    if (DBG) Slog.d(TAG, "special network not available");
                     return Phone.APN_TYPE_NOT_AVAILABLE;
                 }
 
@@ -579,17 +586,17 @@
                     if (ni.isConnected() == true) {
                         // add the pid-specific dns
                         handleDnsConfigurationChange();
-                        if (DBG) Log.d(TAG, "special network already active");
+                        if (DBG) Slog.d(TAG, "special network already active");
                         return Phone.APN_ALREADY_ACTIVE;
                     }
-                    if (DBG) Log.d(TAG, "special network already connecting");
+                    if (DBG) Slog.d(TAG, "special network already connecting");
                     return Phone.APN_REQUEST_STARTED;
                 }
 
                 // check if the radio in play can make another contact
                 // assume if cannot for now
 
-                if (DBG) Log.d(TAG, "reconnecting to special network");
+                if (DBG) Slog.d(TAG, "reconnecting to special network");
                 network.reconnect();
                 return Phone.APN_REQUEST_STARTED;
             } else {
@@ -633,7 +640,7 @@
             return stopUsingNetworkFeature(u, true);
         } else {
             // none found!
-            if (DBG) Log.d(TAG, "ignoring stopUsingNetworkFeature - not a live request");
+            if (DBG) Slog.d(TAG, "ignoring stopUsingNetworkFeature - not a live request");
             return 1;
         }
     }
@@ -648,7 +655,7 @@
         boolean callTeardown = false;  // used to carry our decision outside of sync block
 
         if (DBG) {
-            Log.d(TAG, "stopUsingNetworkFeature for net " + networkType +
+            Slog.d(TAG, "stopUsingNetworkFeature for net " + networkType +
                     ": " + feature);
         }
 
@@ -678,7 +685,7 @@
                     if (x.mUid == u.mUid && x.mPid == u.mPid &&
                             x.mNetworkType == u.mNetworkType &&
                             TextUtils.equals(x.mFeature, u.mFeature)) {
-                        if (DBG) Log.d(TAG, "ignoring stopUsingNetworkFeature as dup is found");
+                        if (DBG) Slog.d(TAG, "ignoring stopUsingNetworkFeature as dup is found");
                         return 1;
                     }
                 }
@@ -706,7 +713,7 @@
                 mNetRequestersPids[usedNetworkType].remove(currentPid);
                 reassessPidDns(pid, true);
                 if (mNetRequestersPids[usedNetworkType].size() != 0) {
-                    if (DBG) Log.d(TAG, "not tearing down special network - " +
+                    if (DBG) Slog.d(TAG, "not tearing down special network - " +
                            "others still using it");
                     return 1;
                 }
@@ -742,7 +749,7 @@
         if (tracker == null || !tracker.getNetworkInfo().isConnected() ||
                 tracker.isTeardownRequested()) {
             if (DBG) {
-                Log.d(TAG, "requestRouteToHost on down network (" + networkType + ") - dropped");
+                Slog.d(TAG, "requestRouteToHost on down network (" + networkType + ") - dropped");
             }
             return false;
         }
@@ -783,7 +790,7 @@
         enforceAccessPermission();
         boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(),
                 Settings.Secure.MOBILE_DATA, 1) == 1;
-        if (DBG) Log.d(TAG, "getMobileDataEnabled returning " + retVal);
+        if (DBG) Slog.d(TAG, "getMobileDataEnabled returning " + retVal);
         return retVal;
     }
 
@@ -792,7 +799,7 @@
      */
     public synchronized void setMobileDataEnabled(boolean enabled) {
         enforceChangePermission();
-        if (DBG) Log.d(TAG, "setMobileDataEnabled(" + enabled + ")");
+        if (DBG) Slog.d(TAG, "setMobileDataEnabled(" + enabled + ")");
 
         if (getMobileDataEnabled() == enabled) return;
 
@@ -801,7 +808,7 @@
 
         if (enabled) {
             if (mNetTrackers[ConnectivityManager.TYPE_MOBILE] != null) {
-                if (DBG) Log.d(TAG, "starting up " + mNetTrackers[ConnectivityManager.TYPE_MOBILE]);
+                if (DBG) Slog.d(TAG, "starting up " + mNetTrackers[ConnectivityManager.TYPE_MOBILE]);
                 mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
             }
         } else {
@@ -809,7 +816,7 @@
                 if (nt == null) continue;
                 int netType = nt.getNetworkInfo().getType();
                 if (mNetAttributes[netType].mRadio == ConnectivityManager.TYPE_MOBILE) {
-                    if (DBG) Log.d(TAG, "tearing down " + nt);
+                    if (DBG) Slog.d(TAG, "tearing down " + nt);
                     nt.teardown();
                 }
             }
@@ -941,7 +948,7 @@
                 if (mNetAttributes[checkType].mRadio == ConnectivityManager.TYPE_MOBILE &&
                         noMobileData) {
                     if (DBG) {
-                        Log.d(TAG, "not failing over to mobile type " + checkType +
+                        Slog.d(TAG, "not failing over to mobile type " + checkType +
                                 " because Mobile Data Disabled");
                     }
                     continue;
@@ -979,10 +986,10 @@
                     }
                     if (DBG) {
                         if (switchTo.isConnected()) {
-                            Log.v(TAG, "Switching to already connected " +
+                            Slog.v(TAG, "Switching to already connected " +
                                     switchTo.getTypeName());
                         } else {
-                            Log.v(TAG, "Attempting to switch to " +
+                            Slog.v(TAG, "Attempting to switch to " +
                                     switchTo.getTypeName());
                         }
                     }
@@ -1030,7 +1037,7 @@
             } else {
                 reasonText = " (" + reason + ").";
             }
-            Log.v(TAG, "Attempt to connect to " + info.getTypeName() +
+            Slog.v(TAG, "Attempt to connect to " + info.getTypeName() +
                     " failed" + reasonText);
         }
 
@@ -1111,7 +1118,7 @@
                         mNetAttributes[type].mPriority) ||
                         mNetworkPreference == mActiveDefaultNetwork) {
                         // don't accept this one
-                        if (DBG) Log.v(TAG, "Not broadcasting CONNECT_ACTION " +
+                        if (DBG) Slog.v(TAG, "Not broadcasting CONNECT_ACTION " +
                                 "to torn down network " + info.getTypeName());
                         teardown(thisNet);
                         return;
@@ -1119,11 +1126,11 @@
                     // tear down the other
                     NetworkStateTracker otherNet =
                             mNetTrackers[mActiveDefaultNetwork];
-                    if (DBG) Log.v(TAG, "Policy requires " +
+                    if (DBG) Slog.v(TAG, "Policy requires " +
                             otherNet.getNetworkInfo().getTypeName() +
                             " teardown");
                     if (!teardown(otherNet)) {
-                        Log.e(TAG, "Network declined teardown request");
+                        Slog.e(TAG, "Network declined teardown request");
                         return;
                     }
                     if (isFailover) {
@@ -1142,7 +1149,7 @@
     private void handleScanResultsAvailable(NetworkInfo info) {
         int networkType = info.getType();
         if (networkType != ConnectivityManager.TYPE_WIFI) {
-            if (DBG) Log.v(TAG, "Got ScanResultsAvailable for " +
+            if (DBG) Slog.v(TAG, "Got ScanResultsAvailable for " +
                     info.getTypeName() + " network. Don't know how to handle.");
         }
 
@@ -1205,7 +1212,7 @@
      */
     private void reassessPidDns(int myPid, boolean doBump)
     {
-        if (DBG) Log.d(TAG, "reassessPidDns for pid " + myPid);
+        if (DBG) Slog.d(TAG, "reassessPidDns for pid " + myPid);
         for(int i : mPriorityList) {
             if (mNetAttributes[i].isDefault()) {
                 continue;
@@ -1277,14 +1284,14 @@
                     for (String dns : dnsList) {
                         if (dns != null && !TextUtils.equals(dns, "0.0.0.0")) {
                             if (DBG) {
-                                Log.d(TAG, "adding dns " + dns + " for " +
+                                Slog.d(TAG, "adding dns " + dns + " for " +
                                         nt.getNetworkInfo().getTypeName());
                             }
                             SystemProperties.set("net.dns" + j++, dns);
                         }
                     }
                     for (int k=j ; k<mNumDnsEntries; k++) {
-                        if (DBG) Log.d(TAG, "erasing net.dns" + k);
+                        if (DBG) Slog.d(TAG, "erasing net.dns" + k);
                         SystemProperties.set("net.dns" + k, "");
                     }
                     mNumDnsEntries = j;
@@ -1377,7 +1384,7 @@
                         if (DBG) {
                             // TODO - remove this after we validate the dropping doesn't break
                             // anything
-                            Log.d(TAG, "Dropping ConnectivityChange for " +
+                            Slog.d(TAG, "Dropping ConnectivityChange for " +
                                     info.getTypeName() + ": " +
                                     state + "/" + info.getDetailedState());
                         }
@@ -1385,7 +1392,7 @@
                     }
                     mNetAttributes[type].mLastState = state;
 
-                    if (DBG) Log.d(TAG, "ConnectivityChange for " +
+                    if (DBG) Slog.d(TAG, "ConnectivityChange for " +
                             info.getTypeName() + ": " +
                             state + "/" + info.getDetailedState());
 
@@ -1498,8 +1505,8 @@
     public boolean isTetheringSupported() {
         enforceTetherAccessPermission();
         int defaultVal = (SystemProperties.get("ro.tether.denied").equals("true") ? 0 : 1);
-        return ((Settings.Secure.getInt(mContext.getContentResolver(),
-                Settings.Secure.TETHER_SUPPORTED, defaultVal) != 0) &&
-                (mNetTrackers[ConnectivityManager.TYPE_MOBILE_DUN] != null));
+        boolean tetherEnabledInSettings = (Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.TETHER_SUPPORTED, defaultVal) != 0);
+        return tetherEnabledInSettings && mTetheringConfigValid;
     }
 }
diff --git a/services/java/com/android/server/DemoDataSet.java b/services/java/com/android/server/DemoDataSet.java
index 0de7c1e..277985f 100644
--- a/services/java/com/android/server/DemoDataSet.java
+++ b/services/java/com/android/server/DemoDataSet.java
@@ -27,7 +27,7 @@
 import android.provider.Settings;
 import android.provider.MediaStore.Images;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -62,7 +62,7 @@
         int count = files.length;
 
         if (count == 0) {
-            Log.i(LOG_TAG, "addDefaultImages: no images found!");
+            Slog.i(LOG_TAG, "addDefaultImages: no images found!");
             return;
         }
 
@@ -74,14 +74,14 @@
             try {
                 Images.Media.insertImage(mContentResolver, path, name, null);
             } catch (FileNotFoundException e) {
-                Log.e(LOG_TAG, "Failed to import image " + path, e);
+                Slog.e(LOG_TAG, "Failed to import image " + path, e);
             }
         }
     }
     
     private final void addDefaultData()
     {
-        Log.i(LOG_TAG, "Adding default data...");
+        Slog.i(LOG_TAG, "Adding default data...");
 
 //       addImage("Violet", "images/violet.png");
 //       addImage("Corky", "images/corky.png");
@@ -124,7 +124,7 @@
         }
         catch (Exception e)
         {
-            Log.e(LOG_TAG, "Failed to insert image '" + file + "'", e);
+            Slog.e(LOG_TAG, "Failed to insert image '" + file + "'", e);
             url = null;
         }
 
@@ -133,7 +133,7 @@
 
     private final Uri addShortcut(String shortcut, Intent intent)
     {
-        if (Config.LOGV) Log.v(LOG_TAG, "addShortcut: shortcut=" + shortcut + ", intent=" + intent);
+        if (Config.LOGV) Slog.v(LOG_TAG, "addShortcut: shortcut=" + shortcut + ", intent=" + intent);
         return Settings.Bookmarks.add(mContentResolver, intent, null, null,
                                       shortcut != null ? shortcut.charAt(0) : 0, 0);
     }
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index 9899e99..a555244 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -26,10 +26,10 @@
 import org.xmlpull.v1.XmlSerializer;
 
 import android.app.Activity;
-import android.app.DeviceAdminReceiver;
-import android.app.DeviceAdminInfo;
-import android.app.DevicePolicyManager;
-import android.app.IDevicePolicyManager;
+import android.app.admin.DeviceAdminInfo;
+import android.app.admin.DeviceAdminReceiver;
+import android.app.admin.DevicePolicyManager;
+import android.app.admin.IDevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -46,13 +46,17 @@
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.util.Log;
+import android.util.PrintWriterPrinter;
+import android.util.Printer;
 import android.util.Xml;
 import android.view.WindowManagerPolicy;
 
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -72,6 +76,8 @@
     int mActivePasswordLength = 0;
     int mFailedPasswordAttempts = 0;
     
+    int mPasswordOwner = -1;
+    
     final HashMap<ComponentName, ActiveAdmin> mAdminMap
             = new HashMap<ComponentName, ActiveAdmin>();
     final ArrayList<ActiveAdmin> mAdminList
@@ -148,11 +154,31 @@
                 XmlUtils.skipCurrentTag(parser);
             }
         }
+        
+        void dump(String prefix, PrintWriter pw) {
+            pw.print(prefix); pw.print("uid="); pw.println(getUid());
+            pw.print(prefix); pw.println("policies:");
+            ArrayList<DeviceAdminInfo.PolicyInfo> pols = info.getUsedPolicies();
+            if (pols != null) {
+                for (int i=0; i<pols.size(); i++) {
+                    pw.print(prefix); pw.print("  "); pw.println(pols.get(i).tag);
+                }
+            }
+            pw.print(prefix); pw.print("passwordQuality=");
+                    pw.print(passwordQuality);
+                    pw.print(" minimumPasswordLength=");
+                    pw.println(minimumPasswordLength);
+            pw.print(prefix); pw.print("maximumTimeToUnlock=");
+                    pw.println(maximumTimeToUnlock);
+            pw.print(prefix); pw.print("maximumFailedPasswordsForWipe=");
+                    pw.println(maximumFailedPasswordsForWipe);
+        }
     }
     
     class MyPackageMonitor extends PackageMonitor {
         public void onSomePackagesChanged() {
             synchronized (DevicePolicyManagerService.this) {
+                boolean removed = false;
                 for (int i=mAdminList.size()-1; i>=0; i--) {
                     ActiveAdmin aa = mAdminList.get(i);
                     int change = isPackageDisappearing(aa.info.getPackageName()); 
@@ -160,6 +186,7 @@
                             || change == PACKAGE_TEMPORARY_CHANGE) {
                         Log.w(TAG, "Admin unexpectedly uninstalled: "
                                 + aa.info.getComponent());
+                        removed = true;
                         mAdminList.remove(i);
                     } else if (isPackageModified(aa.info.getPackageName())) {
                         try {
@@ -168,10 +195,14 @@
                         } catch (NameNotFoundException e) {
                             Log.w(TAG, "Admin package change removed component: "
                                     + aa.info.getComponent());
+                            removed = true;
                             mAdminList.remove(i);
                         }
                     }
                 }
+                if (removed) {
+                    validatePasswordOwnerLocked();
+                }
             }
         }
     }
@@ -260,6 +291,7 @@
             // XXX need to wait for it to complete.
             mAdminList.remove(admin);
             mAdminMap.remove(adminReceiver);
+            validatePasswordOwnerLocked();
         }
     }
     
@@ -312,6 +344,12 @@
             
             out.endTag(null, "policies");
 
+            if (mPasswordOwner >= 0) {
+                out.startTag(null, "password-owner");
+                out.attribute(null, "value", Integer.toString(mPasswordOwner));
+                out.endTag(null, "password-owner");
+            }
+            
             if (mFailedPasswordAttempts != 0) {
                 out.startTag(null, "failed-password-attempts");
                 out.attribute(null, "value", Integer.toString(mFailedPasswordAttempts));
@@ -377,6 +415,10 @@
                     mFailedPasswordAttempts = Integer.parseInt(
                             parser.getAttributeValue(null, "value"));
                     XmlUtils.skipCurrentTag(parser);
+                } else if ("password-owner".equals(tag)) {
+                    mPasswordOwner = Integer.parseInt(
+                            parser.getAttributeValue(null, "value"));
+                    XmlUtils.skipCurrentTag(parser);
                 } else {
                     Log.w(TAG, "Unknown tag: " + tag);
                     XmlUtils.skipCurrentTag(parser);
@@ -401,6 +443,8 @@
             // Ignore
         }
 
+        validatePasswordOwnerLocked();
+        
         long timeMs = getMaximumTimeToLock(null);
         if (timeMs <= 0) {
             timeMs = Integer.MAX_VALUE;
@@ -412,6 +456,23 @@
         }
     }
 
+    void validatePasswordOwnerLocked() {
+        if (mPasswordOwner >= 0) {
+            boolean haveOwner = false;
+            for (int i=mAdminList.size()-1; i>=0; i--) {
+                if (mAdminList.get(i).getUid() == mPasswordOwner) {
+                    haveOwner = true;
+                    break;
+                }
+            }
+            if (!haveOwner) {
+                Log.w(TAG, "Previous password owner " + mPasswordOwner
+                        + " no longer active; disabling");
+                mPasswordOwner = -1;
+            }
+        }
+    }
+    
     public void systemReady() {
         synchronized (this) {
             loadSettingsLocked();
@@ -622,7 +683,7 @@
         }
     }
     
-    public boolean resetPassword(String password) {
+    public boolean resetPassword(String password, int flags) {
         int quality;
         synchronized (this) {
             // This API can only be called by an active device admin,
@@ -645,12 +706,24 @@
             }
         }
         
+        int callingUid = Binder.getCallingUid();
+        if (mPasswordOwner >= 0 && mPasswordOwner != callingUid) {
+            Log.w(TAG, "resetPassword: already set by another uid and not entered by user");
+            return false;
+        }
+        
         // Don't do this with the lock held, because it is going to call
         // back in to the service.
         long ident = Binder.clearCallingIdentity();
         try {
             LockPatternUtils utils = new LockPatternUtils(mContext);
             utils.saveLockPassword(password, quality);
+            int newOwner = (flags&DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY)
+                    != 0 ? callingUid : -1;
+            if (mPasswordOwner != newOwner) {
+                mPasswordOwner = newOwner;
+                saveSettingsLocked();
+            }
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
@@ -829,10 +902,11 @@
                 android.Manifest.permission.BIND_DEVICE_ADMIN, null);
         
         synchronized (this) {
-            if (mFailedPasswordAttempts != 0) {
+            if (mFailedPasswordAttempts != 0 || mPasswordOwner >= 0) {
                 long ident = Binder.clearCallingIdentity();
                 try {
                     mFailedPasswordAttempts = 0;
+                    mPasswordOwner = -1;
                     saveSettingsLocked();
                     sendAdminCommandLocked(DeviceAdminReceiver.ACTION_PASSWORD_SUCCEEDED,
                             DeviceAdminInfo.USES_POLICY_WATCH_LOGIN);
@@ -842,4 +916,39 @@
             }
         }
     }
+    
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+                != PackageManager.PERMISSION_GRANTED) {
+
+            pw.println("Permission Denial: can't dump DevicePolicyManagerService from from pid="
+                    + Binder.getCallingPid()
+                    + ", uid=" + Binder.getCallingUid());
+            return;
+        }
+        
+        final Printer p = new PrintWriterPrinter(pw);
+        
+        synchronized (this) {
+            p.println("Current Device Policy Manager state:");
+            
+            p.println("  Enabled Device Admins:");
+            final int N = mAdminList.size();
+            for (int i=0; i<N; i++) {
+                ActiveAdmin ap = mAdminList.get(i);
+                if (ap != null) {
+                    pw.print("  "); pw.print(ap.info.getComponent().flattenToShortString());
+                            pw.println(":");
+                    ap.dump("    ", pw);
+                }
+            }
+            
+            pw.println(" ");
+            pw.print("  mActivePasswordQuality="); pw.println(mActivePasswordQuality);
+            pw.print("  mActivePasswordLength="); pw.println(mActivePasswordLength);
+            pw.print("  mFailedPasswordAttempts="); pw.println(mFailedPasswordAttempts);
+            pw.print("  mPasswordOwner="); pw.println(mPasswordOwner);
+        }
+    }
 }
diff --git a/services/java/com/android/server/DeviceStorageMonitorService.java b/services/java/com/android/server/DeviceStorageMonitorService.java
index e58d346..62cf707 100644
--- a/services/java/com/android/server/DeviceStorageMonitorService.java
+++ b/services/java/com/android/server/DeviceStorageMonitorService.java
@@ -37,7 +37,7 @@
 import android.provider.Settings;
 import android.util.Config;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 import android.provider.Settings;
 
 /**
@@ -105,7 +105,7 @@
         public void handleMessage(Message msg) {
             //dont handle an invalid message
             if (msg.what != DEVICE_MEMORY_WHAT) {
-                Log.e(TAG, "Will not process invalid message");
+                Slog.e(TAG, "Will not process invalid message");
                 return;
             }
             checkMemory(msg.arg1 == _TRUE);
@@ -116,7 +116,7 @@
         public void onRemoveCompleted(String packageName, boolean succeeded) {
             mClearSucceeded = succeeded;
             mClearingCache = false;
-            if(localLOGV) Log.i(TAG, " Clear succeeded:"+mClearSucceeded
+            if(localLOGV) Slog.i(TAG, " Clear succeeded:"+mClearSucceeded
                     +", mClearingCache:"+mClearingCache+" Forcing memory check");
             postCheckMemoryMsg(false, 0);
         }
@@ -182,11 +182,11 @@
         }
         mClearingCache = true;
         try {
-            if (localLOGV) Log.i(TAG, "Clearing cache");
+            if (localLOGV) Slog.i(TAG, "Clearing cache");
             IPackageManager.Stub.asInterface(ServiceManager.getService("package")).
                     freeStorageAndNotify(getMemThreshold(), mClearCacheObserver);
         } catch (RemoteException e) {
-            Log.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
+            Slog.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
             mClearingCache = false;
             mClearSucceeded = false;
         }
@@ -198,15 +198,15 @@
         // and should be accessed via a lock but even if it does this test will fail now and
         //hopefully the next time this flag will be set to the correct value.
         if(mClearingCache) {
-            if(localLOGV) Log.i(TAG, "Thread already running just skip");
+            if(localLOGV) Slog.i(TAG, "Thread already running just skip");
             //make sure the thread is not hung for too long
             long diffTime = System.currentTimeMillis() - mThreadStartTime;
             if(diffTime > (10*60*1000)) {
-                Log.w(TAG, "Thread that clears cache file seems to run for ever");
+                Slog.w(TAG, "Thread that clears cache file seems to run for ever");
             }
         } else {
             restatDataDir();
-            if (localLOGV)  Log.v(TAG, "freeMemory="+mFreeMem);
+            if (localLOGV)  Slog.v(TAG, "freeMemory="+mFreeMem);
 
             //post intent to NotificationManager to display icon if necessary
             long memThreshold = getMemThreshold();
@@ -220,23 +220,23 @@
                         mClearSucceeded = false;
                         clearCache();
                     } else {
-                        Log.i(TAG, "Running low on memory. Sending notification");
+                        Slog.i(TAG, "Running low on memory. Sending notification");
                         sendNotification();
                         mLowMemFlag = true;
                     }
                 } else {
-                    if (localLOGV) Log.v(TAG, "Running low on memory " +
+                    if (localLOGV) Slog.v(TAG, "Running low on memory " +
                             "notification already sent. do nothing");
                 }
             } else {
                 if (mLowMemFlag) {
-                    Log.i(TAG, "Memory available. Cancelling notification");
+                    Slog.i(TAG, "Memory available. Cancelling notification");
                     cancelNotification();
                     mLowMemFlag = false;
                 }
             }
         }
-        if(localLOGV) Log.i(TAG, "Posting Message again");
+        if(localLOGV) Slog.i(TAG, "Posting Message again");
         //keep posting messages to itself periodically
         postCheckMemoryMsg(true, DEFAULT_CHECK_INTERVAL);
     }
@@ -259,7 +259,7 @@
                               mContentResolver,
                               Settings.Secure.SYS_STORAGE_THRESHOLD_PERCENTAGE,
                               DEFAULT_THRESHOLD_PERCENTAGE);
-        if(localLOGV) Log.v(TAG, "Threshold Percentage="+value);
+        if(localLOGV) Slog.v(TAG, "Threshold Percentage="+value);
         //evaluate threshold value
         return mTotalMemory*value;
     }
@@ -291,7 +291,7 @@
     * application
     */
     private final void sendNotification() {
-        if(localLOGV) Log.i(TAG, "Sending low memory notification");
+        if(localLOGV) Slog.i(TAG, "Sending low memory notification");
         //log the event to event log with the amount of free storage(in bytes) left on the device
         EventLog.writeEvent(EventLogTags.LOW_STORAGE, mFreeMem);
         //  Pack up the values and broadcast them to everyone
@@ -319,7 +319,7 @@
      * Cancels low storage notification and sends OK intent.
      */
     private final void cancelNotification() {
-        if(localLOGV) Log.i(TAG, "Canceling low memory notification");
+        if(localLOGV) Slog.i(TAG, "Canceling low memory notification");
         NotificationManager mNotificationMgr =
                 (NotificationManager)mContext.getSystemService(
                         Context.NOTIFICATION_SERVICE);
diff --git a/services/java/com/android/server/DockObserver.java b/services/java/com/android/server/DockObserver.java
index a0c850f..547a2a1 100644
--- a/services/java/com/android/server/DockObserver.java
+++ b/services/java/com/android/server/DockObserver.java
@@ -57,6 +57,7 @@
 import android.text.format.DateUtils;
 import android.text.format.Time;
 import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.R;
 import com.android.internal.app.DisableCarModeActivity;
@@ -147,7 +148,7 @@
                 try {
                     mContext.startActivity(intent);
                 } catch (ActivityNotFoundException e) {
-                    Log.w(TAG, e.getCause());
+                    Slog.w(TAG, e.getCause());
                 }
             }
         }
@@ -249,7 +250,7 @@
     @Override
     public void onUEvent(UEventObserver.UEvent event) {
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.v(TAG, "Dock UEVENT: " + event.toString());
+            Slog.v(TAG, "Dock UEVENT: " + event.toString());
         }
 
         synchronized (this) {
@@ -263,7 +264,7 @@
                         try {
                             setCarMode(carModeEnabled);
                         } catch (RemoteException e1) {
-                            Log.w(TAG, "Unable to change car mode.", e1);
+                            Slog.w(TAG, "Unable to change car mode.", e1);
                         }
                     }
                     if (mSystemReady) {
@@ -279,7 +280,7 @@
                     }
                 }
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Could not parse switch state from event " + event);
+                Slog.e(TAG, "Could not parse switch state from event " + event);
             }
         }
     }
@@ -293,9 +294,9 @@
             mPreviousDockState = mDockState = Integer.valueOf((new String(buffer, 0, len)).trim());
 
         } catch (FileNotFoundException e) {
-            Log.w(TAG, "This kernel does not have dock station support");
+            Slog.w(TAG, "This kernel does not have dock station support");
         } catch (Exception e) {
-            Log.e(TAG, "" , e);
+            Slog.e(TAG, "" , e);
         }
     }
 
@@ -310,7 +311,7 @@
                 try {
                     setCarMode(enableCarMode);
                 } catch (RemoteException e) {
-                    Log.w(TAG, "Unable to change car mode.", e);
+                    Slog.w(TAG, "Unable to change car mode.", e);
                 }
             }
             // don't bother broadcasting undocked here
@@ -332,13 +333,13 @@
             switch (msg.what) {
                 case MSG_DOCK_STATE:
                     synchronized (this) {
-                        Log.i(TAG, "Dock state changed: " + mDockState);
+                        Slog.i(TAG, "Dock state changed: " + mDockState);
 
                         final ContentResolver cr = mContext.getContentResolver();
 
                         if (Settings.Secure.getInt(cr,
                                 Settings.Secure.DEVICE_PROVISIONED, 0) == 0) {
-                            Log.i(TAG, "Device not provisioned, skipping dock broadcast");
+                            Slog.i(TAG, "Device not provisioned, skipping dock broadcast");
                             return;
                         }
                         // Pack up the values and broadcast them to everyone
@@ -414,21 +415,31 @@
                             try {
                                 DockObserver.this.updateTwilight();
                             } catch (RemoteException e) {
-                                Log.w(TAG, "Unable to change night mode.", e);
+                                Slog.w(TAG, "Unable to change night mode.", e);
                             }
                         }
                     }
                     break;
                 case MSG_ENABLE_LOCATION_UPDATES:
-                    if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
+                    boolean networkLocationEnabled;
+                    try {
+                        networkLocationEnabled =
+                            mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+                    } catch (Exception e) {
+                        // we may get IllegalArgumentException if network location provider
+                        // does not exist or is not yet installed.
+                        networkLocationEnabled = false;
+                    }
+                    if (networkLocationEnabled) {
                         mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
-                                LOCATION_UPDATE_MS, LOCATION_UPDATE_DISTANCE_METER, mLocationListener);
+                                LOCATION_UPDATE_MS, LOCATION_UPDATE_DISTANCE_METER, 
+                                mLocationListener);
                         retrieveLocation();
                         if (mCarModeEnabled && mLocation != null && mNightMode == MODE_NIGHT_AUTO) {
                             try {
                                 DockObserver.this.updateTwilight();
                             } catch (RemoteException e) {
-                                Log.w(TAG, "Unable to change night mode.", e);
+                                Slog.w(TAG, "Unable to change night mode.", e);
                             }
                         }
                     } else {
diff --git a/services/java/com/android/server/DropBoxManagerService.java b/services/java/com/android/server/DropBoxManagerService.java
index 090e9d3..667953c 100644
--- a/services/java/com/android/server/DropBoxManagerService.java
+++ b/services/java/com/android/server/DropBoxManagerService.java
@@ -32,7 +32,7 @@
 import android.os.SystemClock;
 import android.provider.Settings;
 import android.text.format.Time;
-import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.os.IDropBoxManagerService;
 
@@ -103,7 +103,7 @@
                 init();
                 trimToFit();
             } catch (IOException e) {
-                Log.e(TAG, "Can't init", e);
+                Slog.e(TAG, "Can't init", e);
             }
         }
     };
@@ -195,7 +195,7 @@
 
                 long len = temp.length();
                 if (len > max) {
-                    Log.w(TAG, "Dropping: " + tag + " (" + temp.length() + " > " + max + " bytes)");
+                    Slog.w(TAG, "Dropping: " + tag + " (" + temp.length() + " > " + max + " bytes)");
                     temp.delete();
                     temp = null;  // Pass temp = null to createEntry() to leave a tombstone
                     break;
@@ -205,7 +205,7 @@
             createEntry(temp, tag, flags);
             temp = null;
         } catch (IOException e) {
-            Log.e(TAG, "Can't write: " + tag, e);
+            Slog.e(TAG, "Can't write: " + tag, e);
         } finally {
             try { if (output != null) output.close(); } catch (IOException e) {}
             entry.close();
@@ -227,7 +227,7 @@
         try {
             init();
         } catch (IOException e) {
-            Log.e(TAG, "Can't init", e);
+            Slog.e(TAG, "Can't init", e);
             return null;
         }
 
@@ -243,7 +243,7 @@
                 return new DropBoxManager.Entry(
                         entry.tag, entry.timestampMillis, entry.file, entry.flags);
             } catch (IOException e) {
-                Log.e(TAG, "Can't read: " + entry.file, e);
+                Slog.e(TAG, "Can't read: " + entry.file, e);
                 // Continue to next file
             }
         }
@@ -262,7 +262,7 @@
             init();
         } catch (IOException e) {
             pw.println("Can't initialize: " + e);
-            Log.e(TAG, "Can't init", e);
+            Slog.e(TAG, "Can't init", e);
             return;
         }
 
@@ -357,7 +357,7 @@
                     }
                 } catch (IOException e) {
                     out.append("*** ").append(e.toString()).append("\n");
-                    Log.e(TAG, "Can't read: " + entry.file, e);
+                    Slog.e(TAG, "Can't read: " + entry.file, e);
                 } finally {
                     if (dbe != null) dbe.close();
                 }
@@ -541,17 +541,17 @@
             // Scan pre-existing files.
             for (File file : files) {
                 if (file.getName().endsWith(".tmp")) {
-                    Log.i(TAG, "Cleaning temp file: " + file);
+                    Slog.i(TAG, "Cleaning temp file: " + file);
                     file.delete();
                     continue;
                 }
 
                 EntryFile entry = new EntryFile(file, mBlockSize);
                 if (entry.tag == null) {
-                    Log.w(TAG, "Unrecognized file: " + file);
+                    Slog.w(TAG, "Unrecognized file: " + file);
                     continue;
                 } else if (entry.timestampMillis == 0) {
-                    Log.w(TAG, "Invalid filename: " + file);
+                    Slog.w(TAG, "Invalid filename: " + file);
                     file.delete();
                     continue;
                 }
@@ -677,7 +677,7 @@
         // was lost.  Tombstones are expunged by age (see above).
 
         if (mAllFiles.blocks > mCachedQuotaBlocks) {
-            Log.i(TAG, "Usage (" + mAllFiles.blocks + ") > Quota (" + mCachedQuotaBlocks + ")");
+            Slog.i(TAG, "Usage (" + mAllFiles.blocks + ") > Quota (" + mCachedQuotaBlocks + ")");
 
             // Find a fair share amount of space to limit each tag
             int unsqueezed = mAllFiles.blocks, squeezed = 0;
@@ -703,7 +703,7 @@
                         if (entry.file != null) entry.file.delete();
                         enrollEntry(new EntryFile(mDropBoxDir, entry.tag, entry.timestampMillis));
                     } catch (IOException e) {
-                        Log.e(TAG, "Can't write tombstone file", e);
+                        Slog.e(TAG, "Can't write tombstone file", e);
                     }
                 }
             }
diff --git a/services/java/com/android/server/EntropyService.java b/services/java/com/android/server/EntropyService.java
index 28f09f5..0a53e9c 100644
--- a/services/java/com/android/server/EntropyService.java
+++ b/services/java/com/android/server/EntropyService.java
@@ -27,7 +27,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.SystemProperties;
-import android.util.Log;
+import android.util.Slog;
 
 /**
  * A service designed to load and periodically save &quot;randomness&quot;
@@ -63,7 +63,7 @@
         @Override
         public void handleMessage(Message msg) {
             if (msg.what != ENTROPY_WHAT) {
-                Log.e(TAG, "Will not process invalid message");
+                Slog.e(TAG, "Will not process invalid message");
                 return;
             }
             writeEntropy();
@@ -87,7 +87,7 @@
         try {
             RandomBlock.fromFile(ENTROPY_FILENAME).toFile(RANDOM_DEV);
         } catch (IOException e) {
-            Log.w(TAG, "unable to load initial entropy (first boot?)", e);
+            Slog.w(TAG, "unable to load initial entropy (first boot?)", e);
         }
     }
 
@@ -95,7 +95,7 @@
         try {
             RandomBlock.fromFile(RANDOM_DEV).toFile(ENTROPY_FILENAME);
         } catch (IOException e) {
-            Log.w(TAG, "unable to write entropy", e);
+            Slog.w(TAG, "unable to write entropy", e);
         }
     }
 
@@ -131,7 +131,7 @@
             out.println(System.currentTimeMillis());
             out.println(System.nanoTime());
         } catch (IOException e) {
-            Log.w(TAG, "Unable to add device specific data to the entropy pool", e);
+            Slog.w(TAG, "Unable to add device specific data to the entropy pool", e);
         } finally {
             if (out != null) {
                 out.close();
diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java
index 9d69564..6f0a91d 100644
--- a/services/java/com/android/server/HeadsetObserver.java
+++ b/services/java/com/android/server/HeadsetObserver.java
@@ -24,7 +24,7 @@
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
 import android.os.UEventObserver;
-import android.util.Log;
+import android.util.Slog;
 import android.media.AudioManager;
 
 import java.io.FileReader;
@@ -66,12 +66,12 @@
 
     @Override
     public void onUEvent(UEventObserver.UEvent event) {
-        if (LOG) Log.v(TAG, "Headset UEVENT: " + event.toString());
+        if (LOG) Slog.v(TAG, "Headset UEVENT: " + event.toString());
 
         try {
             update(event.get("SWITCH_NAME"), Integer.parseInt(event.get("SWITCH_STATE")));
         } catch (NumberFormatException e) {
-            Log.e(TAG, "Could not parse switch state from event " + event);
+            Slog.e(TAG, "Could not parse switch state from event " + event);
         }
     }
 
@@ -91,9 +91,9 @@
             newName = new String(buffer, 0, len).trim();
 
         } catch (FileNotFoundException e) {
-            Log.w(TAG, "This kernel does not have wired headset support");
+            Slog.w(TAG, "This kernel does not have wired headset support");
         } catch (Exception e) {
-            Log.e(TAG, "" , e);
+            Slog.e(TAG, "" , e);
         }
 
         update(newName, newState);
@@ -167,7 +167,7 @@
             intent.putExtra("name", headsetName);
             intent.putExtra("microphone", microphone);
 
-            if (LOG) Log.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
+            if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
             // TODO: Should we require a permission?
             ActivityManagerNative.broadcastStickyIntent(intent, null);
         }
diff --git a/services/java/com/android/server/InputDevice.java b/services/java/com/android/server/InputDevice.java
index d3bb6dc..d5e94ec 100644
--- a/services/java/com/android/server/InputDevice.java
+++ b/services/java/com/android/server/InputDevice.java
@@ -16,12 +16,14 @@
 
 package com.android.server;
 
-import android.util.Log;
+import android.util.Slog;
 import android.view.Display;
 import android.view.MotionEvent;
 import android.view.Surface;
 import android.view.WindowManagerPolicy;
 
+import java.io.PrintWriter;
+
 public class InputDevice {
     static final boolean DEBUG_POINTERS = false;
     static final boolean DEBUG_HACKS = false;
@@ -58,6 +60,7 @@
         float yMoveScale;
         MotionEvent currentMove = null;
         boolean changed = false;
+        boolean everChanged = false;
         long mDownTime = 0;
         
         // The currently assigned pointer IDs, corresponding to the last data.
@@ -103,6 +106,56 @@
         int mAddingPointerOffset = 0;
         final boolean[] mDown = new boolean[MAX_POINTERS];
         
+        void dumpIntArray(PrintWriter pw, int[] array) {
+            pw.print("[");
+            for (int i=0; i<array.length; i++) {
+                if (i > 0) pw.print(", ");
+                pw.print(array[i]);
+            }
+            pw.print("]");
+        }
+        
+        void dumpBooleanArray(PrintWriter pw, boolean[] array) {
+            pw.print("[");
+            for (int i=0; i<array.length; i++) {
+                if (i > 0) pw.print(", ");
+                pw.print(array[i] ? "true" : "false");
+            }
+            pw.print("]");
+        }
+        
+        void dump(PrintWriter pw, String prefix) {
+            pw.print(prefix); pw.print("xPrecision="); pw.print(xPrecision);
+                    pw.print(" yPrecision="); pw.println(yPrecision);
+            pw.print(prefix); pw.print("xMoveScale="); pw.print(xMoveScale);
+                    pw.print(" yMoveScale="); pw.println(yMoveScale);
+            if (currentMove != null) {
+                pw.print(prefix); pw.print("currentMove="); pw.println(currentMove);
+            }
+            if (changed || mDownTime != 0) {
+                pw.print(prefix); pw.print("changed="); pw.print(changed);
+                        pw.print(" mDownTime="); pw.println(mDownTime);
+            }
+            pw.print(prefix); pw.print("mPointerIds="); dumpIntArray(pw, mPointerIds);
+                    pw.println("");
+            if (mSkipLastPointers || mLastNumPointers != 0) {
+                pw.print(prefix); pw.print("mSkipLastPointers="); pw.print(mSkipLastPointers);
+                        pw.print(" mLastNumPointers="); pw.println(mLastNumPointers);
+                pw.print(prefix); pw.print("mLastData="); dumpIntArray(pw, mLastData);
+                        pw.println("");
+            }
+            if (mNextNumPointers != 0) {
+                pw.print(prefix); pw.print("mNextNumPointers="); pw.println(mNextNumPointers);
+                pw.print(prefix); pw.print("mNextData="); dumpIntArray(pw, mNextData);
+                        pw.println("");
+            }
+            pw.print(prefix); pw.print("mDroppedBadPoint=");
+                    dumpBooleanArray(pw, mDroppedBadPoint); pw.println("");
+            pw.print(prefix); pw.print("mAddingPointerOffset="); pw.println(mAddingPointerOffset);
+            pw.print(prefix); pw.print("mDown=");
+                    dumpBooleanArray(pw, mDown); pw.println("");
+        }
+        
         MotionState(int mx, int my) {
             xPrecision = mx;
             yPrecision = my;
@@ -142,7 +195,7 @@
                 final int ioff = i * MotionEvent.NUM_SAMPLE_DATA;
                 //final int x = mNextData[ioff + MotionEvent.SAMPLE_X];
                 final int y = mNextData[ioff + MotionEvent.SAMPLE_Y];
-                if (DEBUG_HACKS) Log.v("InputDevice", "Looking at next point #" + i + ": y=" + y);
+                if (DEBUG_HACKS) Slog.v("InputDevice", "Looking at next point #" + i + ": y=" + y);
                 boolean dropped = false;
                 if (!mDroppedBadPoint[i] && mLastNumPointers > 0) {
                     dropped = true;
@@ -156,7 +209,7 @@
                         int dy = y - mLastData[joff + MotionEvent.SAMPLE_Y];
                         //if (dx < 0) dx = -dx;
                         if (dy < 0) dy = -dy;
-                        if (DEBUG_HACKS) Log.v("InputDevice", "Comparing with last point #" + j
+                        if (DEBUG_HACKS) Slog.v("InputDevice", "Comparing with last point #" + j
                                 + ": y=" + mLastData[joff] + " dy=" + dy);
                         if (dy < maxDy) {
                             dropped = false;
@@ -168,7 +221,7 @@
                     }
                     if (dropped) {
                         dropped = true;
-                        Log.i("InputDevice", "Dropping bad point #" + i
+                        Slog.i("InputDevice", "Dropping bad point #" + i
                                 + ": newY=" + y + " closestDy=" + closestDy
                                 + " maxDy=" + maxDy);
                         mNextData[ioff + MotionEvent.SAMPLE_Y] = closestY;
@@ -188,7 +241,7 @@
                 int nextNumPointers) {
             final int numPointers = mLastNumPointers;
             final int[] rawData = mLastData;
-            if (DEBUG_HACKS) Log.v("InputDevice", "lastNumPointers=" + lastNumPointers
+            if (DEBUG_HACKS) Slog.v("InputDevice", "lastNumPointers=" + lastNumPointers
                     + " nextNumPointers=" + nextNumPointers
                     + " numPointers=" + numPointers);
             for (int i=0; i<numPointers; i++) {
@@ -202,7 +255,7 @@
                     if (lastNumPointers < nextNumPointers) {
                         // This pointer is going down.  Clear its history
                         // and start fresh.
-                        if (DEBUG_HACKS) Log.v("InputDevice", "Pointer down @ index "
+                        if (DEBUG_HACKS) Slog.v("InputDevice", "Pointer down @ index "
                                 + upOrDownPointer + " id " + mPointerIds[i]);
                         mHistoryDataStart[i] = 0;
                         mHistoryDataEnd[i] = 0;
@@ -215,7 +268,7 @@
                         // The pointer is going up.  Just fall through to
                         // recompute the last averaged point (and don't add
                         // it as a new point to include in the average).
-                        if (DEBUG_HACKS) Log.v("InputDevice", "Pointer up @ index "
+                        if (DEBUG_HACKS) Slog.v("InputDevice", "Pointer up @ index "
                                 + upOrDownPointer + " id " + mPointerIds[i]);
                     }
                 } else {
@@ -228,7 +281,7 @@
                     int dx = newX-oldX;
                     int dy = newY-oldY;
                     int delta = dx*dx + dy*dy;
-                    if (DEBUG_HACKS) Log.v("InputDevice", "Delta from last: " + delta);
+                    if (DEBUG_HACKS) Slog.v("InputDevice", "Delta from last: " + delta);
                     if (delta >= (75*75)) {
                         // Magic number, if moving farther than this, turn
                         // off filtering to avoid lag in response.
@@ -284,7 +337,7 @@
                 totalPressure += pressure;
                 x /= totalPressure;
                 y /= totalPressure;
-                if (DEBUG_HACKS) Log.v("InputDevice", "Averaging " + totalPressure
+                if (DEBUG_HACKS) Slog.v("InputDevice", "Averaging " + totalPressure
                         + " weight: (" + x + "," + y + ")");
                 mAveragedData[ioff + MotionEvent.SAMPLE_X] = x;
                 mAveragedData[ioff + MotionEvent.SAMPLE_Y] = y;
@@ -305,7 +358,7 @@
             final int[] nextData = mNextData;
             final int id = nextIndex * MotionEvent.NUM_SAMPLE_DATA;
             
-            if (DEBUG_POINTERS) Log.v("InputDevice", "assignPointer: nextIndex="
+            if (DEBUG_POINTERS) Slog.v("InputDevice", "assignPointer: nextIndex="
                     + nextIndex + " dataOff=" + id);
             final int x1 = nextData[id + MotionEvent.SAMPLE_X];
             final int y1 = nextData[id + MotionEvent.SAMPLE_Y];
@@ -329,7 +382,7 @@
                 }
             }
             
-            if (DEBUG_POINTERS) Log.v("InputDevice", "New index " + nextIndex
+            if (DEBUG_POINTERS) Slog.v("InputDevice", "New index " + nextIndex
                     + " best old index=" + bestIndex + " (distance="
                     + bestDistance + ")");
             next2Last[nextIndex] = bestIndex;
@@ -344,7 +397,7 @@
                 return false;
             }
             
-            if (DEBUG_POINTERS) Log.v("InputDevice", "Old index " + bestIndex
+            if (DEBUG_POINTERS) Slog.v("InputDevice", "Old index " + bestIndex
                     + " has multiple best new pointers!");
             
             last2Next[bestIndex] = -2;
@@ -369,7 +422,7 @@
                 last2Next[i] = -1;
             }
             
-            if (DEBUG_POINTERS) Log.v("InputDevice",
+            if (DEBUG_POINTERS) Slog.v("InputDevice",
                     "Update pointers: lastNumPointers=" + lastNumPointers
                     + " nextNumPointers=" + nextNumPointers);
             
@@ -385,7 +438,7 @@
             // new pointer locations find their best previous location is
             // the same.
             if (conflicts) {
-                if (DEBUG_POINTERS) Log.v("InputDevice", "Resolving conflicts");
+                if (DEBUG_POINTERS) Slog.v("InputDevice", "Resolving conflicts");
                 
                 for (int i=0; i<lastNumPointers; i++) {
                     if (last2Next[i] != -2) {
@@ -396,7 +449,7 @@
                     // we should do something like the one described at
                     // http://portal.acm.org/citation.cfm?id=997856
                     
-                    if (DEBUG_POINTERS) Log.v("InputDevice",
+                    if (DEBUG_POINTERS) Slog.v("InputDevice",
                             "Resolving last index #" + i);
                     
                     int numFound;
@@ -416,7 +469,7 @@
                         }
                         
                         if (worstJ >= 0) {
-                            if (DEBUG_POINTERS) Log.v("InputDevice",
+                            if (DEBUG_POINTERS) Slog.v("InputDevice",
                                     "Worst new pointer: " + worstJ
                                     + " (distance=" + worstDistance + ")");
                             if (assignPointer(worstJ, false)) {
@@ -434,13 +487,13 @@
             if (lastNumPointers < nextNumPointers) {
                 // We have one or more new pointers that are down.  Create a
                 // new pointer identifier for one of them.
-                if (DEBUG_POINTERS) Log.v("InputDevice", "Adding new pointer");
+                if (DEBUG_POINTERS) Slog.v("InputDevice", "Adding new pointer");
                 int nextId = 0;
                 int i=0;
                 while (i < lastNumPointers) {
                     if (mPointerIds[i] > nextId) {
                         // Found a hole, insert the pointer here.
-                        if (DEBUG_POINTERS) Log.v("InputDevice",
+                        if (DEBUG_POINTERS) Slog.v("InputDevice",
                                 "Inserting new pointer at hole " + i);
                         System.arraycopy(mPointerIds, i, mPointerIds,
                                 i+1, lastNumPointers-i);
@@ -453,7 +506,7 @@
                     nextId++;
                 }
                 
-                if (DEBUG_POINTERS) Log.v("InputDevice",
+                if (DEBUG_POINTERS) Slog.v("InputDevice",
                         "New pointer id " + nextId + " at index " + i);
                 
                 mLastNumPointers++;
@@ -463,7 +516,7 @@
                 // And assign this identifier to the first new pointer.
                 for (int j=0; j<nextNumPointers; j++) {
                     if (next2Last[j] < 0) {
-                        if (DEBUG_POINTERS) Log.v("InputDevice",
+                        if (DEBUG_POINTERS) Slog.v("InputDevice",
                                 "Assigning new id to new pointer index " + j);
                         next2Last[j] = i;
                         break;
@@ -477,7 +530,7 @@
             for (int i=0; i<nextNumPointers; i++) {
                 int lastIndex = next2Last[i];
                 if (lastIndex >= 0) {
-                    if (DEBUG_POINTERS) Log.v("InputDevice",
+                    if (DEBUG_POINTERS) Slog.v("InputDevice",
                             "Copying next pointer index " + i
                             + " to last index " + lastIndex);
                     System.arraycopy(nextData, i*MotionEvent.NUM_SAMPLE_DATA,
@@ -489,10 +542,10 @@
             if (lastNumPointers > nextNumPointers) {
                 // One or more pointers has gone up.  Find the first one,
                 // and adjust accordingly.
-                if (DEBUG_POINTERS) Log.v("InputDevice", "Removing old pointer");
+                if (DEBUG_POINTERS) Slog.v("InputDevice", "Removing old pointer");
                 for (int i=0; i<lastNumPointers; i++) {
                     if (last2Next[i] == -1) {
-                        if (DEBUG_POINTERS) Log.v("InputDevice",
+                        if (DEBUG_POINTERS) Slog.v("InputDevice",
                                 "Removing old pointer at index " + i);
                         retIndex = i;
                         break;
@@ -531,7 +584,7 @@
             final int lastNumPointers = mLastNumPointers;
             final int nextNumPointers = mNextNumPointers;
             if (mNextNumPointers > MAX_POINTERS) {
-                Log.w("InputDevice", "Number of pointers " + mNextNumPointers
+                Slog.w("InputDevice", "Number of pointers " + mNextNumPointers
                         + " exceeded maximum of " + MAX_POINTERS);
                 mNextNumPointers = MAX_POINTERS;
             }
@@ -549,7 +602,7 @@
             
             final int numPointers = mLastNumPointers;
             
-            if (DEBUG_POINTERS) Log.v("InputDevice", "Processing "
+            if (DEBUG_POINTERS) Slog.v("InputDevice", "Processing "
                     + numPointers + " pointers (going from " + lastNumPointers
                     + " to " + nextNumPointers + ")");
             
@@ -661,13 +714,13 @@
             }
             
             if (currentMove != null) {
-                if (false) Log.i("InputDevice", "Adding batch x="
+                if (false) Slog.i("InputDevice", "Adding batch x="
                         + reportData[MotionEvent.SAMPLE_X]
                         + " y=" + reportData[MotionEvent.SAMPLE_Y]
                         + " to " + currentMove);
                 currentMove.addBatch(curTime, reportData, metaState);
                 if (WindowManagerPolicy.WATCH_POINTER) {
-                    Log.i("KeyInputQueue", "Updating: " + currentMove);
+                    Slog.i("KeyInputQueue", "Updating: " + currentMove);
                 }
                 return null;
             }
@@ -748,13 +801,13 @@
             }
             
             if (currentMove != null) {
-                if (false) Log.i("InputDevice", "Adding batch x="
+                if (false) Slog.i("InputDevice", "Adding batch x="
                         + scaled[MotionEvent.SAMPLE_X]
                         + " y=" + scaled[MotionEvent.SAMPLE_Y]
                         + " to " + currentMove);
                 currentMove.addBatch(curTime, scaled, metaState);
                 if (WindowManagerPolicy.WATCH_POINTER) {
-                    Log.i("KeyInputQueue", "Updating: " + currentMove);
+                    Slog.i("KeyInputQueue", "Updating: " + currentMove);
                 }
                 return null;
             }
@@ -775,6 +828,14 @@
         int range;
         int flat;
         int fuzz;
+        
+        final void dump(PrintWriter pw) {
+            pw.print("minValue="); pw.print(minValue);
+            pw.print(" maxValue="); pw.print(maxValue);
+            pw.print(" range="); pw.print(range);
+            pw.print(" flat="); pw.print(flat);
+            pw.print(" fuzz="); pw.print(fuzz);
+        }
     };
     
     InputDevice(int _id, int _classes, String _name,
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 59d4c9b..60813f1 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -62,7 +62,7 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 import android.util.PrintWriterPrinter;
 import android.util.Printer;
 import android.view.IWindowManager;
@@ -317,7 +317,7 @@
                 hideInputMethodMenu();
                 return;
             } else {
-                Log.w(TAG, "Unexpected intent " + intent);
+                Slog.w(TAG, "Unexpected intent " + intent);
             }
 
             // Inform the current client of the change in active status
@@ -326,7 +326,7 @@
                     mCurClient.client.setActive(mScreenOn);
                 }
             } catch (RemoteException e) {
-                Log.w(TAG, "Got RemoteException sending 'screen on/off' notification to pid "
+                Slog.w(TAG, "Got RemoteException sending 'screen on/off' notification to pid "
                         + mCurClient.pid + " uid " + mCurClient.uid);
             }
         }
@@ -379,7 +379,7 @@
                         int change = isPackageDisappearing(imi.getPackageName());
                         if (change == PACKAGE_TEMPORARY_CHANGE
                                 || change == PACKAGE_PERMANENT_CHANGE) {
-                            Log.i(TAG, "Input method uninstalled, disabling: "
+                            Slog.i(TAG, "Input method uninstalled, disabling: "
                                     + imi.getComponent());
                             setInputMethodEnabledLocked(imi.getId(), false);
                         }
@@ -403,12 +403,12 @@
                         if (si == null) {
                             // Uh oh, current input method is no longer around!
                             // Pick another one...
-                            Log.i(TAG, "Current input method removed: " + curInputMethodId);
+                            Slog.i(TAG, "Current input method removed: " + curInputMethodId);
                             if (!chooseNewDefaultIMELocked()) {
                                 changed = true;
                                 curIm = null;
                                 curInputMethodId = "";
-                                Log.i(TAG, "Unsetting current input method");
+                                Slog.i(TAG, "Unsetting current input method");
                                 Settings.Secure.putString(mContext.getContentResolver(),
                                         Settings.Secure.DEFAULT_INPUT_METHOD,
                                         curInputMethodId);
@@ -469,15 +469,15 @@
         final String enabledStr = Settings.Secure.getString(
                 mContext.getContentResolver(),
                 Settings.Secure.ENABLED_INPUT_METHODS);
-        Log.i(TAG, "Enabled input methods: " + enabledStr);
+        Slog.i(TAG, "Enabled input methods: " + enabledStr);
         if (enabledStr == null) {
-            Log.i(TAG, "Enabled input methods has not been set, enabling all");
+            Slog.i(TAG, "Enabled input methods has not been set, enabling all");
             InputMethodInfo defIm = null;
             StringBuilder sb = new StringBuilder(256);
             final int N = mMethodList.size();
             for (int i=0; i<N; i++) {
                 InputMethodInfo imi = mMethodList.get(i);
-                Log.i(TAG, "Adding: " + imi.getId());
+                Slog.i(TAG, "Adding: " + imi.getId());
                 if (i > 0) sb.append(':');
                 sb.append(imi.getId());
                 if (defIm == null && imi.getIsDefaultResourceId() != 0) {
@@ -486,7 +486,7 @@
                                 imi.getPackageName(), 0).getResources();
                         if (res.getBoolean(imi.getIsDefaultResourceId())) {
                             defIm = imi;
-                            Log.i(TAG, "Selected default: " + imi.getId());
+                            Slog.i(TAG, "Selected default: " + imi.getId());
                         }
                     } catch (PackageManager.NameNotFoundException ex) {
                     } catch (Resources.NotFoundException ex) {
@@ -495,7 +495,7 @@
             }
             if (defIm == null && N > 0) {
                 defIm = mMethodList.get(0);
-                Log.i(TAG, "No default found, using " + defIm.getId());
+                Slog.i(TAG, "No default found, using " + defIm.getId());
             }
             Settings.Secure.putString(mContext.getContentResolver(),
                     Settings.Secure.ENABLED_INPUT_METHODS, sb.toString());
@@ -523,7 +523,7 @@
             // The input method manager only throws security exceptions, so let's
             // log all others.
             if (!(e instanceof SecurityException)) {
-                Log.e(TAG, "Input Method Manager Crash", e);
+                Slog.e(TAG, "Input Method Manager Crash", e);
             }
             throw e;
         }
@@ -536,7 +536,7 @@
                 try {
                     startInputInnerLocked();
                 } catch (RuntimeException e) {
-                    Log.w(TAG, "Unexpected exception", e);
+                    Slog.w(TAG, "Unexpected exception", e);
                 }
             }
         }
@@ -600,7 +600,7 @@
 
     void unbindCurrentClientLocked() {
         if (mCurClient != null) {
-            if (DEBUG) Log.v(TAG, "unbindCurrentInputLocked: client = "
+            if (DEBUG) Slog.v(TAG, "unbindCurrentInputLocked: client = "
                     + mCurClient.client.asBinder());
             if (mBoundToMethod) {
                 mBoundToMethod = false;
@@ -617,7 +617,7 @@
             try {
                 mCurClient.client.setActive(false);
             } catch (RemoteException e) {
-                Log.w(TAG, "Got RemoteException sending setActive(false) notification to pid "
+                Slog.w(TAG, "Got RemoteException sending setActive(false) notification to pid "
                         + mCurClient.pid + " uid " + mCurClient.uid);
             }
             mCurClient = null;
@@ -662,7 +662,7 @@
                     MSG_RESTART_INPUT, session, mCurInputContext, mCurAttribute));
         }
         if (mShowRequested) {
-            if (DEBUG) Log.v(TAG, "Attach new input asks to show input");
+            if (DEBUG) Slog.v(TAG, "Attach new input asks to show input");
             showCurrentInputLocked(getAppShowFlags(), null);
         }
         return needResult
@@ -691,7 +691,7 @@
                 // because if the focus changes some time before or after, the
                 // next client receiving focus that has any interest in input will
                 // be calling through here after that change happens.
-                Log.w(TAG, "Starting input on non-focused client " + cs.client
+                Slog.w(TAG, "Starting input on non-focused client " + cs.client
                         + " (uid=" + cs.uid + " pid=" + cs.pid + ")");
                 return null;
             }
@@ -702,7 +702,7 @@
             // If the client is changing, we need to switch over to the new
             // one.
             unbindCurrentClientLocked();
-            if (DEBUG) Log.v(TAG, "switching to client: client = "
+            if (DEBUG) Slog.v(TAG, "switching to client: client = "
                     + cs.client.asBinder());
 
             // If the screen is on, inform the new client it is active
@@ -710,7 +710,7 @@
                 try {
                     cs.client.setActive(mScreenOn);
                 } catch (RemoteException e) {
-                    Log.w(TAG, "Got RemoteException sending setActive notification to pid "
+                    Slog.w(TAG, "Got RemoteException sending setActive notification to pid "
                             + cs.pid + " uid " + cs.uid);
                 }
             }
@@ -734,7 +734,7 @@
                 if (mCurMethod != null) {
                     if (!cs.sessionRequested) {
                         cs.sessionRequested = true;
-                        if (DEBUG) Log.v(TAG, "Creating new session for client " + cs);
+                        if (DEBUG) Slog.v(TAG, "Creating new session for client " + cs);
                         executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
                                 MSG_CREATE_SESSION, mCurMethod,
                                 new MethodCallback(mCurMethod)));
@@ -792,7 +792,7 @@
             mCurId = info.getId();
             mCurToken = new Binder();
             try {
-                if (DEBUG) Log.v(TAG, "Adding window token: " + mCurToken);
+                if (DEBUG) Slog.v(TAG, "Adding window token: " + mCurToken);
                 mIWindowManager.addWindowToken(mCurToken,
                         WindowManager.LayoutParams.TYPE_INPUT_METHOD);
             } catch (RemoteException e) {
@@ -800,7 +800,7 @@
             return new InputBindResult(null, mCurId, mCurSeq);
         } else {
             mCurIntent = null;
-            Log.w(TAG, "Failure connecting to input method service: "
+            Slog.w(TAG, "Failure connecting to input method service: "
                     + mCurIntent);
         }
         return null;
@@ -828,15 +828,15 @@
             if (mCurIntent != null && name.equals(mCurIntent.getComponent())) {
                 mCurMethod = IInputMethod.Stub.asInterface(service);
                 if (mCurToken == null) {
-                    Log.w(TAG, "Service connected without a token!");
+                    Slog.w(TAG, "Service connected without a token!");
                     unbindCurrentMethodLocked(false);
                     return;
                 }
-                if (DEBUG) Log.v(TAG, "Initiating attach with token: " + mCurToken);
+                if (DEBUG) Slog.v(TAG, "Initiating attach with token: " + mCurToken);
                 executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
                         MSG_ATTACH_TOKEN, mCurMethod, mCurToken));
                 if (mCurClient != null) {
-                    if (DEBUG) Log.v(TAG, "Creating first session while with client "
+                    if (DEBUG) Slog.v(TAG, "Creating first session while with client "
                             + mCurClient);
                     executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
                             MSG_CREATE_SESSION, mCurMethod,
@@ -872,7 +872,7 @@
 
         if (mCurToken != null) {
             try {
-                if (DEBUG) Log.v(TAG, "Removing window token: " + mCurToken);
+                if (DEBUG) Slog.v(TAG, "Removing window token: " + mCurToken);
                 mIWindowManager.removeWindowToken(mCurToken);
             } catch (RemoteException e) {
             }
@@ -901,7 +901,7 @@
 
     public void onServiceDisconnected(ComponentName name) {
         synchronized (mMethodMap) {
-            if (DEBUG) Log.v(TAG, "Service disconnected: " + name
+            if (DEBUG) Slog.v(TAG, "Service disconnected: " + name
                     + " mCurIntent=" + mCurIntent);
             if (mCurMethod != null && mCurIntent != null
                     && name.equals(mCurIntent.getComponent())) {
@@ -923,16 +923,16 @@
         long ident = Binder.clearCallingIdentity();
         try {
             if (token == null || mCurToken != token) {
-                Log.w(TAG, "Ignoring setInputMethod of token: " + token);
+                Slog.w(TAG, "Ignoring setInputMethod of token: " + token);
                 return;
             }
 
             synchronized (mMethodMap) {
                 if (iconId == 0) {
-                    if (DEBUG) Log.d(TAG, "hide the small icon for the input method");
+                    if (DEBUG) Slog.d(TAG, "hide the small icon for the input method");
                     mStatusBar.setIconVisibility(mInputMethodIcon, false);
                 } else if (packageName != null) {
-                    if (DEBUG) Log.d(TAG, "show a small icon for the input method");
+                    if (DEBUG) Slog.d(TAG, "show a small icon for the input method");
                     mInputMethodData.iconId = iconId;
                     mInputMethodData.iconPackage = packageName;
                     mStatusBar.updateIcon(mInputMethodIcon, mInputMethodData, null);
@@ -955,7 +955,7 @@
             try {
                 setInputMethodLocked(id);
             } catch (IllegalArgumentException e) {
-                Log.w(TAG, "Unknown input method from prefs: " + id, e);
+                Slog.w(TAG, "Unknown input method from prefs: " + id, e);
                 mCurMethodId = null;
                 unbindCurrentMethodLocked(true);
             }
@@ -1006,7 +1006,7 @@
                         // focus in the window manager, to allow this call to
                         // be made before input is started in it.
                         if (!mIWindowManager.inputMethodClientHasFocus(client)) {
-                            Log.w(TAG, "Ignoring showSoftInput of: " + client);
+                            Slog.w(TAG, "Ignoring showSoftInput of: " + client);
                             return false;
                         }
                     } catch (RemoteException e) {
@@ -1014,7 +1014,7 @@
                     }
                 }
 
-                if (DEBUG) Log.v(TAG, "Client requesting input be shown");
+                if (DEBUG) Slog.v(TAG, "Client requesting input be shown");
                 return showCurrentInputLocked(flags, resultReceiver);
             }
         } finally {
@@ -1070,7 +1070,7 @@
                         // focus in the window manager, to allow this call to
                         // be made before input is started in it.
                         if (!mIWindowManager.inputMethodClientHasFocus(client)) {
-                            Log.w(TAG, "Ignoring hideSoftInput of: " + client);
+                            Slog.w(TAG, "Ignoring hideSoftInput of: " + client);
                             return false;
                         }
                     } catch (RemoteException e) {
@@ -1078,7 +1078,7 @@
                     }
                 }
 
-                if (DEBUG) Log.v(TAG, "Client requesting input be hidden");
+                if (DEBUG) Slog.v(TAG, "Client requesting input be hidden");
                 return hideCurrentInputLocked(flags, resultReceiver);
             }
         } finally {
@@ -1089,12 +1089,12 @@
     boolean hideCurrentInputLocked(int flags, ResultReceiver resultReceiver) {
         if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0
                 && (mShowExplicitlyRequested || mShowForced)) {
-            if (DEBUG) Log.v(TAG,
+            if (DEBUG) Slog.v(TAG,
                     "Not hiding: explicit show not cancelled by non-explicit hide");
             return false;
         }
         if (mShowForced && (flags&InputMethodManager.HIDE_NOT_ALWAYS) != 0) {
-            if (DEBUG) Log.v(TAG,
+            if (DEBUG) Slog.v(TAG,
                     "Not hiding: forced show not cancelled by not-always hide");
             return false;
         }
@@ -1119,7 +1119,7 @@
         long ident = Binder.clearCallingIdentity();
         try {
             synchronized (mMethodMap) {
-                if (DEBUG) Log.v(TAG, "windowGainedFocus: " + client.asBinder()
+                if (DEBUG) Slog.v(TAG, "windowGainedFocus: " + client.asBinder()
                         + " viewHasFocus=" + viewHasFocus
                         + " isTextEditor=" + isTextEditor
                         + " softInputMode=#" + Integer.toHexString(softInputMode)
@@ -1133,7 +1133,7 @@
                         // focus in the window manager, to allow this call to
                         // be made before input is started in it.
                         if (!mIWindowManager.inputMethodClientHasFocus(client)) {
-                            Log.w(TAG, "Client not active, ignoring focus gain of: " + client);
+                            Slog.w(TAG, "Client not active, ignoring focus gain of: " + client);
                             return;
                         }
                     } catch (RemoteException e) {
@@ -1141,7 +1141,7 @@
                 }
 
                 if (mCurFocusedWindow == windowToken) {
-                    Log.w(TAG, "Window already focused, ignoring focus gain of: " + client);
+                    Slog.w(TAG, "Window already focused, ignoring focus gain of: " + client);
                     return;
                 }
                 mCurFocusedWindow = windowToken;
@@ -1155,7 +1155,7 @@
                                 // There is no focus view, and this window will
                                 // be behind any soft input window, so hide the
                                 // soft input window if it is shown.
-                                if (DEBUG) Log.v(TAG, "Unspecified window will hide input");
+                                if (DEBUG) Slog.v(TAG, "Unspecified window will hide input");
                                 hideCurrentInputLocked(InputMethodManager.HIDE_NOT_ALWAYS, null);
                             }
                         } else if (isTextEditor && (softInputMode &
@@ -1165,7 +1165,7 @@
                                         WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
                             // There is a focus view, and we are navigating forward
                             // into the window, so show the input window for the user.
-                            if (DEBUG) Log.v(TAG, "Unspecified window will show input");
+                            if (DEBUG) Slog.v(TAG, "Unspecified window will show input");
                             showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
                         }
                         break;
@@ -1175,23 +1175,23 @@
                     case WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN:
                         if ((softInputMode &
                                 WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
-                            if (DEBUG) Log.v(TAG, "Window asks to hide input going forward");
+                            if (DEBUG) Slog.v(TAG, "Window asks to hide input going forward");
                             hideCurrentInputLocked(0, null);
                         }
                         break;
                     case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN:
-                        if (DEBUG) Log.v(TAG, "Window asks to hide input");
+                        if (DEBUG) Slog.v(TAG, "Window asks to hide input");
                         hideCurrentInputLocked(0, null);
                         break;
                     case WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE:
                         if ((softInputMode &
                                 WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) != 0) {
-                            if (DEBUG) Log.v(TAG, "Window asks to show input going forward");
+                            if (DEBUG) Slog.v(TAG, "Window asks to show input going forward");
                             showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
                         }
                         break;
                     case WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE:
-                        if (DEBUG) Log.v(TAG, "Window asks to always show input");
+                        if (DEBUG) Slog.v(TAG, "Window asks to always show input");
                         showCurrentInputLocked(InputMethodManager.SHOW_IMPLICIT, null);
                         break;
                 }
@@ -1205,7 +1205,7 @@
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
                     || mCurClient.client.asBinder() != client.asBinder()) {
-                Log.w(TAG, "Ignoring showInputMethodDialogFromClient of: " + client);
+                Slog.w(TAG, "Ignoring showInputMethodDialogFromClient of: " + client);
             }
 
             mHandler.sendEmptyMessage(MSG_SHOW_IM_PICKER);
@@ -1223,7 +1223,7 @@
                             + android.Manifest.permission.WRITE_SECURE_SETTINGS);
                 }
             } else if (mCurToken != token) {
-                Log.w(TAG, "Ignoring setInputMethod of token: " + token);
+                Slog.w(TAG, "Ignoring setInputMethod of token: " + token);
                 return;
             }
 
@@ -1239,7 +1239,7 @@
     public void hideMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (token == null || mCurToken != token) {
-                Log.w(TAG, "Ignoring hideInputMethod of token: " + token);
+                Slog.w(TAG, "Ignoring hideInputMethod of token: " + token);
                 return;
             }
             long ident = Binder.clearCallingIdentity();
@@ -1254,7 +1254,7 @@
     public void showMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (token == null || mCurToken != token) {
-                Log.w(TAG, "Ignoring hideInputMethod of token: " + token);
+                Slog.w(TAG, "Ignoring hideInputMethod of token: " + token);
                 return;
             }
             long ident = Binder.clearCallingIdentity();
@@ -1270,7 +1270,7 @@
         if (mEnabledSession != session) {
             if (mEnabledSession != null) {
                 try {
-                    if (DEBUG) Log.v(TAG, "Disabling: " + mEnabledSession);
+                    if (DEBUG) Slog.v(TAG, "Disabling: " + mEnabledSession);
                     mEnabledSession.method.setSessionEnabled(
                             mEnabledSession.session, false);
                 } catch (RemoteException e) {
@@ -1278,7 +1278,7 @@
             }
             mEnabledSession = session;
             try {
-                if (DEBUG) Log.v(TAG, "Enabling: " + mEnabledSession);
+                if (DEBUG) Slog.v(TAG, "Enabling: " + mEnabledSession);
                 session.method.setSessionEnabled(
                         session.session, true);
             } catch (RemoteException e) {
@@ -1328,7 +1328,7 @@
             case MSG_ATTACH_TOKEN:
                 args = (HandlerCaller.SomeArgs)msg.obj;
                 try {
-                    if (DEBUG) Log.v(TAG, "Sending attach of token: " + args.arg2);
+                    if (DEBUG) Slog.v(TAG, "Sending attach of token: " + args.arg2);
                     ((IInputMethod)args.arg1).attachToken((IBinder)args.arg2);
                 } catch (RemoteException e) {
                 }
@@ -1379,7 +1379,7 @@
                     ((IInputMethodClient)args.arg1).onBindMethod(
                             (InputBindResult)args.arg2);
                 } catch (RemoteException e) {
-                    Log.w(TAG, "Client died receiving input method " + args.arg2);
+                    Slog.w(TAG, "Client died receiving input method " + args.arg2);
                 }
                 return true;
         }
@@ -1420,13 +1420,13 @@
             ComponentName compName = new ComponentName(si.packageName, si.name);
             if (!android.Manifest.permission.BIND_INPUT_METHOD.equals(
                     si.permission)) {
-                Log.w(TAG, "Skipping input method " + compName
+                Slog.w(TAG, "Skipping input method " + compName
                         + ": it does not require the permission "
                         + android.Manifest.permission.BIND_INPUT_METHOD);
                 continue;
             }
 
-            if (DEBUG) Log.d(TAG, "Checking " + compName);
+            if (DEBUG) Slog.d(TAG, "Checking " + compName);
 
             try {
                 InputMethodInfo p = new InputMethodInfo(mContext, ri);
@@ -1439,13 +1439,13 @@
                 }
 
                 if (DEBUG) {
-                    Log.d(TAG, "Found a third-party input method " + p);
+                    Slog.d(TAG, "Found a third-party input method " + p);
                 }
 
             } catch (XmlPullParserException e) {
-                Log.w(TAG, "Unable to load input method " + compName, e);
+                Slog.w(TAG, "Unable to load input method " + compName, e);
             } catch (IOException e) {
-                Log.w(TAG, "Unable to load input method " + compName, e);
+                Slog.w(TAG, "Unable to load input method " + compName, e);
             }
         }
 
@@ -1461,7 +1461,7 @@
     // ----------------------------------------------------------------------
 
     void showInputMethodMenu() {
-        if (DEBUG) Log.v(TAG, "Show switching menu");
+        if (DEBUG) Slog.v(TAG, "Show switching menu");
 
         hideInputMethodMenu();
 
@@ -1471,17 +1471,26 @@
 
         String lastInputMethodId = Settings.Secure.getString(context
                 .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
-        if (DEBUG) Log.v(TAG, "Current IME: " + lastInputMethodId);
+        if (DEBUG) Slog.v(TAG, "Current IME: " + lastInputMethodId);
 
         final List<InputMethodInfo> immis = getEnabledInputMethodList();
 
-        int N = (immis == null ? 0 : immis.size());
+        if (immis == null) {
+            return;
+        }
+        
+        int N = immis.size();
 
         mItems = new CharSequence[N];
         mIms = new InputMethodInfo[N];
 
         for (int i = 0; i < N; ++i) {
             InputMethodInfo property = immis.get(i);
+            if (property == null) {
+                i--;
+                N--;
+                continue;
+            }
             mItems[i] = property.loadLabel(pm);
             mIms[i] = property;
         }
@@ -1517,6 +1526,9 @@
         mDialogBuilder.setSingleChoiceItems(mItems, checkedItem,
                 new AlertDialog.OnClickListener() {
                     public void onClick(DialogInterface dialog, int which) {
+                        if (mIms == null) {
+                            return;
+                        }
                         synchronized (mMethodMap) {
                             InputMethodInfo im = mIms[which];
                             hideInputMethodMenu();
@@ -1540,7 +1552,7 @@
     }
 
     void hideInputMethodMenuLocked() {
-        if (DEBUG) Log.v(TAG, "Hide switching menu");
+        if (DEBUG) Slog.v(TAG, "Hide switching menu");
 
         if (mSwitchingDialog != null) {
             mSwitchingDialog.dismiss();
diff --git a/services/java/com/android/server/Installer.java b/services/java/com/android/server/Installer.java
index 11297d5..1f34eba 100644
--- a/services/java/com/android/server/Installer.java
+++ b/services/java/com/android/server/Installer.java
@@ -20,7 +20,7 @@
 import android.net.LocalSocketAddress;
 import android.net.LocalSocket;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,7 +41,7 @@
         if (mSocket != null) {
             return true;
         }
-        Log.i(TAG, "connecting...");
+        Slog.i(TAG, "connecting...");
         try {
             mSocket = new LocalSocket();
 
@@ -60,7 +60,7 @@
     }
 
 	private void disconnect() {
-        Log.i(TAG,"disconnecting...");
+        Slog.i(TAG,"disconnecting...");
 		try {
 			if (mSocket != null) mSocket.close();
 		} catch (IOException ex) { }
@@ -82,16 +82,16 @@
 			try {
 				count = mIn.read(buffer, off, len - off);
 				if (count <= 0) {
-                    Log.e(TAG, "read error " + count);
+                    Slog.e(TAG, "read error " + count);
                     break;
                 }
 				off += count;
 			} catch (IOException ex) {
-                Log.e(TAG,"read exception");
+                Slog.e(TAG,"read exception");
 				break;
 			}
 		}
-//        Log.i(TAG, "read "+len+" bytes");
+//        Slog.i(TAG, "read "+len+" bytes");
 		if (off == len) return true;
 		disconnect();
 		return false;
@@ -103,7 +103,7 @@
 		if (!readBytes(buf, 2)) return false;
 		len = (((int) buf[0]) & 0xff) | ((((int) buf[1]) & 0xff) << 8);
 		if ((len < 1) || (len > 1024)) {
-            Log.e(TAG,"invalid reply length ("+len+")");
+            Slog.e(TAG,"invalid reply length ("+len+")");
 			disconnect();
 			return false;
 		}
@@ -122,7 +122,7 @@
 			mOut.write(buf, 0, 2);
 			mOut.write(cmd, 0, len);
 		} catch (IOException ex) {
-            Log.e(TAG,"write error");
+            Slog.e(TAG,"write error");
 			disconnect();
 			return false;
 		}
@@ -131,7 +131,7 @@
 		
 	private synchronized String transaction(String cmd) {
 		if (!connect()) {
-            Log.e(TAG, "connection failed");
+            Slog.e(TAG, "connection failed");
             return "-1";
         }
 
@@ -141,18 +141,18 @@
                  * write (this one).  Try to reconnect and write
                  * the command one more time before giving up.
                  */
-            Log.e(TAG, "write command failed? reconnect!");
+            Slog.e(TAG, "write command failed? reconnect!");
             if (!connect() || !writeCommand(cmd)) {
                 return "-1";
             }
         }
-//        Log.i(TAG,"send: '"+cmd+"'");
+//        Slog.i(TAG,"send: '"+cmd+"'");
 		if (readReply()) {
             String s = new String(buf, 0, buflen);
-//            Log.i(TAG,"recv: '"+s+"'");
+//            Slog.i(TAG,"recv: '"+s+"'");
 			return s;
 		} else {
-//            Log.i(TAG,"fail");
+//            Slog.i(TAG,"fail");
 			return "-1";
 		}
 	}
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java
index d8c8c90..19b0a76 100644
--- a/services/java/com/android/server/IntentResolver.java
+++ b/services/java/com/android/server/IntentResolver.java
@@ -28,6 +28,7 @@
 import java.util.Set;
 
 import android.util.Log;
+import android.util.Slog;
 import android.util.LogPrinter;
 import android.util.Printer;
 
@@ -46,9 +47,9 @@
 
     public void addFilter(F f) {
         if (localLOGV) {
-            Log.v(TAG, "Adding filter: " + f);
-            f.dump(new LogPrinter(Log.VERBOSE, TAG), "      ");
-            Log.v(TAG, "    Building Lookup Maps:");
+            Slog.v(TAG, "Adding filter: " + f);
+            f.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "      ");
+            Slog.v(TAG, "    Building Lookup Maps:");
         }
 
         mFilters.add(f);
@@ -72,9 +73,9 @@
 
     void removeFilterInternal(F f) {
         if (localLOGV) {
-            Log.v(TAG, "Removing filter: " + f);
-            f.dump(new LogPrinter(Log.VERBOSE, TAG), "      ");
-            Log.v(TAG, "    Cleaning Lookup Maps:");
+            Slog.v(TAG, "Removing filter: " + f);
+            f.dump(new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM), "      ");
+            Slog.v(TAG, "    Cleaning Lookup Maps:");
         }
 
         int numS = unregister_intent_filter(f, f.schemesIterator(),
@@ -188,7 +189,7 @@
         final boolean debug = localLOGV ||
                 ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
 
-        if (debug) Log.v(
+        if (debug) Slog.v(
             TAG, "Resolving type " + resolvedType + " scheme " + scheme
             + " of intent " + intent);
 
@@ -209,26 +210,26 @@
                         // Not a wild card, so we can just look for all filters that
                         // completely match or wildcards whose base type matches.
                         firstTypeCut = mTypeToFilter.get(resolvedType);
-                        if (debug) Log.v(TAG, "First type cut: " + firstTypeCut);
+                        if (debug) Slog.v(TAG, "First type cut: " + firstTypeCut);
                         secondTypeCut = mWildTypeToFilter.get(baseType);
-                        if (debug) Log.v(TAG, "Second type cut: " + secondTypeCut);
+                        if (debug) Slog.v(TAG, "Second type cut: " + secondTypeCut);
                     } else {
                         // We can match anything with our base type.
                         firstTypeCut = mBaseTypeToFilter.get(baseType);
-                        if (debug) Log.v(TAG, "First type cut: " + firstTypeCut);
+                        if (debug) Slog.v(TAG, "First type cut: " + firstTypeCut);
                         secondTypeCut = mWildTypeToFilter.get(baseType);
-                        if (debug) Log.v(TAG, "Second type cut: " + secondTypeCut);
+                        if (debug) Slog.v(TAG, "Second type cut: " + secondTypeCut);
                     }
                     // Any */* types always apply, but we only need to do this
                     // if the intent type was not already */*.
                     thirdTypeCut = mWildTypeToFilter.get("*");
-                    if (debug) Log.v(TAG, "Third type cut: " + thirdTypeCut);
+                    if (debug) Slog.v(TAG, "Third type cut: " + thirdTypeCut);
                 } else if (intent.getAction() != null) {
                     // The intent specified any type ({@literal *}/*).  This
                     // can be a whole heck of a lot of things, so as a first
                     // cut let's use the action instead.
                     firstTypeCut = mTypedActionToFilter.get(intent.getAction());
-                    if (debug) Log.v(TAG, "Typed Action list: " + firstTypeCut);
+                    if (debug) Slog.v(TAG, "Typed Action list: " + firstTypeCut);
                 }
             }
         }
@@ -238,7 +239,7 @@
         // on the authority and path by directly matching each resulting filter).
         if (scheme != null) {
             schemeCut = mSchemeToFilter.get(scheme);
-            if (debug) Log.v(TAG, "Scheme list: " + schemeCut);
+            if (debug) Slog.v(TAG, "Scheme list: " + schemeCut);
         }
 
         // If the intent does not specify any data -- either a MIME type or
@@ -246,7 +247,7 @@
         // data.
         if (resolvedType == null && scheme == null && intent.getAction() != null) {
             firstTypeCut = mActionToFilter.get(intent.getAction());
-            if (debug) Log.v(TAG, "Action list: " + firstTypeCut);
+            if (debug) Slog.v(TAG, "Action list: " + firstTypeCut);
         }
 
         if (firstTypeCut != null) {
@@ -268,9 +269,9 @@
         sortResults(finalList);
 
         if (debug) {
-            Log.v(TAG, "Final result list:");
+            Slog.v(TAG, "Final result list:");
             for (R r : finalList) {
-                Log.v(TAG, "  " + r);
+                Slog.v(TAG, "  " + r);
             }
         }
         return finalList;
@@ -307,7 +308,7 @@
         while (i.hasNext()) {
             String name = (String)i.next();
             num++;
-            if (localLOGV) Log.v(TAG, prefix + name);
+            if (localLOGV) Slog.v(TAG, prefix + name);
             String baseName = name;
             final int slashpos = name.indexOf('/');
             if (slashpos > 0) {
@@ -318,7 +319,7 @@
 
             ArrayList<F> array = mTypeToFilter.get(name);
             if (array == null) {
-                //Log.v(TAG, "Creating new array for " + name);
+                //Slog.v(TAG, "Creating new array for " + name);
                 array = new ArrayList<F>();
                 mTypeToFilter.put(name, array);
             }
@@ -327,7 +328,7 @@
             if (slashpos > 0) {
                 array = mBaseTypeToFilter.get(baseName);
                 if (array == null) {
-                    //Log.v(TAG, "Creating new array for " + name);
+                    //Slog.v(TAG, "Creating new array for " + name);
                     array = new ArrayList<F>();
                     mBaseTypeToFilter.put(baseName, array);
                 }
@@ -335,7 +336,7 @@
             } else {
                 array = mWildTypeToFilter.get(baseName);
                 if (array == null) {
-                    //Log.v(TAG, "Creating new array for " + name);
+                    //Slog.v(TAG, "Creating new array for " + name);
                     array = new ArrayList<F>();
                     mWildTypeToFilter.put(baseName, array);
                 }
@@ -356,7 +357,7 @@
         while (i.hasNext()) {
             String name = (String)i.next();
             num++;
-            if (localLOGV) Log.v(TAG, prefix + name);
+            if (localLOGV) Slog.v(TAG, prefix + name);
             String baseName = name;
             final int slashpos = name.indexOf('/');
             if (slashpos > 0) {
@@ -392,10 +393,10 @@
         while (i.hasNext()) {
             String name = i.next();
             num++;
-            if (localLOGV) Log.v(TAG, prefix + name);
+            if (localLOGV) Slog.v(TAG, prefix + name);
             ArrayList<F> array = dest.get(name);
             if (array == null) {
-                //Log.v(TAG, "Creating new array for " + name);
+                //Slog.v(TAG, "Creating new array for " + name);
                 array = new ArrayList<F>();
                 dest.put(name, array);
             }
@@ -414,7 +415,7 @@
         while (i.hasNext()) {
             String name = i.next();
             num++;
-            if (localLOGV) Log.v(TAG, prefix + name);
+            if (localLOGV) Slog.v(TAG, prefix + name);
             if (!remove_all_objects(dest.get(name), filter)) {
                 dest.remove(name);
             }
@@ -447,12 +448,12 @@
         for (i=0; i<N; i++) {
             F filter = src.get(i);
             int match;
-            if (debug) Log.v(TAG, "Matching against filter " + filter);
+            if (debug) Slog.v(TAG, "Matching against filter " + filter);
 
             // Do we already have this one?
             if (!allowFilterResult(filter, dest)) {
                 if (debug) {
-                    Log.v(TAG, "  Filter's target already added");
+                    Slog.v(TAG, "  Filter's target already added");
                 }
                 continue;
             }
@@ -460,7 +461,7 @@
             match = filter.match(
                     intent.getAction(), resolvedType, scheme, intent.getData(), categories, TAG);
             if (match >= 0) {
-                if (debug) Log.v(TAG, "  Filter matched!  match=0x" +
+                if (debug) Slog.v(TAG, "  Filter matched!  match=0x" +
                         Integer.toHexString(match));
                 if (!defaultOnly || filter.hasCategory(Intent.CATEGORY_DEFAULT)) {
                     final R oneResult = newResult(filter, match);
@@ -480,13 +481,13 @@
                         case IntentFilter.NO_MATCH_TYPE: reason = "type"; break;
                         default: reason = "unknown reason"; break;
                     }
-                    Log.v(TAG, "  Filter did not match: " + reason);
+                    Slog.v(TAG, "  Filter did not match: " + reason);
                 }
             }
         }
 
         if (dest.size() == 0 && hasNonDefaults) {
-            Log.w(TAG, "resolveIntent failed: found match, but none with Intent.CATEGORY_DEFAULT");
+            Slog.w(TAG, "resolveIntent failed: found match, but none with Intent.CATEGORY_DEFAULT");
         }
     }
 
diff --git a/services/java/com/android/server/KeyInputQueue.java b/services/java/com/android/server/KeyInputQueue.java
index 1bb897b..a08258a 100644
--- a/services/java/com/android/server/KeyInputQueue.java
+++ b/services/java/com/android/server/KeyInputQueue.java
@@ -22,7 +22,8 @@
 import android.os.LatencyTimer;
 import android.os.PowerManager;
 import android.os.SystemClock;
-import android.util.Log;
+import android.os.SystemProperties;
+import android.util.Slog;
 import android.util.SparseArray;
 import android.util.Xml;
 import android.view.Display;
@@ -43,6 +44,7 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 
 public abstract class KeyInputQueue {
@@ -177,7 +179,7 @@
                 return;
             }
             
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "computeHitRect for " + scancode
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "computeHitRect for " + scancode
                     + ": dev=" + dev + " absX=" + dev.absX + " absY=" + dev.absY);
             
             lastDevice = dev;
@@ -211,11 +213,11 @@
             String str = br.readLine();
             if (str != null) {
                 String[] it = str.split(":");
-                if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "***** VIRTUAL KEYS: " + it);
+                if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "***** VIRTUAL KEYS: " + it);
                 final int N = it.length-6;
                 for (int i=0; i<=N; i+=6) {
                     if (!"0x01".equals(it[i])) {
-                        Log.w(TAG, "Unknown virtual key type at elem #" + i
+                        Slog.w(TAG, "Unknown virtual key type at elem #" + i
                                 + ": " + it[i]);
                         continue;
                     }
@@ -226,22 +228,22 @@
                         sb.centery = Integer.parseInt(it[i+3]);
                         sb.width = Integer.parseInt(it[i+4]);
                         sb.height = Integer.parseInt(it[i+5]);
-                        if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Virtual key "
+                        if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Virtual key "
                                 + sb.scancode + ": center=" + sb.centerx + ","
                                 + sb.centery + " size=" + sb.width + "x"
                                 + sb.height);
                         mVirtualKeys.add(sb);
                     } catch (NumberFormatException e) {
-                        Log.w(TAG, "Bad number at region " + i + " in: "
+                        Slog.w(TAG, "Bad number at region " + i + " in: "
                                 + str, e);
                     }
                 }
             }
             br.close();
         } catch (FileNotFoundException e) {
-            Log.i(TAG, "No virtual keys found");
+            Slog.i(TAG, "No virtual keys found");
         } catch (IOException e) {
-            Log.w(TAG, "Error reading virtual keys", e);
+            Slog.w(TAG, "Error reading virtual keys", e);
         }
     }
 
@@ -264,14 +266,14 @@
                 }
                 String name = parser.getAttributeValue(null, "name");
                 if (name != null) {
-                    if (DEBUG) Log.v(TAG, "addExcludedDevice " + name);
+                    if (DEBUG) Slog.v(TAG, "addExcludedDevice " + name);
                     addExcludedDevice(name);
                 }
             }
         } catch (FileNotFoundException e) {
             // It's ok if the file does not exist.
         } catch (Exception e) {
-            Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);
+            Slog.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);
         } finally {
             try { if (confreader != null) confreader.close(); } catch (IOException e) { }
         }
@@ -326,21 +328,21 @@
                     if ((d.classes&RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
                         config.touchscreen
                                 = Configuration.TOUCHSCREEN_FINGER;
-                        //Log.i("foo", "***** HAVE TOUCHSCREEN!");
+                        //Slog.i("foo", "***** HAVE TOUCHSCREEN!");
                     }
                     if ((d.classes&RawInputEvent.CLASS_ALPHAKEY) != 0) {
                         config.keyboard
                                 = Configuration.KEYBOARD_QWERTY;
-                        //Log.i("foo", "***** HAVE QWERTY!");
+                        //Slog.i("foo", "***** HAVE QWERTY!");
                     }
                     if ((d.classes&RawInputEvent.CLASS_TRACKBALL) != 0) {
                         config.navigation
                                 = Configuration.NAVIGATION_TRACKBALL;
-                        //Log.i("foo", "***** HAVE TRACKBALL!");
+                        //Slog.i("foo", "***** HAVE TRACKBALL!");
                     } else if ((d.classes&RawInputEvent.CLASS_DPAD) != 0) {
                         config.navigation
                                 = Configuration.NAVIGATION_DPAD;
-                        //Log.i("foo", "***** HAVE DPAD!");
+                        //Slog.i("foo", "***** HAVE DPAD!");
                     }
                 }
             }
@@ -491,7 +493,7 @@
     
     Thread mThread = new Thread("InputDeviceReader") {
         public void run() {
-            if (DEBUG) Log.v(TAG, "InputDeviceReader.run()");
+            if (DEBUG) Slog.v(TAG, "InputDeviceReader.run()");
             android.os.Process.setThreadPriority(
                     android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
             
@@ -507,7 +509,7 @@
                     boolean configChanged = false;
                     
                     if (false) {
-                        Log.i(TAG, "Input event: dev=0x"
+                        Slog.i(TAG, "Input event: dev=0x"
                                 + Integer.toHexString(ev.deviceId)
                                 + " type=0x" + Integer.toHexString(ev.type)
                                 + " scancode=" + ev.scancode
@@ -531,7 +533,7 @@
                             } else {
                                 // We won't do anything with this device.
                                 mIgnoredDevices.put(ev.deviceId, di);
-                                Log.i(TAG, "Ignoring non-input device: id=0x"
+                                Slog.i(TAG, "Ignoring non-input device: id=0x"
                                         + Integer.toHexString(di.id)
                                         + ", name=" + di.name);
                             }
@@ -539,7 +541,7 @@
                     } else if (ev.type == RawInputEvent.EV_DEVICE_REMOVED) {
                         synchronized (mFirst) {
                             if (false) {
-                                Log.i(TAG, "Device removed: id=0x"
+                                Slog.i(TAG, "Device removed: id=0x"
                                         + Integer.toHexString(ev.deviceId));
                             }
                             di = mDevices.get(ev.deviceId);
@@ -551,7 +553,7 @@
                             } else if ((di=mIgnoredDevices.get(ev.deviceId)) != null) {
                                 mIgnoredDevices.remove(ev.deviceId);
                             } else {
-                                Log.w(TAG, "Removing bad device id: "
+                                Slog.w(TAG, "Removing bad device id: "
                                         + Integer.toHexString(ev.deviceId));
                                 continue;
                             }
@@ -591,7 +593,7 @@
                         //curTime = gotOne ? ev.when : SystemClock.uptimeMillis();
                         final long curTime = SystemClock.uptimeMillis();
                         final long curTimeNano = System.nanoTime();
-                        //Log.i(TAG, "curTime=" + curTime + ", systemClock=" + SystemClock.uptimeMillis());
+                        //Slog.i(TAG, "curTime=" + curTime + ", systemClock=" + SystemClock.uptimeMillis());
                         
                         final int classes = di.classes;
                         final int type = ev.type;
@@ -646,14 +648,14 @@
                                 di.mAbs.changed = true;
                                 di.mAbs.mNextData[di.mAbs.mAddingPointerOffset
                                     + MotionEvent.SAMPLE_X] = ev.value;
-                                if (DEBUG_POINTERS) Log.v(TAG, "MT @"
+                                if (DEBUG_POINTERS) Slog.v(TAG, "MT @"
                                         + di.mAbs.mAddingPointerOffset
                                         + " X:" + ev.value);
                             } else if (ev.scancode == RawInputEvent.ABS_MT_POSITION_Y) {
                                 di.mAbs.changed = true;
                                 di.mAbs.mNextData[di.mAbs.mAddingPointerOffset
                                     + MotionEvent.SAMPLE_Y] = ev.value;
-                                if (DEBUG_POINTERS) Log.v(TAG, "MT @"
+                                if (DEBUG_POINTERS) Slog.v(TAG, "MT @"
                                         + di.mAbs.mAddingPointerOffset
                                         + " Y:" + ev.value);
                             } else if (ev.scancode == RawInputEvent.ABS_MT_WIDTH_MAJOR) {
@@ -711,7 +713,7 @@
                                                       + MotionEvent.SAMPLE_PRESSURE] != 0) {
                                     final int num = di.mAbs.mNextNumPointers+1;
                                     di.mAbs.mNextNumPointers = num;
-                                    if (DEBUG_POINTERS) Log.v(TAG,
+                                    if (DEBUG_POINTERS) Slog.v(TAG,
                                             "MT_REPORT: now have " + num + " pointers");
                                     final int newOffset = (num <= InputDevice.MAX_POINTERS)
                                             ? (num * MotionEvent.NUM_SAMPLE_DATA)
@@ -721,7 +723,7 @@
                                     di.mAbs.mNextData[newOffset
                                             + MotionEvent.SAMPLE_PRESSURE] = 0;
                                 } else {
-                                    if (DEBUG_POINTERS) Log.v(TAG, "MT_REPORT: no pointer");
+                                    if (DEBUG_POINTERS) Slog.v(TAG, "MT_REPORT: no pointer");
                                 }
                             }
                         
@@ -738,6 +740,7 @@
                                 
                                 InputDevice.MotionState ms = di.mAbs;
                                 if (ms.changed) {
+                                    ms.everChanged = true;
                                     ms.changed = false;
                                     
                                     if ((classes&(RawInputEvent.CLASS_TOUCHSCREEN
@@ -775,14 +778,14 @@
                                             me = ms.generateAbsMotion(di, curTime,
                                                     curTimeNano, mDisplay,
                                                     mOrientation, mGlobalMetaState);
-                                            if (DEBUG_POINTERS) Log.v(TAG, "Absolute: x="
+                                            if (DEBUG_POINTERS) Slog.v(TAG, "Absolute: x="
                                                     + di.mAbs.mNextData[MotionEvent.SAMPLE_X]
                                                     + " y="
                                                     + di.mAbs.mNextData[MotionEvent.SAMPLE_Y]
                                                     + " ev=" + me);
                                             if (me != null) {
                                                 if (WindowManagerPolicy.WATCH_POINTER) {
-                                                    Log.i(TAG, "Enqueueing: " + me);
+                                                    Slog.i(TAG, "Enqueueing: " + me);
                                                 }
                                                 addLocked(di, curTimeNano, ev.flags,
                                                         RawInputEvent.CLASS_TOUCHSCREEN, me);
@@ -809,12 +812,13 @@
                                 
                                 ms = di.mRel;
                                 if (ms.changed) {
+                                    ms.everChanged = true;
                                     ms.changed = false;
                                     
                                     me = ms.generateRelMotion(di, curTime,
                                             curTimeNano,
                                             mOrientation, mGlobalMetaState);
-                                    if (false) Log.v(TAG, "Relative: x="
+                                    if (false) Slog.v(TAG, "Relative: x="
                                             + di.mRel.mNextData[MotionEvent.SAMPLE_X]
                                             + " y="
                                             + di.mRel.mNextData[MotionEvent.SAMPLE_Y]
@@ -831,7 +835,7 @@
                     }
                 
                 } catch (RuntimeException exc) {
-                    Log.e(TAG, "InputReaderThread uncaught exception", exc);
+                    Slog.e(TAG, "InputReaderThread uncaught exception", exc);
                 }
             }
         }
@@ -849,7 +853,7 @@
                 && absm.mNextData[MotionEvent.SAMPLE_X] <= absx.maxValue
                 && absm.mNextData[MotionEvent.SAMPLE_Y] >= absy.minValue
                 && absm.mNextData[MotionEvent.SAMPLE_Y] <= absy.maxValue) {
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Input ("
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Input ("
                     + absm.mNextData[MotionEvent.SAMPLE_X]
                     + "," + absm.mNextData[MotionEvent.SAMPLE_Y]
                     + ") inside of display");
@@ -869,7 +873,7 @@
         for (int i=0; i<N; i++) {
             VirtualKey sb = mVirtualKeys.get(i);
             sb.computeHitRect(dev, mDisplayWidth, mDisplayHeight);
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Hit test ("
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Hit test ("
                     + absm.mNextData[MotionEvent.SAMPLE_X] + ","
                     + absm.mNextData[MotionEvent.SAMPLE_Y] + ") in code "
                     + sb.scancode + " - (" + sb.hitLeft
@@ -877,7 +881,7 @@
                     + sb.hitBottom + ")");
             if (sb.checkHit(absm.mNextData[MotionEvent.SAMPLE_X],
                     absm.mNextData[MotionEvent.SAMPLE_Y])) {
-                if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Hit!");
+                if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Hit!");
                 return sb;
             }
         }
@@ -900,7 +904,7 @@
             vk.lastKeycode = scancodeToKeycode(di.id, vk.scancode);
             ms.mLastNumPointers = ms.mNextNumPointers;
             di.mKeyDownTime = curTime;
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG,
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG,
                     "Generate key down for: " + vk.scancode
                     + " (keycode=" + vk.lastKeycode + ")");
             KeyEvent event = newKeyEvent(di, di.mKeyDownTime, curTime, true,
@@ -926,7 +930,7 @@
             final InputDevice.AbsoluteInfo absx = di.absX;
             final InputDevice.AbsoluteInfo absy = di.absY;
             final InputDevice.MotionState absm = di.mAbs;
-            Log.v(TAG, "Rejecting ("
+            Slog.v(TAG, "Rejecting ("
                 + absm.mNextData[MotionEvent.SAMPLE_X] + ","
                 + absm.mNextData[MotionEvent.SAMPLE_Y] + "): outside of ("
                 + absx.minValue + "," + absy.minValue
@@ -947,7 +951,7 @@
         if (ms.mNextNumPointers <= 0) {
             mPressedVirtualKey = null;
             ms.mLastNumPointers = 0;
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Generate key up for: " + vk.scancode);
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Generate key up for: " + vk.scancode);
             KeyEvent event = newKeyEvent(di, di.mKeyDownTime, curTime, false,
                     vk.lastKeycode, 0, vk.scancode,
                     KeyEvent.FLAG_VIRTUAL_HARD_KEY);
@@ -962,7 +966,7 @@
             // virtual key and start a pointer
             // motion.
             mPressedVirtualKey = null;
-            if (DEBUG_VIRTUAL_KEYS) Log.v(TAG, "Cancel key up for: " + vk.scancode);
+            if (DEBUG_VIRTUAL_KEYS) Slog.v(TAG, "Cancel key up for: " + vk.scancode);
             KeyEvent event = newKeyEvent(di, di.mKeyDownTime, curTime, false,
                     vk.lastKeycode, 0, vk.scancode,
                     KeyEvent.FLAG_CANCELED | KeyEvent.FLAG_VIRTUAL_HARD_KEY);
@@ -1138,12 +1142,12 @@
     
     void recycleEvent(QueuedEvent ev) {
         synchronized (mFirst) {
-            //Log.i(TAG, "Recycle event: " + ev);
+            //Slog.i(TAG, "Recycle event: " + ev);
             if (ev.event == ev.inputDevice.mAbs.currentMove) {
                 ev.inputDevice.mAbs.currentMove = null;
             }
             if (ev.event == ev.inputDevice.mRel.currentMove) {
-                if (false) Log.i(TAG, "Detach rel " + ev.event);
+                if (false) Slog.i(TAG, "Detach rel " + ev.event);
                 ev.inputDevice.mRel.currentMove = null;
                 ev.inputDevice.mRel.mNextData[MotionEvent.SAMPLE_X] = 0;
                 ev.inputDevice.mRel.mNextData[MotionEvent.SAMPLE_Y] = 0;
@@ -1237,7 +1241,7 @@
         InputDevice.AbsoluteInfo absPressure = null;
         InputDevice.AbsoluteInfo absSize = null;
         if (classes != 0) {
-            Log.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
+            Slog.i(TAG, "Device added: id=0x" + Integer.toHexString(deviceId)
                     + ", name=" + name
                     + ", classes=" + Integer.toHexString(classes));
             if ((classes&RawInputEvent.CLASS_TOUCHSCREEN_MT) != 0) {
@@ -1269,15 +1273,102 @@
         InputDevice.AbsoluteInfo info = new InputDevice.AbsoluteInfo();
         if (getAbsoluteInfo(id, channel, info)
                 && info.minValue != info.maxValue) {
-            Log.i(TAG, "  " + name + ": min=" + info.minValue
+            Slog.i(TAG, "  " + name + ": min=" + info.minValue
                     + " max=" + info.maxValue
                     + " flat=" + info.flat
                     + " fuzz=" + info.fuzz);
             info.range = info.maxValue-info.minValue;
             return info;
         }
-        Log.i(TAG, "  " + name + ": unknown values");
+        Slog.i(TAG, "  " + name + ": unknown values");
         return null;
     }
     private static native boolean readEvent(RawInputEvent outEvent);
+    
+    void dump(PrintWriter pw, String prefix) {
+        synchronized (mFirst) {
+            for (int i=0; i<mDevices.size(); i++) {
+                InputDevice dev = mDevices.valueAt(i);
+                pw.print(prefix); pw.print("Device #");
+                        pw.print(mDevices.keyAt(i)); pw.print(" ");
+                        pw.print(dev.name); pw.print(" (classes=0x");
+                        pw.print(Integer.toHexString(dev.classes));
+                        pw.println("):");
+                pw.print(prefix); pw.print("  mKeyDownTime=");
+                        pw.print(dev.mKeyDownTime); pw.print(" mMetaKeysState=");
+                        pw.println(dev.mMetaKeysState);
+                if (dev.absX != null) {
+                    pw.print(prefix); pw.print("  absX: "); dev.absX.dump(pw);
+                            pw.println("");
+                }
+                if (dev.absY != null) {
+                    pw.print(prefix); pw.print("  absY: "); dev.absY.dump(pw);
+                            pw.println("");
+                }
+                if (dev.absPressure != null) {
+                    pw.print(prefix); pw.print("  absPressure: ");
+                            dev.absPressure.dump(pw); pw.println("");
+                }
+                if (dev.absSize != null) {
+                    pw.print(prefix); pw.print("  absSize: ");
+                            dev.absSize.dump(pw); pw.println("");
+                }
+                if (dev.mAbs.everChanged) {
+                    pw.print(prefix); pw.println("  mAbs:");
+                    dev.mAbs.dump(pw, prefix + "    ");
+                }
+                if (dev.mRel.everChanged) {
+                    pw.print(prefix); pw.println("  mRel:");
+                    dev.mRel.dump(pw, prefix + "    ");
+                }
+            }
+            pw.println(" ");
+            for (int i=0; i<mIgnoredDevices.size(); i++) {
+                InputDevice dev = mIgnoredDevices.valueAt(i);
+                pw.print(prefix); pw.print("Ignored Device #");
+                        pw.print(mIgnoredDevices.keyAt(i)); pw.print(" ");
+                        pw.print(dev.name); pw.print(" (classes=0x");
+                        pw.print(Integer.toHexString(dev.classes));
+                        pw.println(")");
+            }
+            pw.println(" ");
+            for (int i=0; i<mVirtualKeys.size(); i++) {
+                VirtualKey vk = mVirtualKeys.get(i);
+                pw.print(prefix); pw.print("Virtual Key #");
+                        pw.print(i); pw.println(":");
+                pw.print(prefix); pw.print("  scancode="); pw.println(vk.scancode);
+                pw.print(prefix); pw.print("  centerx="); pw.print(vk.centerx);
+                        pw.print(" centery="); pw.print(vk.centery);
+                        pw.print(" width="); pw.print(vk.width);
+                        pw.print(" height="); pw.println(vk.height);
+                pw.print(prefix); pw.print("  hitLeft="); pw.print(vk.hitLeft);
+                        pw.print(" hitTop="); pw.print(vk.hitTop);
+                        pw.print(" hitRight="); pw.print(vk.hitRight);
+                        pw.print(" hitBottom="); pw.println(vk.hitBottom);
+                if (vk.lastDevice != null) {
+                    pw.print(prefix); pw.print("  lastDevice=#");
+                            pw.println(vk.lastDevice.id);
+                }
+                if (vk.lastKeycode != 0) {
+                    pw.print(prefix); pw.print("  lastKeycode=");
+                            pw.println(vk.lastKeycode);
+                }
+            }
+            pw.println(" ");
+            pw.print(prefix); pw.print("  Default keyboard: ");
+                    pw.println(SystemProperties.get("hw.keyboards.0.devname"));
+            pw.print(prefix); pw.print("  mGlobalMetaState=");
+                    pw.print(mGlobalMetaState); pw.print(" mHaveGlobalMetaState=");
+                    pw.println(mHaveGlobalMetaState);
+            pw.print(prefix); pw.print("  mDisplayWidth=");
+                    pw.print(mDisplayWidth); pw.print(" mDisplayHeight=");
+                    pw.println(mDisplayHeight);
+            pw.print(prefix); pw.print("  mOrientation=");
+                    pw.println(mOrientation);
+            if (mPressedVirtualKey != null) {
+                pw.print(prefix); pw.print("  mPressedVirtualKey.scancode=");
+                        pw.println(mPressedVirtualKey.scancode);
+            }
+        }
+    }
 }
diff --git a/services/java/com/android/server/LightsService.java b/services/java/com/android/server/LightsService.java
index 9cc74e8..c056eef 100644
--- a/services/java/com/android/server/LightsService.java
+++ b/services/java/com/android/server/LightsService.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Log;
+import android.util.Slog;
 
 public class LightsService {
     private static final String TAG = "LightsService";
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index c0dcdf9..eaf4802 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -65,6 +65,7 @@
 import android.os.RemoteException;
 import android.provider.Settings;
 import android.util.Log;
+import android.util.Slog;
 import android.util.PrintWriterPrinter;
 
 import com.android.internal.location.GeocoderProxy;
@@ -353,7 +354,7 @@
 
         public void binderDied() {
             if (LOCAL_LOGV) {
-                Log.v(TAG, "Location listener died");
+                Slog.v(TAG, "Location listener died");
             }
             synchronized (mLock) {
                 removeUpdatesLocked(this);
@@ -439,7 +440,7 @@
         try {
             _loadProvidersLocked();
         } catch (Exception e) {
-            Log.e(TAG, "Exception loading providers:", e);
+            Slog.e(TAG, "Exception loading providers:", e);
         }
     }
 
@@ -486,7 +487,7 @@
         mContext = context;
 
         if (LOCAL_LOGV) {
-            Log.v(TAG, "Constructed LocationManager Service");
+            Slog.v(TAG, "Constructed LocationManager Service");
         }
     }
 
@@ -591,14 +592,14 @@
         } catch (SecurityException se) {
             throw se;
         } catch (Exception e) {
-            Log.e(TAG, "getAllProviders got exception:", e);
+            Slog.e(TAG, "getAllProviders got exception:", e);
             return null;
         }
     }
 
     private List<String> _getAllProvidersLocked() {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "getAllProviders");
+            Slog.v(TAG, "getAllProviders");
         }
         ArrayList<String> out = new ArrayList<String>(mProviders.size());
         for (int i = mProviders.size() - 1; i >= 0; i--) {
@@ -616,14 +617,14 @@
         } catch (SecurityException se) {
             throw se;
         } catch (Exception e) {
-            Log.e(TAG, "getProviders got exception:", e);
+            Slog.e(TAG, "getProviders got exception:", e);
             return null;
         }
     }
 
     private List<String> _getProvidersLocked(boolean enabledOnly) {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "getProviders");
+            Slog.v(TAG, "getProviders");
         }
         ArrayList<String> out = new ArrayList<String>(mProviders.size());
         for (int i = mProviders.size() - 1; i >= 0; i--) {
@@ -781,7 +782,7 @@
                     receiver.getListener().asBinder().linkToDeath(receiver, 0);
                 }
             } catch (RemoteException e) {
-                Log.e(TAG, "linkToDeath failed:", e);
+                Slog.e(TAG, "linkToDeath failed:", e);
                 return null;
             }
         }
@@ -824,8 +825,10 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "requestUpdates got exception:", e);
+            Slog.e(TAG, "requestUpdates got exception:", e);
         }
     }
 
@@ -837,15 +840,17 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "requestUpdates got exception:", e);
+            Slog.e(TAG, "requestUpdates got exception:", e);
         }
     }
 
     private void requestLocationUpdatesLocked(String provider,
             long minTime, float minDistance, Receiver receiver) {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "_requestLocationUpdates: listener = " + receiver);
+            Slog.v(TAG, "_requestLocationUpdates: listener = " + receiver);
         }
 
         LocationProviderInterface p = mProvidersByName.get(provider);
@@ -891,8 +896,10 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "removeUpdates got exception:", e);
+            Slog.e(TAG, "removeUpdates got exception:", e);
         }
     }
 
@@ -903,14 +910,16 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "removeUpdates got exception:", e);
+            Slog.e(TAG, "removeUpdates got exception:", e);
         }
     }
 
     private void removeUpdatesLocked(Receiver receiver) {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "_removeUpdates: listener = " + receiver);
+            Slog.v(TAG, "_removeUpdates: listener = " + receiver);
         }
 
         // so wakelock calls will succeed
@@ -986,7 +995,7 @@
         try {
             mGpsStatusProvider.addGpsStatusListener(listener);
         } catch (RemoteException e) {
-            Log.e(TAG, "mGpsStatusProvider.addGpsStatusListener failed", e);
+            Slog.e(TAG, "mGpsStatusProvider.addGpsStatusListener failed", e);
             return false;
         }
         return true;
@@ -997,7 +1006,7 @@
             try {
                 mGpsStatusProvider.removeGpsStatusListener(listener);
             } catch (Exception e) {
-                Log.e(TAG, "mGpsStatusProvider.removeGpsStatusListener failed", e);
+                Slog.e(TAG, "mGpsStatusProvider.removeGpsStatusListener failed", e);
             }
         }
     }
@@ -1037,7 +1046,7 @@
         }
         catch (RemoteException e)
         {
-            Log.e(TAG, "RemoteException in LocationManagerService.sendNiResponse");
+            Slog.e(TAG, "RemoteException in LocationManagerService.sendNiResponse");
             return false;
         }
     }
@@ -1132,7 +1141,7 @@
                         alert.isInProximity(latitude, longitude, accuracy);
                     if (!entered && inProximity) {
                         if (LOCAL_LOGV) {
-                            Log.v(TAG, "Entered alert");
+                            Slog.v(TAG, "Entered alert");
                         }
                         mProximitiesEntered.add(alert);
                         Intent enteredIntent = new Intent();
@@ -1148,7 +1157,7 @@
                             }
                         } catch (PendingIntent.CanceledException e) {
                             if (LOCAL_LOGV) {
-                                Log.v(TAG, "Canceled proximity alert: " + alert, e);
+                                Slog.v(TAG, "Canceled proximity alert: " + alert, e);
                             }
                             if (intentsToRemove == null) {
                                 intentsToRemove = new ArrayList<PendingIntent>();
@@ -1157,7 +1166,7 @@
                         }
                     } else if (entered && !inProximity) {
                         if (LOCAL_LOGV) {
-                            Log.v(TAG, "Exited alert");
+                            Slog.v(TAG, "Exited alert");
                         }
                         mProximitiesEntered.remove(alert);
                         Intent exitedIntent = new Intent();
@@ -1173,7 +1182,7 @@
                             }
                         } catch (PendingIntent.CanceledException e) {
                             if (LOCAL_LOGV) {
-                                Log.v(TAG, "Canceled proximity alert: " + alert, e);
+                                Slog.v(TAG, "Canceled proximity alert: " + alert, e);
                             }
                             if (intentsToRemove == null) {
                                 intentsToRemove = new ArrayList<PendingIntent>();
@@ -1184,7 +1193,7 @@
                 } else {
                     // Mark alert for expiration
                     if (LOCAL_LOGV) {
-                        Log.v(TAG, "Expiring proximity alert: " + alert);
+                        Slog.v(TAG, "Expiring proximity alert: " + alert);
                     }
                     if (intentsToRemove == null) {
                         intentsToRemove = new ArrayList<PendingIntent>();
@@ -1240,15 +1249,17 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "addProximityAlert got exception:", e);
+            Slog.e(TAG, "addProximityAlert got exception:", e);
         }
     }
 
     private void addProximityAlertLocked(double latitude, double longitude,
         float radius, long expiration, PendingIntent intent) {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "addProximityAlert: latitude = " + latitude +
+            Slog.v(TAG, "addProximityAlert: latitude = " + latitude +
                     ", longitude = " + longitude +
                     ", expiration = " + expiration +
                     ", intent = " + intent);
@@ -1285,14 +1296,16 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "removeProximityAlert got exception:", e);
+            Slog.e(TAG, "removeProximityAlert got exception:", e);
         }
     }
 
     private void removeProximityAlertLocked(PendingIntent intent) {
         if (LOCAL_LOGV) {
-            Log.v(TAG, "removeProximityAlert: intent = " + intent);
+            Slog.v(TAG, "removeProximityAlert: intent = " + intent);
         }
 
         mProximityAlerts.remove(intent);
@@ -1315,8 +1328,10 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "_getProviderInfo got exception:", e);
+            Slog.e(TAG, "_getProviderInfo got exception:", e);
             return null;
         }
     }
@@ -1350,8 +1365,10 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "isProviderEnabled got exception:", e);
+            Slog.e(TAG, "isProviderEnabled got exception:", e);
             return false;
         }
     }
@@ -1385,8 +1402,10 @@
             }
         } catch (SecurityException se) {
             throw se;
+        } catch (IllegalArgumentException iae) {
+            throw iae;
         } catch (Exception e) {
-            Log.e(TAG, "getLastKnownLocation got exception:", e);
+            Slog.e(TAG, "getLastKnownLocation got exception:", e);
             return null;
         }
     }
@@ -1473,7 +1492,7 @@
                     lastLoc.set(location);
                 }
                 if (!receiver.callLocationChangedLocked(location)) {
-                    Log.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
+                    Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
                     if (deadReceivers == null) {
                         deadReceivers = new ArrayList<Receiver>();
                     }
@@ -1487,7 +1506,7 @@
 
                 r.mLastStatusBroadcast = newStatusUpdateTime;
                 if (!receiver.callStatusChangedLocked(provider, status, extras)) {
-                    Log.w(TAG, "RemoteException calling onStatusChanged on " + receiver);
+                    Slog.w(TAG, "RemoteException calling onStatusChanged on " + receiver);
                     if (deadReceivers == null) {
                         deadReceivers = new ArrayList<Receiver>();
                     }
@@ -1535,7 +1554,7 @@
                 }
             } catch (Exception e) {
                 // Log, don't crash!
-                Log.e(TAG, "Exception in LocationWorkerHandler.handleMessage:", e);
+                Slog.e(TAG, "Exception in LocationWorkerHandler.handleMessage:", e);
             }
         }
     }
@@ -1642,7 +1661,7 @@
                 } catch (Exception e) {
                     // This is to catch a runtime exception thrown when we try to release an
                     // already released lock.
-                    Log.e(TAG, "exception in acquireWakeLock()", e);
+                    Slog.e(TAG, "exception in acquireWakeLock()", e);
                 }
             }
         }
@@ -1662,7 +1681,7 @@
                 } catch (Exception e) {
                     // This is to catch a runtime exception thrown when we try to release an
                     // already released lock.
-                    Log.e(TAG, "exception in releaseWakeLock()", e);
+                    Slog.e(TAG, "exception in releaseWakeLock()", e);
                 }
             }
         }
@@ -1853,7 +1872,7 @@
 
     private void log(String log) {
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
-            Log.d(TAG, log);
+            Slog.d(TAG, log);
         }
     }
     
diff --git a/services/java/com/android/server/MasterClearReceiver.java b/services/java/com/android/server/MasterClearReceiver.java
index 0417e71..4d04cee 100644
--- a/services/java/com/android/server/MasterClearReceiver.java
+++ b/services/java/com/android/server/MasterClearReceiver.java
@@ -21,6 +21,7 @@
 import android.content.Intent;
 import android.os.RecoverySystem;
 import android.util.Log;
+import android.util.Slog;
 
 import java.io.IOException;
 
@@ -31,13 +32,13 @@
     public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(Intent.ACTION_REMOTE_INTENT)) {
             if (!"google.com".equals(intent.getStringExtra("from"))) {
-                Log.w(TAG, "Ignoring master clear request -- not from trusted server.");
+                Slog.w(TAG, "Ignoring master clear request -- not from trusted server.");
                 return;
             }
         }
 
         try {
-            Log.w(TAG, "!!! FACTORY RESET !!!");
+            Slog.w(TAG, "!!! FACTORY RESET !!!");
             if (intent.hasExtra("enableEFS")) {
                 RecoverySystem.rebootToggleEFS(context, intent.getBooleanExtra("enableEFS", false));
             } else {
@@ -45,7 +46,7 @@
             }
             Log.wtf(TAG, "Still running after master clear?!");
         } catch (IOException e) {
-            Log.e(TAG, "Can't perform master clear/factory reset", e);
+            Slog.e(TAG, "Can't perform master clear/factory reset", e);
         }
     }
 }
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index 4485c79..41f3850 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -111,15 +111,18 @@
     private String                                mLegacyState = Environment.MEDIA_REMOVED;
     private PackageManagerService                 mPms;
     private boolean                               mUmsEnabling;
-    private ArrayList<MountServiceBinderListener> mListeners;
+    // Used as a lock for methods that register/unregister listeners.
+    final private ArrayList<MountServiceBinderListener> mListeners =
+            new ArrayList<MountServiceBinderListener>();
     private boolean                               mBooted = false;
     private boolean                               mReady = false;
     private boolean                               mSendUmsConnectedOnBoot = false;
 
     /**
      * Private hash of currently mounted secure containers.
+     * Used as a lock in methods to manipulate secure containers.
      */
-    private HashSet<String> mAsecMountSet = new HashSet<String>();
+    final private HashSet<String> mAsecMountSet = new HashSet<String>();
 
     private static final int H_UNMOUNT_PM_UPDATE = 1;
     private static final int H_UNMOUNT_PM_DONE = 2;
@@ -148,6 +151,25 @@
             this.path = path;
             this.force = force;
         }
+
+        void handleFinished() {
+            doUnmountVolume(path, true);
+        }
+    }
+
+    class UmsEnableCallBack extends UnmountCallBack {
+        String method;
+
+        UmsEnableCallBack(String path, String method, boolean force) {
+            super(path, force);
+            this.method = method;
+        }
+
+        @Override
+        void handleFinished() {
+            super.handleFinished();
+            doShareUnshareVolume(path, method, true);
+        }
     }
 
     final private Handler mHandler = new Handler() {
@@ -217,8 +239,7 @@
                 }
                 case H_UNMOUNT_MS : {
                     UnmountCallBack ucb = (UnmountCallBack) msg.obj;
-                    String path = ucb.path;
-                    doUnmountVolume(path, true);
+                    ucb.handleFinished();
                     break;
                 }
             }
@@ -298,52 +319,18 @@
         }
     }
 
-    private int doShareUnshareVolume(String path, String method, boolean enable) {
-        validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
-
+    private void doShareUnshareVolume(String path, String method, boolean enable) {
         // TODO: Add support for multiple share methods
         if (!method.equals("ums")) {
             throw new IllegalArgumentException(String.format("Method %s not supported", method));
         }
 
-        /*
-         * If the volume is mounted and we're enabling then unmount it
-         */
-        String vs = getVolumeState(path);
-        if (enable && vs.equals(Environment.MEDIA_MOUNTED)) {
-            mUmsEnabling = enable; // Override for isUsbMassStorageEnabled()
-            int rc = doUnmountVolume(path, true);
-            mUmsEnabling = false; // Clear override
-            if (rc != StorageResultCode.OperationSucceeded) {
-                Log.e(TAG, String.format("Failed to unmount before enabling UMS (%d)", rc));
-                return rc;
-            }
-        }
-
         try {
             mConnector.doCommand(String.format(
                     "volume %sshare %s %s", (enable ? "" : "un"), path, method));
         } catch (NativeDaemonConnectorException e) {
             Log.e(TAG, "Failed to share/unshare", e);
-            return StorageResultCode.OperationFailedInternalError;
         }
-
-        /*
-         * If we disabled UMS then mount the volume
-         */
-        if (!enable) {
-            if (doMountVolume(path) != StorageResultCode.OperationSucceeded) {
-                Log.e(TAG, String.format(
-                        "Failed to remount %s after disabling share method %s", path, method));
-                /*
-                 * Even though the mount failed, the unshare didn't so don't indicate an error.
-                 * The mountVolume() call will have set the storage state and sent the necessary
-                 * broadcasts.
-                 */
-            }
-        }
-
-        return StorageResultCode.OperationSucceeded;
     }
 
     private void updatePublicVolumeState(String path, String state) {
@@ -547,7 +534,7 @@
             if (!vs.equals(
                     Environment.MEDIA_BAD_REMOVAL) && !vs.equals(
                             Environment.MEDIA_NOFS) && !vs.equals(
-                                    Environment.MEDIA_UNMOUNTABLE) && !mUmsEnabling) {
+                                    Environment.MEDIA_UNMOUNTABLE) && !getUmsEnabling()) {
                 updatePublicVolumeState(path, Environment.MEDIA_UNMOUNTED);
                 in = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, Uri.parse("file://" + path));
             }
@@ -791,8 +778,6 @@
         mContext.registerReceiver(mBroadcastReceiver,
                 new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null);
 
-        mListeners = new ArrayList<MountServiceBinderListener>();
-
         /*
          * Vold does not run in the simulator, so pretend the connector thread
          * ran and did its thing.
@@ -852,9 +837,7 @@
              * the UMS host could have dirty FAT cache entries
              * yet to flush.
              */
-            if (setUsbMassStorageEnabled(false) != StorageResultCode.OperationSucceeded) {
-                Log.e(TAG, "UMS disable on shutdown failed");
-            }
+            setUsbMassStorageEnabled(false);
         } else if (state.equals(Environment.MEDIA_CHECKING)) {
             /*
              * If the media is being checked, then we need to wait for
@@ -886,19 +869,62 @@
         }
     }
 
+    private boolean getUmsEnabling() {
+        synchronized (mListeners) {
+            return mUmsEnabling;
+        }
+    }
+
+    private void setUmsEnabling(boolean enable) {
+        synchronized (mListeners) {
+            mUmsEnabling = true;
+        }
+    }
+
     public boolean isUsbMassStorageConnected() {
         waitForReady();
 
-        if (mUmsEnabling) {
+        if (getUmsEnabling()) {
             return true;
         }
         return doGetShareMethodAvailable("ums");
     }
 
-    public int setUsbMassStorageEnabled(boolean enable) {
+    public void setUsbMassStorageEnabled(boolean enable) {
         waitForReady();
+        validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
 
-        return doShareUnshareVolume(Environment.getExternalStorageDirectory().getPath(), "ums", enable);
+        // TODO: Add support for multiple share methods
+
+        /*
+         * If the volume is mounted and we're enabling then unmount it
+         */
+        String path = Environment.getExternalStorageDirectory().getPath();
+        String vs = getVolumeState(path);
+        String method = "ums";
+        if (enable && vs.equals(Environment.MEDIA_MOUNTED)) {
+            // Override for isUsbMassStorageEnabled()
+            setUmsEnabling(enable);
+            UmsEnableCallBack umscb = new UmsEnableCallBack(path, method, true);
+            mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_PM_UPDATE, umscb));
+            // Clear override
+            setUmsEnabling(false);
+        }
+        /*
+         * If we disabled UMS then mount the volume
+         */
+        if (!enable) {
+            doShareUnshareVolume(path, method, enable);
+            if (doMountVolume(path) != StorageResultCode.OperationSucceeded) {
+                Log.e(TAG, "Failed to remount " + path +
+                        " after disabling share method " + method);
+                /*
+                 * Even though the mount failed, the unshare didn't so don't indicate an error.
+                 * The mountVolume() call will have set the storage state and sent the necessary
+                 * broadcasts.
+                 */
+            }
+        }
     }
 
     public boolean isUsbMassStorageEnabled() {
diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java
index ceae973..39c847a 100644
--- a/services/java/com/android/server/NativeDaemonConnector.java
+++ b/services/java/com/android/server/NativeDaemonConnector.java
@@ -21,7 +21,7 @@
 import android.os.Environment;
 import android.os.SystemClock;
 import android.os.SystemProperties;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -80,7 +80,7 @@
             try {
                 listenToSocket();
             } catch (Exception e) {
-                Log.e(TAG, "Error in NativeDaemonConnector", e);
+                Slog.e(TAG, "Error in NativeDaemonConnector", e);
                 SystemClock.sleep(5000);
             }
         }
@@ -110,7 +110,7 @@
                 for (int i = 0; i < count; i++) {
                     if (buffer[i] == 0) {
                         String event = new String(buffer, start, i - start);
-                        if (LOCAL_LOGD) Log.d(TAG, String.format("RCV <- {%s}", event));
+                        if (LOCAL_LOGD) Slog.d(TAG, String.format("RCV <- {%s}", event));
 
                         String[] tokens = event.split(" ");
                         try {
@@ -119,29 +119,29 @@
                             if (code >= ResponseCode.UnsolicitedInformational) {
                                 try {
                                     if (!mCallbacks.onEvent(code, event, tokens)) {
-                                        Log.w(TAG, String.format(
+                                        Slog.w(TAG, String.format(
                                                 "Unhandled event (%s)", event));
                                     }
                                 } catch (Exception ex) {
-                                    Log.e(TAG, String.format(
+                                    Slog.e(TAG, String.format(
                                             "Error handling '%s'", event), ex);
                                 }
                             } else {
                                 try {
                                     mResponseQueue.put(event);
                                 } catch (InterruptedException ex) {
-                                    Log.e(TAG, "Failed to put response onto queue", ex);
+                                    Slog.e(TAG, "Failed to put response onto queue", ex);
                                 }
                             }
                         } catch (NumberFormatException nfe) {
-                            Log.w(TAG, String.format("Bad msg (%s)", event));
+                            Slog.w(TAG, String.format("Bad msg (%s)", event));
                         }
                         start = i + 1;
                     }
                 }
             }
         } catch (IOException ex) {
-            Log.e(TAG, "Communications error", ex);
+            Slog.e(TAG, "Communications error", ex);
             throw ex;
         } finally {
             synchronized (this) {
@@ -149,7 +149,7 @@
                     try {
                         mOutputStream.close();
                     } catch (IOException e) {
-                        Log.w(TAG, "Failed closing output stream", e);
+                        Slog.w(TAG, "Failed closing output stream", e);
                     }
                     mOutputStream = null;
                 }
@@ -160,7 +160,7 @@
                     socket.close();
                 }
             } catch (IOException ex) {
-                Log.w(TAG, "Failed closing socket", ex);
+                Slog.w(TAG, "Failed closing socket", ex);
             }
         }
     }
@@ -177,9 +177,9 @@
      */
     private void sendCommand(String command, String argument) {
         synchronized (this) {
-            if (LOCAL_LOGD) Log.d(TAG, String.format("SND -> {%s} {%s}", command, argument));
+            if (LOCAL_LOGD) Slog.d(TAG, String.format("SND -> {%s} {%s}", command, argument));
             if (mOutputStream == null) {
-                Log.e(TAG, "No connection to daemon", new IllegalStateException());
+                Slog.e(TAG, "No connection to daemon", new IllegalStateException());
             } else {
                 StringBuilder builder = new StringBuilder(command);
                 if (argument != null) {
@@ -190,7 +190,7 @@
                 try {
                     mOutputStream.write(builder.toString().getBytes());
                 } catch (IOException ex) {
-                    Log.e(TAG, "IOException in sendCommand", ex);
+                    Slog.e(TAG, "IOException in sendCommand", ex);
                 }
             }
         }
@@ -210,7 +210,7 @@
         while (!complete) {
             try {
                 String line = mResponseQueue.take();
-                if (LOCAL_LOGD) Log.d(TAG, String.format("RSP <- {%s}", line));
+                if (LOCAL_LOGD) Slog.d(TAG, String.format("RSP <- {%s}", line));
                 String[] tokens = line.split(" ");
                 try {
                     code = Integer.parseInt(tokens[0]);
@@ -224,7 +224,7 @@
                 }
                 response.add(line);
             } catch (InterruptedException ex) {
-                Log.e(TAG, "Failed to process response", ex);
+                Slog.e(TAG, "Failed to process response", ex);
             }
         }
 
@@ -258,12 +258,12 @@
                 if (code == expectedResponseCode) {
                     rdata[idx++] = line.substring(tok[0].length() + 1);
                 } else if (code == NativeDaemonConnector.ResponseCode.CommandOkay) {
-                    if (LOCAL_LOGD) Log.d(TAG, String.format("List terminated with {%s}", line));
+                    if (LOCAL_LOGD) Slog.d(TAG, String.format("List terminated with {%s}", line));
                     int last = rsp.size() -1;
                     if (i != last) {
-                        Log.w(TAG, String.format("Recv'd %d lines after end of list {%s}", (last-i), cmd));
+                        Slog.w(TAG, String.format("Recv'd %d lines after end of list {%s}", (last-i), cmd));
                         for (int j = i; j <= last ; j++) {
-                            Log.w(TAG, String.format("ExtraData <%s>", rsp.get(i)));
+                            Slog.w(TAG, String.format("ExtraData <%s>", rsp.get(i)));
                         }
                     }
                     return rdata;
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 7c555e2..6d121c3 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -30,7 +30,7 @@
 import android.os.Handler;
 import android.os.SystemProperties;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Slog;
 import java.util.ArrayList;
 import java.util.StringTokenizer;
 import android.provider.Settings;
@@ -99,12 +99,12 @@
     }
 
     public void registerObserver(INetworkManagementEventObserver obs) {
-        Log.d(TAG, "Registering observer");
+        Slog.d(TAG, "Registering observer");
         mObservers.add(obs);
     }
 
     public void unregisterObserver(INetworkManagementEventObserver obs) {
-        Log.d(TAG, "Unregistering observer");
+        Slog.d(TAG, "Unregistering observer");
         mObservers.remove(mObservers.indexOf(obs));
     }
 
@@ -116,7 +116,7 @@
             try {
                 obs.interfaceLinkStatusChanged(iface, link);
             } catch (Exception ex) {
-                Log.w(TAG, "Observer notifier failed", ex);
+                Slog.w(TAG, "Observer notifier failed", ex);
             }
         }
     }
@@ -129,7 +129,7 @@
             try {
                 obs.interfaceAdded(iface);
             } catch (Exception ex) {
-                Log.w(TAG, "Observer notifier failed", ex);
+                Slog.w(TAG, "Observer notifier failed", ex);
             }
         }
     }
@@ -142,7 +142,7 @@
             try {
                 obs.interfaceRemoved(iface);
             } catch (Exception ex) {
-                Log.w(TAG, "Observer notifier failed", ex);
+                Slog.w(TAG, "Observer notifier failed", ex);
             }
         }
     }
@@ -224,7 +224,7 @@
 
     public InterfaceConfiguration getInterfaceConfig(String iface) throws IllegalStateException {
         String rsp = mConnector.doCommand("interface getcfg " + iface).get(0);
-        Log.d(TAG, String.format("rsp <%s>", rsp));
+        Slog.d(TAG, String.format("rsp <%s>", rsp));
 
         // Rsp: 213 xx:xx:xx:xx:xx:xx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz [flag1 flag2 flag3]
         StringTokenizer st = new StringTokenizer(rsp);
@@ -246,18 +246,18 @@
         try {
             cfg.ipAddr = stringToIpAddr(st.nextToken(" "));
         } catch (UnknownHostException uhe) {
-            Log.e(TAG, "Failed to parse ipaddr", uhe);
+            Slog.e(TAG, "Failed to parse ipaddr", uhe);
             cfg.ipAddr = 0;
         }
 
         try {
             cfg.netmask = stringToIpAddr(st.nextToken(" "));
         } catch (UnknownHostException uhe) {
-            Log.e(TAG, "Failed to parse netmask", uhe);
+            Slog.e(TAG, "Failed to parse netmask", uhe);
             cfg.netmask = 0;
         }
         cfg.interfaceFlags = st.nextToken("]").trim() +"]";
-        Log.d(TAG, String.format("flags <%s>", cfg.interfaceFlags));
+        Slog.d(TAG, String.format("flags <%s>", cfg.interfaceFlags));
         return cfg;
     }
 
@@ -275,7 +275,7 @@
             throw new SecurityException("Requires SHUTDOWN permission");
         }
 
-        Log.d(TAG, "Shutting down");
+        Slog.d(TAG, "Shutting down");
     }
 
     public boolean getIpForwardingEnabled() throws IllegalStateException{
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 3c43352..78d8c49 100755
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -55,6 +55,7 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.EventLog;
+import android.util.Slog;
 import android.util.Log;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
@@ -466,10 +467,10 @@
     // ============================================================================
     public void enqueueToast(String pkg, ITransientNotification callback, int duration)
     {
-        Log.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " duration=" + duration);
+        Slog.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " duration=" + duration);
 
         if (pkg == null || callback == null) {
-            Log.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback);
+            Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback);
             return ;
         }
 
@@ -504,10 +505,10 @@
     }
 
     public void cancelToast(String pkg, ITransientNotification callback) {
-        Log.i(TAG, "cancelToast pkg=" + pkg + " callback=" + callback);
+        Slog.i(TAG, "cancelToast pkg=" + pkg + " callback=" + callback);
 
         if (pkg == null || callback == null) {
-            Log.e(TAG, "Not cancelling notification. pkg=" + pkg + " callback=" + callback);
+            Slog.e(TAG, "Not cancelling notification. pkg=" + pkg + " callback=" + callback);
             return ;
         }
 
@@ -518,7 +519,7 @@
                 if (index >= 0) {
                     cancelToastLocked(index);
                 } else {
-                    Log.w(TAG, "Toast already cancelled. pkg=" + pkg + " callback=" + callback);
+                    Slog.w(TAG, "Toast already cancelled. pkg=" + pkg + " callback=" + callback);
                 }
             } finally {
                 Binder.restoreCallingIdentity(callingId);
@@ -529,13 +530,13 @@
     private void showNextToastLocked() {
         ToastRecord record = mToastQueue.get(0);
         while (record != null) {
-            if (DBG) Log.d(TAG, "Show pkg=" + record.pkg + " callback=" + record.callback);
+            if (DBG) Slog.d(TAG, "Show pkg=" + record.pkg + " callback=" + record.callback);
             try {
                 record.callback.show();
                 scheduleTimeoutLocked(record, false);
                 return;
             } catch (RemoteException e) {
-                Log.w(TAG, "Object died trying to show notification " + record.callback
+                Slog.w(TAG, "Object died trying to show notification " + record.callback
                         + " in package " + record.pkg);
                 // remove it from the list and let the process die
                 int index = mToastQueue.indexOf(record);
@@ -557,7 +558,7 @@
         try {
             record.callback.hide();
         } catch (RemoteException e) {
-            Log.w(TAG, "Object died trying to hide notification " + record.callback
+            Slog.w(TAG, "Object died trying to hide notification " + record.callback
                     + " in package " + record.pkg);
             // don't worry about this, we're about to remove it from
             // the list anyway
@@ -582,7 +583,7 @@
 
     private void handleTimeout(ToastRecord record)
     {
-        if (DBG) Log.d(TAG, "Timeout pkg=" + record.pkg + " callback=" + record.callback);
+        if (DBG) Slog.d(TAG, "Timeout pkg=" + record.pkg + " callback=" + record.callback);
         synchronized (mToastQueue) {
             int index = indexOfToastLocked(record.pkg, record.callback);
             if (index >= 0) {
@@ -818,7 +819,7 @@
             if (mLedNotification == old) {
                 mLedNotification = null;
             }
-            //Log.i(TAG, "notification.lights="
+            //Slog.i(TAG, "notification.lights="
             //        + ((old.notification.lights.flags & Notification.FLAG_SHOW_LIGHTS) != 0));
             if ((notification.flags & Notification.FLAG_SHOW_LIGHTS) != 0) {
                 mLights.add(r);
@@ -1013,7 +1014,7 @@
                         } catch (PendingIntent.CanceledException ex) {
                             // do nothing - there's no relevant way to recover, and
                             //     no reason to let this propagate
-                            Log.w(TAG, "canceled PendingIntent for " + r.pkg, ex);
+                            Slog.w(TAG, "canceled PendingIntent for " + r.pkg, ex);
                         }
                     }
                     mNotificationList.remove(i);
diff --git a/services/java/com/android/server/PackageManagerBackupAgent.java b/services/java/com/android/server/PackageManagerBackupAgent.java
index 9551db5..e45edfb 100644
--- a/services/java/com/android/server/PackageManagerBackupAgent.java
+++ b/services/java/com/android/server/PackageManagerBackupAgent.java
@@ -26,7 +26,7 @@
 import android.content.pm.Signature;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -95,7 +95,7 @@
 
     public Metadata getRestoredMetadata(String packageName) {
         if (mRestoredSignatures == null) {
-            Log.w(TAG, "getRestoredMetadata() before metadata read!");
+            Slog.w(TAG, "getRestoredMetadata() before metadata read!");
             return null;
         }
 
@@ -104,7 +104,7 @@
 
     public Set<String> getRestoredPackages() {
         if (mRestoredSignatures == null) {
-            Log.w(TAG, "getRestoredPackages() before metadata read!");
+            Slog.w(TAG, "getRestoredPackages() before metadata read!");
             return null;
         }
 
@@ -120,7 +120,7 @@
     // the package name.
     public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
             ParcelFileDescriptor newState) {
-        if (DEBUG) Log.v(TAG, "onBackup()");
+        if (DEBUG) Slog.v(TAG, "onBackup()");
 
         ByteArrayOutputStream bufStream = new ByteArrayOutputStream();  // we'll reuse these
         DataOutputStream outWriter = new DataOutputStream(bufStream);
@@ -131,7 +131,7 @@
         // "already backed up" map built by parseStateFile().
         if (mStoredIncrementalVersion == null
                 || !mStoredIncrementalVersion.equals(Build.VERSION.INCREMENTAL)) {
-            Log.i(TAG, "Previous metadata " + mStoredIncrementalVersion + " mismatch vs "
+            Slog.i(TAG, "Previous metadata " + mStoredIncrementalVersion + " mismatch vs "
                     + Build.VERSION.INCREMENTAL + " - rewriting");
             mExisting.clear();
         }
@@ -147,14 +147,14 @@
              *                       the backup set.
              */
             if (!mExisting.contains(GLOBAL_METADATA_KEY)) {
-                if (DEBUG) Log.v(TAG, "Storing global metadata key");
+                if (DEBUG) Slog.v(TAG, "Storing global metadata key");
                 outWriter.writeInt(Build.VERSION.SDK_INT);
                 outWriter.writeUTF(Build.VERSION.INCREMENTAL);
                 byte[] metadata = bufStream.toByteArray();
                 data.writeEntityHeader(GLOBAL_METADATA_KEY, metadata.length);
                 data.writeEntityData(metadata, metadata.length);
             } else {
-                if (DEBUG) Log.v(TAG, "Global metadata key already stored");
+                if (DEBUG) Slog.v(TAG, "Global metadata key already stored");
                 // don't consider it to have been skipped/deleted
                 mExisting.remove(GLOBAL_METADATA_KEY);
             }
@@ -211,7 +211,7 @@
                         byte[] sigs = flattenSignatureArray(info.signatures);
 
                         if (DEBUG) {
-                            Log.v(TAG, "+ metadata for " + packName
+                            Slog.v(TAG, "+ metadata for " + packName
                                     + " version=" + info.versionCode
                                     + " versionLen=" + versionBuf.length
                                     + " sigsLen=" + sigs.length);
@@ -228,17 +228,17 @@
             // mentioned in the saved state file, but appear to no longer be present
             // on the device.  Write a deletion entity for them.
             for (String app : mExisting) {
-                if (DEBUG) Log.v(TAG, "- removing metadata for deleted pkg " + app);
+                if (DEBUG) Slog.v(TAG, "- removing metadata for deleted pkg " + app);
                 try {
                     data.writeEntityHeader(app, -1);
                 } catch (IOException e) {
-                    Log.e(TAG, "Unable to write package deletions!");
+                    Slog.e(TAG, "Unable to write package deletions!");
                     return;
                 }
             }
         } catch (IOException e) {
             // Real error writing data
-            Log.e(TAG, "Unable to write package backup data file!");
+            Slog.e(TAG, "Unable to write package backup data file!");
             return;
         }
 
@@ -253,14 +253,14 @@
             throws IOException {
         List<ApplicationInfo> restoredApps = new ArrayList<ApplicationInfo>();
         HashMap<String, Metadata> sigMap = new HashMap<String, Metadata>();
-        if (DEBUG) Log.v(TAG, "onRestore()");
+        if (DEBUG) Slog.v(TAG, "onRestore()");
         int storedSystemVersion = -1;
 
         while (data.readNextHeader()) {
             String key = data.getKey();
             int dataSize = data.getDataSize();
 
-            if (DEBUG) Log.v(TAG, "   got key=" + key + " dataSize=" + dataSize);
+            if (DEBUG) Slog.v(TAG, "   got key=" + key + " dataSize=" + dataSize);
 
             // generic setup to parse any entity data
             byte[] dataBuf = new byte[dataSize];
@@ -270,17 +270,17 @@
 
             if (key.equals(GLOBAL_METADATA_KEY)) {
                 int storedSdkVersion = in.readInt();
-                if (DEBUG) Log.v(TAG, "   storedSystemVersion = " + storedSystemVersion);
+                if (DEBUG) Slog.v(TAG, "   storedSystemVersion = " + storedSystemVersion);
                 if (storedSystemVersion > Build.VERSION.SDK_INT) {
                     // returning before setting the sig map means we rejected the restore set
-                    Log.w(TAG, "Restore set was from a later version of Android; not restoring");
+                    Slog.w(TAG, "Restore set was from a later version of Android; not restoring");
                     return;
                 }
                 mStoredSdkVersion = storedSdkVersion;
                 mStoredIncrementalVersion = in.readUTF();
                 mHasMetadata = true;
                 if (DEBUG) {
-                    Log.i(TAG, "Restore set version " + storedSystemVersion
+                    Slog.i(TAG, "Restore set version " + storedSystemVersion
                             + " is compatible with OS version " + Build.VERSION.SDK_INT
                             + " (" + mStoredIncrementalVersion + " vs "
                             + Build.VERSION.INCREMENTAL + ")");
@@ -290,7 +290,7 @@
                 int versionCode = in.readInt();
                 Signature[] sigs = unflattenSignatureArray(in);
                 if (DEBUG) {
-                    Log.i(TAG, "   restored metadata for " + key
+                    Slog.i(TAG, "   restored metadata for " + key
                             + " dataSize=" + dataSize
                             + " versionCode=" + versionCode + " sigs=" + sigs);
                 }
@@ -337,11 +337,11 @@
 
         try {
             int num = in.readInt();
-            if (DEBUG) Log.v(TAG, " ... unflatten read " + num);
+            if (DEBUG) Slog.v(TAG, " ... unflatten read " + num);
 
             // Sensical?
             if (num > 20) {
-                Log.e(TAG, "Suspiciously large sig count in restore data; aborting");
+                Slog.e(TAG, "Suspiciously large sig count in restore data; aborting");
                 throw new IllegalStateException("Bad restore state");
             }
 
@@ -355,10 +355,10 @@
         } catch (EOFException e) {
             // clean termination
             if (sigs == null) {
-                Log.w(TAG, "Empty signature block found");
+                Slog.w(TAG, "Empty signature block found");
             }
         } catch (IOException e) {
-            Log.e(TAG, "Unable to unflatten sigs");
+            Slog.e(TAG, "Unable to unflatten sigs");
             return null;
         }
 
@@ -388,7 +388,7 @@
                 mStoredIncrementalVersion = in.readUTF();
                 mExisting.add(GLOBAL_METADATA_KEY);
             } else {
-                Log.e(TAG, "No global metadata in state file!");
+                Slog.e(TAG, "No global metadata in state file!");
                 return;
             }
 
@@ -403,7 +403,7 @@
             // safe; we're done
         } catch (IOException e) {
             // whoops, bad state file.  abort.
-            Log.e(TAG, "Unable to read Package Manager state file: " + e);
+            Slog.e(TAG, "Unable to read Package Manager state file: " + e);
         }
     }
 
@@ -424,7 +424,7 @@
                 out.writeInt(pkg.versionCode);
             }
         } catch (IOException e) {
-            Log.e(TAG, "Unable to write package manager state file!");
+            Slog.e(TAG, "Unable to write package manager state file!");
             return;
         }
     }
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 63fdaef..bf2b1c7 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -28,9 +28,9 @@
 import org.xmlpull.v1.XmlSerializer;
 
 import android.app.ActivityManagerNative;
-import android.app.DevicePolicyManager;
 import android.app.IActivityManager;
-import android.app.IDevicePolicyManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.admin.IDevicePolicyManager;
 import android.backup.IBackupManager;
 import android.content.ComponentName;
 import android.content.Context;
@@ -56,8 +56,6 @@
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
-import static android.content.pm.PackageManager.PKG_INSTALL_COMPLETE;
-import static android.content.pm.PackageManager.PKG_INSTALL_INCOMPLETE;
 import android.content.pm.PackageParser;
 import android.content.pm.PermissionInfo;
 import android.content.pm.PermissionGroupInfo;
@@ -151,6 +149,19 @@
     // package apks to install directory.
     private static final String INSTALL_PACKAGE_SUFFIX = "-";
 
+    /**
+     * Indicates the state of installation. Used by PackageManager to
+     * figure out incomplete installations. Say a package is being installed
+     * (the state is set to PKG_INSTALL_INCOMPLETE) and remains so till
+     * the package installation is successful or unsuccesful lin which case
+     * the PackageManager will no longer maintain state information associated
+     * with the package. If some exception(like device freeze or battery being
+     * pulled out) occurs during installation of a package, the PackageManager
+     * needs this information to clean up the previously failed installation.
+     */
+    private static final int PKG_INSTALL_INCOMPLETE = 0;
+    private static final int PKG_INSTALL_COMPLETE = 1;
+
     static final int SCAN_MONITOR = 1<<0;
     static final int SCAN_NO_DEX = 1<<1;
     static final int SCAN_FORCE_DEX = 1<<2;
@@ -4426,8 +4437,11 @@
         }
 
         public void handleStartCopy(IMediaContainerService imcs) {
-            int ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
-            if (imcs != null) {
+            int ret = PackageManager.INSTALL_SUCCEEDED;
+            // Dont need to invoke getInstallLocation for forward locked apps.
+            if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
+                flags &= ~PackageManager.INSTALL_EXTERNAL;
+            } else if (imcs != null) {
                 // Remote call to find out default install location
                 int loc = getInstallLocation(imcs);
                 // Use install location to create InstallArgs and temporary
@@ -4447,16 +4461,6 @@
                             flags &= ~PackageManager.INSTALL_EXTERNAL;
                         }
                     }
-                    // Disable forward locked apps on sdcard.
-                    if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0 &&
-                            (flags & PackageManager.INSTALL_EXTERNAL) != 0) {
-                        // Make sure forward locked apps can only be installed
-                        // on internal storage
-                        Log.w(TAG, "Cannot install protected apps on sdcard");
-                        ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
-                    } else {
-                        ret = PackageManager.INSTALL_SUCCEEDED;
-                    }
                 }
             }
             // Create the file args now.
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 1ccae86..11b966e 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -54,6 +54,7 @@
 import android.provider.Settings;
 import android.util.EventLog;
 import android.util.Log;
+import android.util.Slog;
 import android.view.WindowManagerPolicy;
 import static android.provider.Settings.System.DIM_SCREEN;
 import static android.provider.Settings.System.SCREEN_BRIGHTNESS;
@@ -154,8 +155,8 @@
     private boolean mDoneBooting = false;
     private boolean mBootCompleted = false;
     private int mStayOnConditions = 0;
-    private int[] mBroadcastQueue = new int[] { -1, -1, -1 };
-    private int[] mBroadcastWhy = new int[3];
+    private final int[] mBroadcastQueue = new int[] { -1, -1, -1 };
+    private final int[] mBroadcastWhy = new int[3];
     private int mPartialCount = 0;
     private int mPowerState;
     // mScreenOffReason can be WindowManagerPolicy.OFF_BECAUSE_OF_USER,
@@ -194,8 +195,8 @@
     private UnsynchronizedWakeLock mProximityPartialLock;
     private HandlerThread mHandlerThread;
     private Handler mHandler;
-    private TimeoutTask mTimeoutTask = new TimeoutTask();
-    private LightAnimator mLightAnimator = new LightAnimator();
+    private final TimeoutTask mTimeoutTask = new TimeoutTask();
+    private final LightAnimator mLightAnimator = new LightAnimator();
     private final BrightnessState mScreenBrightness
             = new BrightnessState(SCREEN_BRIGHT_BIT);
     private final BrightnessState mKeyboardBrightness
@@ -223,7 +224,7 @@
     private volatile int mPokey = 0;
     private volatile boolean mPokeAwakeOnSet = false;
     private volatile boolean mInitComplete = false;
-    private HashMap<IBinder,PokeLock> mPokeLocks = new HashMap<IBinder,PokeLock>();
+    private final HashMap<IBinder,PokeLock> mPokeLocks = new HashMap<IBinder,PokeLock>();
     // mLastScreenOnTime is the time the screen was last turned on
     private long mLastScreenOnTime;
     private boolean mPreventScreenOn;
@@ -254,25 +255,25 @@
             mLog = new PrintStream("/data/power.log");
         }
         catch (FileNotFoundException e) {
-            android.util.Log.e(TAG, "Life is hard", e);
+            android.util.Slog.e(TAG, "Life is hard", e);
         }
     }
     static class Log {
         static void d(String tag, String s) {
             mLog.println(s);
-            android.util.Log.d(tag, s);
+            android.util.Slog.d(tag, s);
         }
         static void i(String tag, String s) {
             mLog.println(s);
-            android.util.Log.i(tag, s);
+            android.util.Slog.i(tag, s);
         }
         static void w(String tag, String s) {
             mLog.println(s);
-            android.util.Log.w(tag, s);
+            android.util.Slog.w(tag, s);
         }
         static void e(String tag, String s) {
             mLog.println(s);
-            android.util.Log.e(tag, s);
+            android.util.Slog.e(tag, s);
         }
     }
     */
@@ -348,10 +349,14 @@
                     // treat plugging and unplugging the devices as a user activity.
                     // users find it disconcerting when they unplug the device
                     // and it shuts off right away.
+                    // to avoid turning on the screen when unplugging, we only trigger
+                    // user activity when screen was already on.
                     // temporarily set mUserActivityAllowed to true so this will work
                     // even when the keyguard is on.
                     synchronized (mLocks) {
-                        forceUserActivityLocked();
+                        if (!wasPowered || (mPowerState & SCREEN_ON_BIT) != 0) {
+                            forceUserActivityLocked();
+                        }
                     }
                 }
             }
@@ -643,7 +648,7 @@
         int acquireType = -1;
 
         if (mSpew) {
-            Log.d(TAG, "acquireWakeLock flags=0x" + Integer.toHexString(flags) + " tag=" + tag);
+            Slog.d(TAG, "acquireWakeLock flags=0x" + Integer.toHexString(flags) + " tag=" + tag);
         }
 
         int index = mLocks.getIndex(lock);
@@ -672,7 +677,7 @@
                 default:
                     // just log and bail.  we're in the server, so don't
                     // throw an exception.
-                    Log.e(TAG, "bad wakelock type for lock '" + tag + "' "
+                    Slog.e(TAG, "bad wakelock type for lock '" + tag + "' "
                             + " flags=" + flags);
                     return;
             }
@@ -691,14 +696,14 @@
                 int oldWakeLockState = mWakeLockState;
                 mWakeLockState = mLocks.reactivateScreenLocksLocked();
                 if (mSpew) {
-                    Log.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState)
+                    Slog.d(TAG, "wakeup here mUserState=0x" + Integer.toHexString(mUserState)
                             + " mWakeLockState=0x"
                             + Integer.toHexString(mWakeLockState)
                             + " previous wakeLockState=0x" + Integer.toHexString(oldWakeLockState));
                 }
             } else {
                 if (mSpew) {
-                    Log.d(TAG, "here mUserState=0x" + Integer.toHexString(mUserState)
+                    Slog.d(TAG, "here mUserState=0x" + Integer.toHexString(mUserState)
                             + " mLocks.gatherState()=0x"
                             + Integer.toHexString(mLocks.gatherState())
                             + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState));
@@ -758,7 +763,7 @@
         }
 
         if (mSpew) {
-            Log.d(TAG, "releaseWakeLock flags=0x"
+            Slog.d(TAG, "releaseWakeLock flags=0x"
                     + Integer.toHexString(wl.flags) + " tag=" + wl.tag);
         }
 
@@ -783,7 +788,7 @@
                         ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) {
                     // wait for proximity sensor to go negative before disabling sensor
                     if (mDebugProximitySensor) {
-                        Log.d(TAG, "waiting for proximity sensor to go negative");
+                        Slog.d(TAG, "waiting for proximity sensor to go negative");
                     }
                 } else {
                     disableProximityLockLocked();
@@ -833,7 +838,7 @@
     public void setPokeLock(int pokey, IBinder token, String tag) {
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
         if (token == null) {
-            Log.e(TAG, "setPokeLock got null token for tag='" + tag + "'");
+            Slog.e(TAG, "setPokeLock got null token for tag='" + tag + "'");
             return;
         }
 
@@ -932,92 +937,94 @@
 
         long now = SystemClock.uptimeMillis();
 
-        pw.println("Power Manager State:");
-        pw.println("  mIsPowered=" + mIsPowered
-                + " mPowerState=" + mPowerState
-                + " mScreenOffTime=" + (SystemClock.elapsedRealtime()-mScreenOffTime)
-                + " ms");
-        pw.println("  mPartialCount=" + mPartialCount);
-        pw.println("  mWakeLockState=" + dumpPowerState(mWakeLockState));
-        pw.println("  mUserState=" + dumpPowerState(mUserState));
-        pw.println("  mPowerState=" + dumpPowerState(mPowerState));
-        pw.println("  mLocks.gather=" + dumpPowerState(mLocks.gatherState()));
-        pw.println("  mNextTimeout=" + mNextTimeout + " now=" + now
-                + " " + ((mNextTimeout-now)/1000) + "s from now");
-        pw.println("  mDimScreen=" + mDimScreen
-                + " mStayOnConditions=" + mStayOnConditions);
-        pw.println("  mScreenOffReason=" + mScreenOffReason
-                + " mUserState=" + mUserState);
-        pw.println("  mBroadcastQueue={" + mBroadcastQueue[0] + ',' + mBroadcastQueue[1]
-                + ',' + mBroadcastQueue[2] + "}");
-        pw.println("  mBroadcastWhy={" + mBroadcastWhy[0] + ',' + mBroadcastWhy[1]
-                + ',' + mBroadcastWhy[2] + "}");
-        pw.println("  mPokey=" + mPokey + " mPokeAwakeonSet=" + mPokeAwakeOnSet);
-        pw.println("  mKeyboardVisible=" + mKeyboardVisible
-                + " mUserActivityAllowed=" + mUserActivityAllowed);
-        pw.println("  mKeylightDelay=" + mKeylightDelay + " mDimDelay=" + mDimDelay
-                + " mScreenOffDelay=" + mScreenOffDelay);
-        pw.println("  mPreventScreenOn=" + mPreventScreenOn
-                + "  mScreenBrightnessOverride=" + mScreenBrightnessOverride
-                + "  mButtonBrightnessOverride=" + mButtonBrightnessOverride);
-        pw.println("  mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting
-                + " mMaximumScreenOffTimeout=" + mMaximumScreenOffTimeout);
-        pw.println("  mLastScreenOnTime=" + mLastScreenOnTime);
-        pw.println("  mBroadcastWakeLock=" + mBroadcastWakeLock);
-        pw.println("  mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock);
-        pw.println("  mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock);
-        pw.println("  mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock);
-        pw.println("  mProximityPartialLock=" + mProximityPartialLock);
-        pw.println("  mProximityWakeLockCount=" + mProximityWakeLockCount);
-        pw.println("  mProximitySensorEnabled=" + mProximitySensorEnabled);
-        pw.println("  mProximitySensorActive=" + mProximitySensorActive);
-        pw.println("  mProximityPendingValue=" + mProximityPendingValue);
-        pw.println("  mLastProximityEventTime=" + mLastProximityEventTime);
-        pw.println("  mLightSensorEnabled=" + mLightSensorEnabled);
-        pw.println("  mLightSensorValue=" + mLightSensorValue
-                + " mLightSensorPendingValue=" + mLightSensorPendingValue);
-        pw.println("  mLightSensorScreenBrightness=" + mLightSensorScreenBrightness
-                + " mLightSensorButtonBrightness=" + mLightSensorButtonBrightness
-                + " mLightSensorKeyboardBrightness=" + mLightSensorKeyboardBrightness);
-        pw.println("  mUseSoftwareAutoBrightness=" + mUseSoftwareAutoBrightness);
-        pw.println("  mAutoBrightessEnabled=" + mAutoBrightessEnabled);
-        mScreenBrightness.dump(pw, "  mScreenBrightness: ");
-        mKeyboardBrightness.dump(pw, "  mKeyboardBrightness: ");
-        mButtonBrightness.dump(pw, "  mButtonBrightness: ");
+        synchronized (mLocks) {
+            pw.println("Power Manager State:");
+            pw.println("  mIsPowered=" + mIsPowered
+                    + " mPowerState=" + mPowerState
+                    + " mScreenOffTime=" + (SystemClock.elapsedRealtime()-mScreenOffTime)
+                    + " ms");
+            pw.println("  mPartialCount=" + mPartialCount);
+            pw.println("  mWakeLockState=" + dumpPowerState(mWakeLockState));
+            pw.println("  mUserState=" + dumpPowerState(mUserState));
+            pw.println("  mPowerState=" + dumpPowerState(mPowerState));
+            pw.println("  mLocks.gather=" + dumpPowerState(mLocks.gatherState()));
+            pw.println("  mNextTimeout=" + mNextTimeout + " now=" + now
+                    + " " + ((mNextTimeout-now)/1000) + "s from now");
+            pw.println("  mDimScreen=" + mDimScreen
+                    + " mStayOnConditions=" + mStayOnConditions);
+            pw.println("  mScreenOffReason=" + mScreenOffReason
+                    + " mUserState=" + mUserState);
+            pw.println("  mBroadcastQueue={" + mBroadcastQueue[0] + ',' + mBroadcastQueue[1]
+                    + ',' + mBroadcastQueue[2] + "}");
+            pw.println("  mBroadcastWhy={" + mBroadcastWhy[0] + ',' + mBroadcastWhy[1]
+                    + ',' + mBroadcastWhy[2] + "}");
+            pw.println("  mPokey=" + mPokey + " mPokeAwakeonSet=" + mPokeAwakeOnSet);
+            pw.println("  mKeyboardVisible=" + mKeyboardVisible
+                    + " mUserActivityAllowed=" + mUserActivityAllowed);
+            pw.println("  mKeylightDelay=" + mKeylightDelay + " mDimDelay=" + mDimDelay
+                    + " mScreenOffDelay=" + mScreenOffDelay);
+            pw.println("  mPreventScreenOn=" + mPreventScreenOn
+                    + "  mScreenBrightnessOverride=" + mScreenBrightnessOverride
+                    + "  mButtonBrightnessOverride=" + mButtonBrightnessOverride);
+            pw.println("  mScreenOffTimeoutSetting=" + mScreenOffTimeoutSetting
+                    + " mMaximumScreenOffTimeout=" + mMaximumScreenOffTimeout);
+            pw.println("  mLastScreenOnTime=" + mLastScreenOnTime);
+            pw.println("  mBroadcastWakeLock=" + mBroadcastWakeLock);
+            pw.println("  mStayOnWhilePluggedInScreenDimLock=" + mStayOnWhilePluggedInScreenDimLock);
+            pw.println("  mStayOnWhilePluggedInPartialLock=" + mStayOnWhilePluggedInPartialLock);
+            pw.println("  mPreventScreenOnPartialLock=" + mPreventScreenOnPartialLock);
+            pw.println("  mProximityPartialLock=" + mProximityPartialLock);
+            pw.println("  mProximityWakeLockCount=" + mProximityWakeLockCount);
+            pw.println("  mProximitySensorEnabled=" + mProximitySensorEnabled);
+            pw.println("  mProximitySensorActive=" + mProximitySensorActive);
+            pw.println("  mProximityPendingValue=" + mProximityPendingValue);
+            pw.println("  mLastProximityEventTime=" + mLastProximityEventTime);
+            pw.println("  mLightSensorEnabled=" + mLightSensorEnabled);
+            pw.println("  mLightSensorValue=" + mLightSensorValue
+                    + " mLightSensorPendingValue=" + mLightSensorPendingValue);
+            pw.println("  mLightSensorScreenBrightness=" + mLightSensorScreenBrightness
+                    + " mLightSensorButtonBrightness=" + mLightSensorButtonBrightness
+                    + " mLightSensorKeyboardBrightness=" + mLightSensorKeyboardBrightness);
+            pw.println("  mUseSoftwareAutoBrightness=" + mUseSoftwareAutoBrightness);
+            pw.println("  mAutoBrightessEnabled=" + mAutoBrightessEnabled);
+            mScreenBrightness.dump(pw, "  mScreenBrightness: ");
+            mKeyboardBrightness.dump(pw, "  mKeyboardBrightness: ");
+            mButtonBrightness.dump(pw, "  mButtonBrightness: ");
 
-        int N = mLocks.size();
-        pw.println();
-        pw.println("mLocks.size=" + N + ":");
-        for (int i=0; i<N; i++) {
-            WakeLock wl = mLocks.get(i);
-            String type = lockType(wl.flags & LOCK_MASK);
-            String acquireCausesWakeup = "";
-            if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) {
-                acquireCausesWakeup = "ACQUIRE_CAUSES_WAKEUP ";
+            int N = mLocks.size();
+            pw.println();
+            pw.println("mLocks.size=" + N + ":");
+            for (int i=0; i<N; i++) {
+                WakeLock wl = mLocks.get(i);
+                String type = lockType(wl.flags & LOCK_MASK);
+                String acquireCausesWakeup = "";
+                if ((wl.flags & PowerManager.ACQUIRE_CAUSES_WAKEUP) != 0) {
+                    acquireCausesWakeup = "ACQUIRE_CAUSES_WAKEUP ";
+                }
+                String activated = "";
+                if (wl.activated) {
+                   activated = " activated";
+                }
+                pw.println("  " + type + " '" + wl.tag + "'" + acquireCausesWakeup
+                        + activated + " (minState=" + wl.minState + ")");
             }
-            String activated = "";
-            if (wl.activated) {
-               activated = " activated";
+
+            pw.println();
+            pw.println("mPokeLocks.size=" + mPokeLocks.size() + ":");
+            for (PokeLock p: mPokeLocks.values()) {
+                pw.println("    poke lock '" + p.tag + "':"
+                        + ((p.pokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0
+                                ? " POKE_LOCK_IGNORE_CHEEK_EVENTS" : "")
+                        + ((p.pokey & POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS) != 0
+                                ? " POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS" : "")
+                        + ((p.pokey & POKE_LOCK_SHORT_TIMEOUT) != 0
+                                ? " POKE_LOCK_SHORT_TIMEOUT" : "")
+                        + ((p.pokey & POKE_LOCK_MEDIUM_TIMEOUT) != 0
+                                ? " POKE_LOCK_MEDIUM_TIMEOUT" : ""));
             }
-            pw.println("  " + type + " '" + wl.tag + "'" + acquireCausesWakeup
-                    + activated + " (minState=" + wl.minState + ")");
-        }
 
-        pw.println();
-        pw.println("mPokeLocks.size=" + mPokeLocks.size() + ":");
-        for (PokeLock p: mPokeLocks.values()) {
-            pw.println("    poke lock '" + p.tag + "':"
-                    + ((p.pokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0
-                            ? " POKE_LOCK_IGNORE_CHEEK_EVENTS" : "")
-                    + ((p.pokey & POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS) != 0
-                            ? " POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS" : "")
-                    + ((p.pokey & POKE_LOCK_SHORT_TIMEOUT) != 0
-                            ? " POKE_LOCK_SHORT_TIMEOUT" : "")
-                    + ((p.pokey & POKE_LOCK_MEDIUM_TIMEOUT) != 0
-                            ? " POKE_LOCK_MEDIUM_TIMEOUT" : ""));
+            pw.println();
         }
-
-        pw.println();
     }
 
     private void setTimeoutLocked(long now, int nextState)
@@ -1036,7 +1043,7 @@
                         when += mDimDelay;
                         break;
                     } else {
-                        Log.w(TAG, "mDimDelay=" + mDimDelay + " while trying to dim");
+                        Slog.w(TAG, "mDimDelay=" + mDimDelay + " while trying to dim");
                     }
                 case SCREEN_OFF:
                     synchronized (mLocks) {
@@ -1045,7 +1052,7 @@
                     break;
             }
             if (mSpew) {
-                Log.d(TAG, "setTimeoutLocked now=" + now + " nextState=" + nextState
+                Slog.d(TAG, "setTimeoutLocked now=" + now + " nextState=" + nextState
                         + " when=" + when);
             }
             mHandler.postAtTime(mTimeoutTask, when);
@@ -1066,7 +1073,7 @@
         {
             synchronized (mLocks) {
                 if (mSpew) {
-                    Log.d(TAG, "user activity timeout timed out nextState=" + this.nextState);
+                    Slog.d(TAG, "user activity timeout timed out nextState=" + this.nextState);
                 }
 
                 if (nextState == -1) {
@@ -1175,7 +1182,7 @@
                     }
 
                     if (mSpew) {
-                        Log.d(TAG, "mBroadcastWakeLock=" + mBroadcastWakeLock);
+                        Slog.d(TAG, "mBroadcastWakeLock=" + mBroadcastWakeLock);
                     }
                     if (mContext != null && ActivityManagerNative.isSystemReady()) {
                         mContext.sendOrderedBroadcast(mScreenOnIntent, null,
@@ -1319,12 +1326,12 @@
                 // a prior preventScreenOn(true) call.)
                 if (!mProximitySensorActive && (mPowerState & SCREEN_ON_BIT) != 0) {
                     if (mSpew) {
-                        Log.d(TAG,
+                        Slog.d(TAG,
                               "preventScreenOn: turning on after a prior preventScreenOn(true)!");
                     }
                     int err = setScreenStateLocked(true);
                     if (err != 0) {
-                        Log.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err);
+                        Slog.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err);
                     }
                 }
 
@@ -1367,7 +1374,7 @@
         // we should have already removed any existing
         // mForceReenableScreenTask messages...
         if (!mPreventScreenOn) {
-            Log.w(TAG, "forceReenableScreen: mPreventScreenOn is false, nothing to do");
+            Slog.w(TAG, "forceReenableScreen: mPreventScreenOn is false, nothing to do");
             return;
         }
 
@@ -1379,7 +1386,7 @@
         // crashed before doing so.)
 
         // Log a warning, and forcibly turn the screen back on.
-        Log.w(TAG, "App called preventScreenOn(true) but didn't promptly reenable the screen! "
+        Slog.w(TAG, "App called preventScreenOn(true) but didn't promptly reenable the screen! "
               + "Forcing the screen back on...");
         preventScreenOn(false);
     }
@@ -1422,7 +1429,7 @@
             int err;
 
             if (mSpew) {
-                Log.d(TAG, "setPowerState: mPowerState=0x" + Integer.toHexString(mPowerState)
+                Slog.d(TAG, "setPowerState: mPowerState=0x" + Integer.toHexString(mPowerState)
                         + " newState=0x" + Integer.toHexString(newState)
                         + " noChangeLights=" + noChangeLights
                         + " reason=" + reason);
@@ -1453,17 +1460,17 @@
             boolean newScreenOn = (newState & SCREEN_ON_BIT) != 0;
 
             if (mSpew) {
-                Log.d(TAG, "setPowerState: mPowerState=" + mPowerState
+                Slog.d(TAG, "setPowerState: mPowerState=" + mPowerState
                         + " newState=" + newState + " noChangeLights=" + noChangeLights);
-                Log.d(TAG, "  oldKeyboardBright=" + ((mPowerState & KEYBOARD_BRIGHT_BIT) != 0)
+                Slog.d(TAG, "  oldKeyboardBright=" + ((mPowerState & KEYBOARD_BRIGHT_BIT) != 0)
                          + " newKeyboardBright=" + ((newState & KEYBOARD_BRIGHT_BIT) != 0));
-                Log.d(TAG, "  oldScreenBright=" + ((mPowerState & SCREEN_BRIGHT_BIT) != 0)
+                Slog.d(TAG, "  oldScreenBright=" + ((mPowerState & SCREEN_BRIGHT_BIT) != 0)
                          + " newScreenBright=" + ((newState & SCREEN_BRIGHT_BIT) != 0));
-                Log.d(TAG, "  oldButtonBright=" + ((mPowerState & BUTTON_BRIGHT_BIT) != 0)
+                Slog.d(TAG, "  oldButtonBright=" + ((mPowerState & BUTTON_BRIGHT_BIT) != 0)
                          + " newButtonBright=" + ((newState & BUTTON_BRIGHT_BIT) != 0));
-                Log.d(TAG, "  oldScreenOn=" + oldScreenOn
+                Slog.d(TAG, "  oldScreenOn=" + oldScreenOn
                          + " newScreenOn=" + newScreenOn);
-                Log.d(TAG, "  oldBatteryLow=" + ((mPowerState & BATTERY_LOW_BIT) != 0)
+                Slog.d(TAG, "  oldBatteryLow=" + ((mPowerState & BATTERY_LOW_BIT) != 0)
                          + " newBatteryLow=" + ((newState & BATTERY_LOW_BIT) != 0));
             }
 
@@ -1489,13 +1496,13 @@
                     // screen forever; see forceReenableScreen().)
                     boolean reallyTurnScreenOn = true;
                     if (mSpew) {
-                        Log.d(TAG, "- turning screen on...  mPreventScreenOn = "
+                        Slog.d(TAG, "- turning screen on...  mPreventScreenOn = "
                               + mPreventScreenOn);
                     }
 
                     if (mPreventScreenOn) {
                         if (mSpew) {
-                            Log.d(TAG, "- PREVENTING screen from really turning on!");
+                            Slog.d(TAG, "- PREVENTING screen from really turning on!");
                         }
                         reallyTurnScreenOn = false;
                     }
@@ -1506,7 +1513,7 @@
                             mBatteryStats.noteScreenBrightness(getPreferredBrightness());
                             mBatteryStats.noteScreenOn();
                         } catch (RemoteException e) {
-                            Log.w(TAG, "RemoteException calling noteScreenOn on BatteryStatsService", e);
+                            Slog.w(TAG, "RemoteException calling noteScreenOn on BatteryStatsService", e);
                         } finally {
                             Binder.restoreCallingIdentity(identity);
                         }
@@ -1533,7 +1540,7 @@
                     try {
                         mBatteryStats.noteScreenOff();
                     } catch (RemoteException e) {
-                        Log.w(TAG, "RemoteException calling noteScreenOff on BatteryStatsService", e);
+                        Slog.w(TAG, "RemoteException calling noteScreenOff on BatteryStatsService", e);
                     } finally {
                         Binder.restoreCallingIdentity(identity);
                     }
@@ -1719,14 +1726,14 @@
 
         if (startAnimation) {
             if (mSpew) {
-                Log.i(TAG, "Scheduling light animator!");
+                Slog.i(TAG, "Scheduling light animator!");
             }
             mHandler.removeCallbacks(mLightAnimator);
             mHandler.post(mLightAnimator);
         }
 
         if (offMask != 0) {
-            //Log.i(TAG, "Setting brightess off: " + offMask);
+            //Slog.i(TAG, "Setting brightess off: " + offMask);
             setLightBrightness(offMask, Power.BRIGHTNESS_OFF);
         }
         if (dimMask != 0) {
@@ -1735,7 +1742,7 @@
                     brightness > Power.BRIGHTNESS_LOW_BATTERY) {
                 brightness = Power.BRIGHTNESS_LOW_BATTERY;
             }
-            //Log.i(TAG, "Setting brightess dim " + brightness + ": " + offMask);
+            //Slog.i(TAG, "Setting brightess dim " + brightness + ": " + offMask);
             setLightBrightness(dimMask, brightness);
         }
         if (onMask != 0) {
@@ -1744,7 +1751,7 @@
                     brightness > Power.BRIGHTNESS_LOW_BATTERY) {
                 brightness = Power.BRIGHTNESS_LOW_BATTERY;
             }
-            //Log.i(TAG, "Setting brightess on " + brightness + ": " + onMask);
+            //Slog.i(TAG, "Setting brightess on " + brightness + ": " + onMask);
             setLightBrightness(onMask, brightness);
         }
     }
@@ -1798,7 +1805,7 @@
                     / stepsToTarget;
             if (mSpew) {
                 String noticeMe = nominalCurrentValue == curValue ? "" : "  ******************";
-                Log.i(TAG, "Setting target " + mask + ": cur=" + curValue
+                Slog.i(TAG, "Setting target " + mask + ": cur=" + curValue
                         + " target=" + targetValue + " delta=" + delta
                         + " nominalCurrentValue=" + nominalCurrentValue
                         + noticeMe);
@@ -1810,7 +1817,7 @@
         boolean stepLocked() {
             if (!animating) return false;
             if (false && mSpew) {
-                Log.i(TAG, "Step target " + mask + ": cur=" + curValue
+                Slog.i(TAG, "Step target " + mask + ": cur=" + curValue
                         + " target=" + targetValue + " delta=" + delta);
             }
             curValue += delta;
@@ -1830,7 +1837,7 @@
                     more = false;
                 }
             }
-            //Log.i(TAG, "Animating brightess " + curIntValue + ": " + mask);
+            //Slog.i(TAG, "Animating brightess " + curIntValue + ": " + mask);
             setLightBrightness(mask, curIntValue);
             animating = more;
             if (!more) {
@@ -1957,7 +1964,7 @@
         if (((mPokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0)
                 && (eventType == CHEEK_EVENT || eventType == TOUCH_EVENT)) {
             if (false) {
-                Log.d(TAG, "dropping cheek or short event mPokey=0x" + Integer.toHexString(mPokey));
+                Slog.d(TAG, "dropping cheek or short event mPokey=0x" + Integer.toHexString(mPokey));
             }
             return;
         }
@@ -1966,22 +1973,22 @@
                 && (eventType == TOUCH_EVENT || eventType == TOUCH_UP_EVENT
                     || eventType == LONG_TOUCH_EVENT || eventType == CHEEK_EVENT)) {
             if (false) {
-                Log.d(TAG, "dropping touch mPokey=0x" + Integer.toHexString(mPokey));
+                Slog.d(TAG, "dropping touch mPokey=0x" + Integer.toHexString(mPokey));
             }
             return;
         }
 
         if (false) {
             if (((mPokey & POKE_LOCK_IGNORE_CHEEK_EVENTS) != 0)) {
-                Log.d(TAG, "userActivity !!!");//, new RuntimeException());
+                Slog.d(TAG, "userActivity !!!");//, new RuntimeException());
             } else {
-                Log.d(TAG, "mPokey=0x" + Integer.toHexString(mPokey));
+                Slog.d(TAG, "mPokey=0x" + Integer.toHexString(mPokey));
             }
         }
 
         synchronized (mLocks) {
             if (mSpew) {
-                Log.d(TAG, "userActivity mLastEventTime=" + mLastEventTime + " time=" + time
+                Slog.d(TAG, "userActivity mLastEventTime=" + mLastEventTime + " time=" + time
                         + " mUserActivityAllowed=" + mUserActivityAllowed
                         + " mUserState=0x" + Integer.toHexString(mUserState)
                         + " mWakeLockState=0x" + Integer.toHexString(mWakeLockState)
@@ -1990,7 +1997,7 @@
             }
             // ignore user activity if we are in the process of turning off the screen
             if (isScreenTurningOffLocked()) {
-                Log.d(TAG, "ignoring user activity while turning off screen");
+                Slog.d(TAG, "ignoring user activity while turning off screen");
                 return;
             }
             // Disable proximity sensor if if user presses power key while we are in the
@@ -2044,7 +2051,7 @@
             return values[i];
         } catch (Exception e) {
             // guard against null pointer or index out of bounds errors
-            Log.e(TAG, "getAutoBrightnessValue", e);
+            Slog.e(TAG, "getAutoBrightnessValue", e);
             return 255;
         }
     }
@@ -2092,7 +2099,7 @@
 
     private void lightSensorChangedLocked(int value) {
         if (mDebugLightSensor) {
-            Log.d(TAG, "lightSensorChangedLocked " + value);
+            Slog.d(TAG, "lightSensorChangedLocked " + value);
         }
 
         // do not allow light sensor value to decrease
@@ -2121,9 +2128,9 @@
                 mLightSensorKeyboardBrightness = keyboardValue;
 
                 if (mDebugLightSensor) {
-                    Log.d(TAG, "lcdValue " + lcdValue);
-                    Log.d(TAG, "buttonValue " + buttonValue);
-                    Log.d(TAG, "keyboardValue " + keyboardValue);
+                    Slog.d(TAG, "lcdValue " + lcdValue);
+                    Slog.d(TAG, "buttonValue " + buttonValue);
+                    Slog.d(TAG, "keyboardValue " + keyboardValue);
                 }
 
                 boolean startAnimation = false;
@@ -2165,7 +2172,7 @@
                 }
                 if (startAnimation) {
                     if (mDebugLightSensor) {
-                        Log.i(TAG, "lightSensorChangedLocked scheduling light animator");
+                        Slog.i(TAG, "lightSensorChangedLocked scheduling light animator");
                     }
                     mHandler.removeCallbacks(mLightAnimator);
                     mHandler.post(mLightAnimator);
@@ -2214,16 +2221,16 @@
             try {
                 mSvc.shutdown();
             } catch (Exception e) {
-                Log.e(TAG, "MountService shutdown failed", e);
+                Slog.e(TAG, "MountService shutdown failed", e);
             }
         } else {
-            Log.w(TAG, "MountService unavailable for shutdown");
+            Slog.w(TAG, "MountService unavailable for shutdown");
         }
 
         try {
             Power.reboot(reason);
         } catch (IOException e) {
-            Log.e(TAG, "reboot failed", e);
+            Slog.e(TAG, "reboot failed", e);
         }
     }
 
@@ -2280,7 +2287,7 @@
     public void setKeyboardVisibility(boolean visible) {
         synchronized (mLocks) {
             if (mSpew) {
-                Log.d(TAG, "setKeyboardVisibility: " + visible);
+                Slog.d(TAG, "setKeyboardVisibility: " + visible);
             }
             if (mKeyboardVisible != visible) {
                 mKeyboardVisible = visible;
@@ -2309,7 +2316,7 @@
      */
     public void enableUserActivity(boolean enabled) {
         if (mSpew) {
-            Log.d(TAG, "enableUserActivity " + enabled);
+            Slog.d(TAG, "enableUserActivity " + enabled);
         }
         synchronized (mLocks) {
             mUserActivityAllowed = enabled;
@@ -2373,7 +2380,7 @@
             }
         }
         if (mSpew) {
-            Log.d(TAG, "setScreenOffTimeouts mKeylightDelay=" + mKeylightDelay
+            Slog.d(TAG, "setScreenOffTimeouts mKeylightDelay=" + mKeylightDelay
                     + " mDimDelay=" + mDimDelay + " mScreenOffDelay=" + mScreenOffDelay
                     + " mDimScreen=" + mDimScreen);
         }
@@ -2388,7 +2395,7 @@
                 mContext.getContentResolver(),
                 Settings.Secure.SHORT_KEYLIGHT_DELAY_MS,
                 SHORT_KEYLIGHT_DELAY_DEFAULT);
-        // Log.i(TAG, "updateSettingsValues(): mShortKeylightDelay now " + mShortKeylightDelay);
+        // Slog.i(TAG, "updateSettingsValues(): mShortKeylightDelay now " + mShortKeylightDelay);
     }
 
     private class LockList extends ArrayList<WakeLock>
@@ -2480,7 +2487,7 @@
         }
 
         synchronized (mLocks) {
-            Log.d(TAG, "system ready!");
+            Slog.d(TAG, "system ready!");
             mDoneBooting = true;
             long identity = Binder.clearCallingIdentity();
             try {
@@ -2495,7 +2502,7 @@
     }
 
     void bootCompleted() {
-        Log.d(TAG, "bootCompleted");
+        Slog.d(TAG, "bootCompleted");
         synchronized (mLocks) {
             mBootCompleted = true;
             userActivity(SystemClock.uptimeMillis(), false, BUTTON_EVENT, true);
@@ -2531,7 +2538,7 @@
         try {
             mBatteryStats.noteScreenBrightness(brightness);
         } catch (RemoteException e) {
-            Log.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);
+            Slog.w(TAG, "RemoteException calling noteScreenBrightness on BatteryStatsService", e);
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
@@ -2561,7 +2568,7 @@
 
     private void enableProximityLockLocked() {
         if (mDebugProximitySensor) {
-            Log.d(TAG, "enableProximityLockLocked");
+            Slog.d(TAG, "enableProximityLockLocked");
         }
         if (!mProximitySensorEnabled) {
             // clear calling identity so sensor manager battery stats are accurate
@@ -2578,7 +2585,7 @@
 
     private void disableProximityLockLocked() {
         if (mDebugProximitySensor) {
-            Log.d(TAG, "disableProximityLockLocked");
+            Slog.d(TAG, "disableProximityLockLocked");
         }
         if (mProximitySensorEnabled) {
             // clear calling identity so sensor manager battery stats are accurate
@@ -2602,10 +2609,10 @@
 
     private void proximityChangedLocked(boolean active) {
         if (mDebugProximitySensor) {
-            Log.d(TAG, "proximityChangedLocked, active: " + active);
+            Slog.d(TAG, "proximityChangedLocked, active: " + active);
         }
         if (!mProximitySensorEnabled) {
-            Log.d(TAG, "Ignoring proximity change after sensor is disabled");
+            Slog.d(TAG, "Ignoring proximity change after sensor is disabled");
             return;
         }
         if (active) {
@@ -2628,7 +2635,7 @@
 
     private void enableLightSensor(boolean enable) {
         if (mDebugLightSensor) {
-            Log.d(TAG, "enableLightSensor " + enable);
+            Slog.d(TAG, "enableLightSensor " + enable);
         }
         if (mSensorManager != null && mLightSensorEnabled != enable) {
             mLightSensorEnabled = enable;
@@ -2663,7 +2670,7 @@
                         distance < mProximitySensor.getMaximumRange());
 
                 if (mDebugProximitySensor) {
-                    Log.d(TAG, "mProximityListener.onSensorChanged active: " + active);
+                    Slog.d(TAG, "mProximityListener.onSensorChanged active: " + active);
                 }
                 if (timeSinceLastEvent < PROXIMITY_SENSOR_DELAY) {
                     // enforce delaying atleast PROXIMITY_SENSOR_DELAY before processing
@@ -2703,7 +2710,7 @@
                 int value = (int)event.values[0];
                 long milliseconds = SystemClock.elapsedRealtime();
                 if (mDebugLightSensor) {
-                    Log.d(TAG, "onSensorChanged: light value: " + value);
+                    Slog.d(TAG, "onSensorChanged: light value: " + value);
                 }
                 mHandler.removeCallbacks(mAutoBrightnessTask);
                 if (mLightSensorValue != value) {
diff --git a/services/java/com/android/server/ProcessStats.java b/services/java/com/android/server/ProcessStats.java
index ac3b723..a02c4e7 100644
--- a/services/java/com/android/server/ProcessStats.java
+++ b/services/java/com/android/server/ProcessStats.java
@@ -21,7 +21,7 @@
 import android.os.Process;
 import android.os.SystemClock;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -289,11 +289,11 @@
             mRelIdleTime = (int)(idletime - mBaseIdleTime);
 
             if (false) {
-                Log.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1]
+                Slog.i("Load", "Total U:" + sysCpu[0] + " N:" + sysCpu[1]
                       + " S:" + sysCpu[2] + " I:" + sysCpu[3]
                       + " W:" + sysCpu[4] + " Q:" + sysCpu[5]
                       + " O:" + sysCpu[6]);
-                Log.i("Load", "Rel U:" + mRelUserTime + " S:" + mRelSystemTime
+                Slog.i("Load", "Rel U:" + mRelUserTime + " S:" + mRelSystemTime
                       + " I:" + mRelIdleTime + " Q:" + mRelIrqTime);
             }
 
@@ -331,7 +331,7 @@
                 // Update an existing process...
                 st.added = false;
                 curStatsIndex++;
-                if (localLOGV) Log.v(TAG, "Existing pid " + pid + ": " + st);
+                if (localLOGV) Slog.v(TAG, "Existing pid " + pid + ": " + st);
 
                 final long[] procStats = mProcessStatsData;
                 if (!Process.readProcFile(st.statFile.toString(),
@@ -376,7 +376,7 @@
                 st.rel_majfaults = (int)(majfaults - st.base_majfaults);
                 st.base_minfaults = minfaults;
                 st.base_majfaults = majfaults;
-                //Log.i("Load", "Stats changed " + name + " pid=" + st.pid
+                //Slog.i("Load", "Stats changed " + name + " pid=" + st.pid
                 //      + " name=" + st.name + " utime=" + utime
                 //      + " stime=" + stime);
                 workingProcs.add(st);
@@ -389,7 +389,7 @@
                 allProcs.add(curStatsIndex, st);
                 curStatsIndex++;
                 NS++;
-                if (localLOGV) Log.v(TAG, "New pid " + pid + ": " + st);
+                if (localLOGV) Slog.v(TAG, "New pid " + pid + ": " + st);
 
                 final String[] procStatsString = mProcessFullStatsStringData;
                 final long[] procStats = mProcessFullStatsData;
@@ -419,7 +419,7 @@
                     }
                 }
                 
-                //Log.i("Load", "New process: " + st.pid + " " + st.name);
+                //Slog.i("Load", "New process: " + st.pid + " " + st.name);
                 st.rel_utime = 0;
                 st.rel_stime = 0;
                 st.rel_minfaults = 0;
@@ -440,7 +440,7 @@
             workingProcs.add(st);
             allProcs.remove(curStatsIndex);
             NS--;
-            if (localLOGV) Log.v(TAG, "Removed pid " + st.pid + ": " + st);
+            if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st);
             // Decrement the loop counter so that we process the current pid
             // again the next time through the loop.
             i--;
@@ -458,7 +458,7 @@
             workingProcs.add(st);
             allProcs.remove(curStatsIndex);
             NS--;
-            if (localLOGV) Log.v(TAG, "Removed pid " + st.pid + ": " + st);
+            if (localLOGV) Slog.v(TAG, "Removed pid " + st.pid + ": " + st);
         }
         
         return pids;
@@ -523,11 +523,11 @@
                     speed++;
                     if (speed == MAX_SPEEDS) break; // No more
                     if (localLOGV && out == null) {
-                        Log.v(TAG, "First time : Speed/Time = " + tempSpeeds[speed - 1]
+                        Slog.v(TAG, "First time : Speed/Time = " + tempSpeeds[speed - 1]
                               + "\t" + tempTimes[speed - 1]);
                     }
                 } catch (NumberFormatException nfe) {
-                    Log.i(TAG, "Unable to parse time_in_state");
+                    Slog.i(TAG, "Unable to parse time_in_state");
                 }
             }
         }
diff --git a/services/java/com/android/server/RandomBlock.java b/services/java/com/android/server/RandomBlock.java
index f7847ec..cc22bd9 100644
--- a/services/java/com/android/server/RandomBlock.java
+++ b/services/java/com/android/server/RandomBlock.java
@@ -16,7 +16,7 @@
 
 package com.android.server;
 
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.Closeable;
 import java.io.DataOutput;
@@ -39,7 +39,7 @@
     private RandomBlock() { }
 
     static RandomBlock fromFile(String filename) throws IOException {
-        if (DEBUG) Log.v(TAG, "reading from file " + filename);
+        if (DEBUG) Slog.v(TAG, "reading from file " + filename);
         InputStream stream = null;
         try {
             stream = new FileInputStream(filename);
@@ -63,7 +63,7 @@
     }
 
     void toFile(String filename) throws IOException {
-        if (DEBUG) Log.v(TAG, "writing to file " + filename);
+        if (DEBUG) Slog.v(TAG, "writing to file " + filename);
         RandomAccessFile out = null;
         try {
             out = new RandomAccessFile(filename, "rws");
@@ -95,7 +95,7 @@
             }
             c.close();
         } catch (IOException e) {
-            Log.w(TAG, "IOException thrown while closing Closeable", e);
+            Slog.w(TAG, "IOException thrown while closing Closeable", e);
         }
     }
 }
diff --git a/services/java/com/android/server/RecognitionManagerService.java b/services/java/com/android/server/RecognitionManagerService.java
index 7305b07..8e55512 100644
--- a/services/java/com/android/server/RecognitionManagerService.java
+++ b/services/java/com/android/server/RecognitionManagerService.java
@@ -28,7 +28,7 @@
 import android.provider.Settings;
 import android.speech.RecognitionService;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Slog;
 
 import java.util.List;
 
@@ -92,7 +92,7 @@
         int numAvailable = available.size();
     
         if (numAvailable == 0) {
-            Log.w(TAG, "no available voice recognition services found");
+            Slog.w(TAG, "no available voice recognition services found");
             return null;
         } else {
             if (prefPackage != null) {
@@ -104,7 +104,7 @@
                 }
             }
             if (numAvailable > 1) {
-                Log.w(TAG, "more than one voice recognition service found, picking first");
+                Slog.w(TAG, "more than one voice recognition service found, picking first");
             }
     
             ServiceInfo serviceInfo = available.get(0).serviceInfo;
diff --git a/services/java/com/android/server/SensorService.java b/services/java/com/android/server/SensorService.java
index 4dfeb9d..9f5718f 100644
--- a/services/java/com/android/server/SensorService.java
+++ b/services/java/com/android/server/SensorService.java
@@ -23,8 +23,12 @@
 import android.os.RemoteException;
 import android.os.IBinder;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
+import android.util.PrintWriterPrinter;
+import android.util.Printer;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 
 import com.android.internal.app.IBatteryStats;
@@ -43,6 +47,7 @@
     private static final boolean DEBUG = false;
     private static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV;
     private static final int SENSOR_DISABLE = -1;
+    private int mCurrentDelay = 0;
     
     /**
      * Battery statistics to be updated when sensors are enabled and disabled.
@@ -51,17 +56,19 @@
 
     private final class Listener implements IBinder.DeathRecipient {
         final IBinder mToken;
+        final int mUid;
 
         int mSensors = 0;
         int mDelay = 0x7FFFFFFF;
         
-        Listener(IBinder token) {
+        Listener(IBinder token, int uid) {
             mToken = token;
+            mUid = uid;
         }
         
         void addSensor(int sensor, int delay) {
             mSensors |= (1<<sensor);
-            if (mDelay > delay)
+            if (delay < mDelay)
             	mDelay = delay;
         }
         
@@ -74,7 +81,7 @@
         }
 
         public void binderDied() {
-            if (localLOGV) Log.d(TAG, "sensor listener died");
+            if (localLOGV) Slog.d(TAG, "sensor listener died");
             synchronized(mListeners) {
                 mListeners.remove(this);
                 mToken.unlinkToDeath(this, 0);
@@ -83,16 +90,20 @@
                 for (int sensor=0 ; sensor<32 && mSensors!=0 ; sensor++) {
                     if (hasSensor(sensor)) {
                         removeSensor(sensor);
+                        deactivateIfUnusedLocked(sensor);
                         try {
-                            deactivateIfUnusedLocked(sensor);
+                            mBatteryStats.noteStopSensor(mUid, sensor);
                         } catch (RemoteException e) {
-                            Log.w(TAG, "RemoteException in binderDied");
+                            // oops. not a big deal.
                         }
                     }
                 }
                 if (mListeners.size() == 0) {
                     _sensors_control_wake();
                     _sensors_control_close();
+                } else {
+                    // TODO: we should recalculate the delay, since removing
+                    // a listener may increase the overall rate.
                 }
                 mListeners.notify();
             }
@@ -101,7 +112,7 @@
 
     @SuppressWarnings("unused")
     public SensorService(Context context) {
-        if (localLOGV) Log.d(TAG, "SensorService startup");
+        if (localLOGV) Slog.d(TAG, "SensorService startup");
         _sensors_control_init();
     }
     
@@ -113,86 +124,151 @@
     }
 
     public boolean enableSensor(IBinder binder, String name, int sensor, int enable)
-             throws RemoteException {
-        if (localLOGV) Log.d(TAG, "enableSensor " + name + "(#" + sensor + ") " + enable);
+            throws RemoteException {
         
-        // Inform battery statistics service of status change
-        int uid = Binder.getCallingUid();
-        long identity = Binder.clearCallingIdentity();
-        if (enable == SENSOR_DISABLE) {
-            mBatteryStats.noteStopSensor(uid, sensor);
-        } else {
-            mBatteryStats.noteStartSensor(uid, sensor);
-        }
-        Binder.restoreCallingIdentity(identity);
+        if (localLOGV) Slog.d(TAG, "enableSensor " + name + "(#" + sensor + ") " + enable);
 
         if (binder == null) {
-            Log.w(TAG, "listener is null (sensor=" + name + ", id=" + sensor + ")");
+            Slog.e(TAG, "listener is null (sensor=" + name + ", id=" + sensor + ")");
             return false;
         }
 
+        if (enable < 0 && (enable != SENSOR_DISABLE)) {
+            Slog.e(TAG, "invalid enable parameter (enable=" + enable +
+                    ", sensor=" + name + ", id=" + sensor + ")");
+            return false;
+        }
+
+        boolean res;
+        int uid = Binder.getCallingUid();
         synchronized(mListeners) {
-            if (enable!=SENSOR_DISABLE && !_sensors_control_activate(sensor, true)) {
-                Log.w(TAG, "could not enable sensor " + sensor);
+            res = enableSensorInternalLocked(binder, uid, name, sensor, enable);
+            if (res == true) {
+                // Inform battery statistics service of status change
+                long identity = Binder.clearCallingIdentity();
+                if (enable == SENSOR_DISABLE) {
+                    mBatteryStats.noteStopSensor(uid, sensor);
+                } else {
+                    mBatteryStats.noteStartSensor(uid, sensor);
+                }
+                Binder.restoreCallingIdentity(identity);
+            }
+        }
+        return res;
+    }
+
+    private boolean enableSensorInternalLocked(IBinder binder, int uid,
+            String name, int sensor, int enable) throws RemoteException {
+
+        // check if we have this listener
+        Listener l = null;
+        for (Listener listener : mListeners) {
+            if (binder == listener.mToken) {
+                l = listener;
+                break;
+            }
+        }
+
+        if (enable != SENSOR_DISABLE) {
+            // Activate the requested sensor
+            if (_sensors_control_activate(sensor, true) == false) {
+                Slog.w(TAG, "could not enable sensor " + sensor);
                 return false;
             }
-                    
-            Listener l = null;
-            int minDelay = enable;
-            for (Listener listener : mListeners) {
-                if (binder == listener.mToken) {
-                    l = listener;
-                }
-                if (minDelay > listener.mDelay)
-                    minDelay = listener.mDelay;
-            }
-            
-            if (l == null && enable!=SENSOR_DISABLE) {
-                l = new Listener(binder);
+
+            if (l == null) {
+                /*
+                 * we don't have a listener for this binder yet, so
+                 * create a new one and add it to the list.
+                 */
+                l = new Listener(binder, uid);
                 binder.linkToDeath(l, 0);
                 mListeners.add(l);
                 mListeners.notify();
             }
-            
+
+            // take note that this sensor is now used by this client
+            l.addSensor(sensor, enable);
+
+        } else {
+
             if (l == null) {
-                // by construction, this means we're disabling a listener we
-                // don't know about...
-                Log.w(TAG, "listener with binder " + binder + 
-                        ", doesn't exist (sensor=" + name + ", id=" + sensor + ")");
+                /*
+                 *  This client isn't in the list, this usually happens
+                 *  when enabling the sensor failed, but the client
+                 *  didn't handle the error and later tries to shut that
+                 *  sensor off.
+                 */
+                Slog.w(TAG, "listener with binder " + binder +
+                        ", doesn't exist (sensor=" + name +
+                        ", id=" + sensor + ")");
                 return false;
             }
-            
-            if (minDelay >= 0) {
-                _sensors_control_set_delay(minDelay);
-            }
-            
-            if (enable != SENSOR_DISABLE) {
-                l.addSensor(sensor, enable);
-            } else {
-                l.removeSensor(sensor);
-                deactivateIfUnusedLocked(sensor);
-                if (l.mSensors == 0) {
-                    mListeners.remove(l);
-                    binder.unlinkToDeath(l, 0);
-                    mListeners.notify();
+
+            // remove this sensor from this client
+            l.removeSensor(sensor);
+
+            // see if we need to deactivate this sensors=
+            deactivateIfUnusedLocked(sensor);
+
+            // if the listener doesn't have any more sensors active
+            // we can get rid of it
+            if (l.mSensors == 0) {
+                // we won't need this death notification anymore
+                binder.unlinkToDeath(l, 0);
+                // remove the listener from the list
+                mListeners.remove(l);
+                // and if the list is empty, turn off the whole sensor h/w
+                if (mListeners.size() == 0) {
+                    _sensors_control_wake();
+                    _sensors_control_close();
                 }
+                mListeners.notify();
             }
-            
-            if (mListeners.size() == 0) {
-                _sensors_control_wake();
-                _sensors_control_close();
-            }
-        }        
+        }
+
+        // calculate and set the new delay
+        int minDelay = 0x7FFFFFFF;
+        for (Listener listener : mListeners) {
+            if (listener.mDelay < minDelay)
+                minDelay = listener.mDelay;
+        }
+        if (minDelay != 0x7FFFFFFF) {
+            mCurrentDelay = minDelay;
+            _sensors_control_set_delay(minDelay);
+        }
+
         return true;
     }
 
-    private void deactivateIfUnusedLocked(int sensor) throws RemoteException {
+    private void deactivateIfUnusedLocked(int sensor) {
         int size = mListeners.size();
         for (int i=0 ; i<size ; i++) {
-            if (mListeners.get(i).hasSensor(sensor))
+            if (mListeners.get(i).hasSensor(sensor)) {
+                // this sensor is still in use, don't turn it off
                 return;
+            }
         }
-        _sensors_control_activate(sensor, false);
+        if (_sensors_control_activate(sensor, false) == false) {
+            Slog.w(TAG, "could not disable sensor " + sensor);
+        }
+    }
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        synchronized (mListeners) {
+            Printer pr = new PrintWriterPrinter(pw);
+            int c = 0;
+            pr.println(mListeners.size() + " listener(s), delay=" + mCurrentDelay + " ms");
+            for (Listener l : mListeners) {
+                pr.println("listener[" + c + "] " +
+                        "sensors=0x" + Integer.toString(l.mSensors, 16) +
+                        ", uid=" + l.mUid +
+                        ", delay=" +
+                        l.mDelay + " ms");
+                c++;
+            }
+        }
     }
 
     private ArrayList<Listener> mListeners = new ArrayList<Listener>();
diff --git a/services/java/com/android/server/ShutdownActivity.java b/services/java/com/android/server/ShutdownActivity.java
index 7f0e90d..64b9c5d 100644
--- a/services/java/com/android/server/ShutdownActivity.java
+++ b/services/java/com/android/server/ShutdownActivity.java
@@ -21,7 +21,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
-import android.util.Log;
+import android.util.Slog;
 import com.android.internal.app.ShutdownThread;
 
 public class ShutdownActivity extends Activity {
@@ -34,7 +34,7 @@
         super.onCreate(savedInstanceState);
 
         mConfirm = getIntent().getBooleanExtra(Intent.EXTRA_KEY_CONFIRM, false);
-        Log.i(TAG, "onCreate(): confirm=" + mConfirm);
+        Slog.i(TAG, "onCreate(): confirm=" + mConfirm);
 
         Handler h = new Handler();
         h.post(new Runnable() {
diff --git a/services/java/com/android/server/SystemBackupAgent.java b/services/java/com/android/server/SystemBackupAgent.java
index 67abe55..186aebe 100644
--- a/services/java/com/android/server/SystemBackupAgent.java
+++ b/services/java/com/android/server/SystemBackupAgent.java
@@ -26,7 +26,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.ServiceManager;
 import android.os.SystemService;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.File;
 import java.io.IOException;
@@ -77,7 +77,7 @@
         } catch (IOException ex) {
             // If there was a failure, delete everything for the wallpaper, this is too aggresive,
             // but this is hopefully a rare failure.
-            Log.d(TAG, "restore failed", ex);
+            Slog.d(TAG, "restore failed", ex);
             (new File(WALLPAPER_IMAGE)).delete();
             (new File(WALLPAPER_INFO)).delete();
         }
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 1f46faf..deee7f3 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -42,7 +42,7 @@
 import android.server.BluetoothService;
 import android.server.search.SearchManagerService;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 import android.accounts.AccountManagerService;
 
 import java.io.File;
@@ -101,22 +101,22 @@
 
         // Critical services...
         try {
-            Log.i(TAG, "Entropy Service");
+            Slog.i(TAG, "Entropy Service");
             ServiceManager.addService("entropy", new EntropyService());
 
-            Log.i(TAG, "Power Manager");
+            Slog.i(TAG, "Power Manager");
             power = new PowerManagerService();
             ServiceManager.addService(Context.POWER_SERVICE, power);
 
-            Log.i(TAG, "Activity Manager");
+            Slog.i(TAG, "Activity Manager");
             context = ActivityManagerService.main(factoryTest);
 
-            Log.i(TAG, "Telephony Registry");
+            Slog.i(TAG, "Telephony Registry");
             ServiceManager.addService("telephony.registry", new TelephonyRegistry(context));
 
             AttributeCache.init(context);
 
-            Log.i(TAG, "Package Manager");
+            Slog.i(TAG, "Package Manager");
             pm = PackageManagerService.main(context,
                     factoryTest != SystemServer.FACTORY_TEST_OFF);
 
@@ -126,47 +126,47 @@
 
             // The AccountManager must come before the ContentService
             try {
-                Log.i(TAG, "Account Manager");
+                Slog.i(TAG, "Account Manager");
                 ServiceManager.addService(Context.ACCOUNT_SERVICE,
                         new AccountManagerService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Account Manager", e);
+                Slog.e(TAG, "Failure starting Account Manager", e);
             }
 
-            Log.i(TAG, "Content Manager");
+            Slog.i(TAG, "Content Manager");
             ContentService.main(context,
                     factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL);
 
-            Log.i(TAG, "System Content Providers");
+            Slog.i(TAG, "System Content Providers");
             ActivityManagerService.installSystemProviders();
 
-            Log.i(TAG, "Battery Service");
+            Slog.i(TAG, "Battery Service");
             battery = new BatteryService(context);
             ServiceManager.addService("battery", battery);
 
-            Log.i(TAG, "Lights Service");
+            Slog.i(TAG, "Lights Service");
             lights = new LightsService(context);
 
-            Log.i(TAG, "Vibrator Service");
+            Slog.i(TAG, "Vibrator Service");
             ServiceManager.addService("vibrator", new VibratorService(context));
 
             // only initialize the power service after we have started the
             // lights service, content providers and the battery service.
             power.init(context, lights, ActivityManagerService.getDefault(), battery);
 
-            Log.i(TAG, "Alarm Manager");
+            Slog.i(TAG, "Alarm Manager");
             AlarmManagerService alarm = new AlarmManagerService(context);
             ServiceManager.addService(Context.ALARM_SERVICE, alarm);
 
-            Log.i(TAG, "Init Watchdog");
+            Slog.i(TAG, "Init Watchdog");
             Watchdog.getInstance().init(context, battery, power, alarm,
                     ActivityManagerService.self());
 
             // Sensor Service is needed by Window Manager, so this goes first
-            Log.i(TAG, "Sensor Service");
+            Slog.i(TAG, "Sensor Service");
             ServiceManager.addService(Context.SENSOR_SERVICE, new SensorService(context));
 
-            Log.i(TAG, "Window Manager");
+            Slog.i(TAG, "Window Manager");
             wm = WindowManagerService.main(context, power,
                     factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL);
             ServiceManager.addService(Context.WINDOW_SERVICE, wm);
@@ -178,13 +178,13 @@
             // TODO: Use a more reliable check to see if this product should
             // support Bluetooth - see bug 988521
             if (SystemProperties.get("ro.kernel.qemu").equals("1")) {
-                Log.i(TAG, "Registering null Bluetooth Service (emulator)");
+                Slog.i(TAG, "Registering null Bluetooth Service (emulator)");
                 ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
             } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) {
-                Log.i(TAG, "Registering null Bluetooth Service (factory test)");
+                Slog.i(TAG, "Registering null Bluetooth Service (factory test)");
                 ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, null);
             } else {
-                Log.i(TAG, "Bluetooth Service");
+                Slog.i(TAG, "Bluetooth Service");
                 bluetooth = new BluetoothService(context);
                 ServiceManager.addService(BluetoothAdapter.BLUETOOTH_SERVICE, bluetooth);
                 bluetooth.initAfterRegistration();
@@ -200,7 +200,7 @@
             }
 
         } catch (RuntimeException e) {
-            Log.e("System", "Failure starting core service", e);
+            Slog.e("System", "Failure starting core service", e);
         }
 
         DevicePolicyManagerService devicePolicy = null;
@@ -213,66 +213,66 @@
 
         if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
             try {
-                Log.i(TAG, "Device Policy");
+                Slog.i(TAG, "Device Policy");
                 devicePolicy = new DevicePolicyManagerService(context);
                 ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, devicePolicy);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting DevicePolicyService", e);
+                Slog.e(TAG, "Failure starting DevicePolicyService", e);
             }
 
             try {
-                Log.i(TAG, "Status Bar");
+                Slog.i(TAG, "Status Bar");
                 statusBar = new StatusBarService(context);
                 ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting StatusBarService", e);
+                Slog.e(TAG, "Failure starting StatusBarService", e);
             }
 
             try {
-                Log.i(TAG, "Clipboard Service");
+                Slog.i(TAG, "Clipboard Service");
                 ServiceManager.addService(Context.CLIPBOARD_SERVICE,
                         new ClipboardService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Clipboard Service", e);
+                Slog.e(TAG, "Failure starting Clipboard Service", e);
             }
 
             try {
-                Log.i(TAG, "Input Method Service");
+                Slog.i(TAG, "Input Method Service");
                 imm = new InputMethodManagerService(context, statusBar);
                 ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Input Manager Service", e);
+                Slog.e(TAG, "Failure starting Input Manager Service", e);
             }
 
             try {
-                Log.i(TAG, "NetStat Service");
+                Slog.i(TAG, "NetStat Service");
                 ServiceManager.addService("netstat", new NetStatService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting NetStat Service", e);
+                Slog.e(TAG, "Failure starting NetStat Service", e);
             }
 
             try {
-                Log.i(TAG, "NetworkManagement Service");
+                Slog.i(TAG, "NetworkManagement Service");
                 ServiceManager.addService(
                         Context.NETWORKMANAGEMENT_SERVICE, new NetworkManagementService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting NetworkManagement Service", e);
+                Slog.e(TAG, "Failure starting NetworkManagement Service", e);
             }
 
             try {
-                Log.i(TAG, "Connectivity Service");
+                Slog.i(TAG, "Connectivity Service");
                 connectivity = ConnectivityService.getInstance(context);
                 ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Connectivity Service", e);
+                Slog.e(TAG, "Failure starting Connectivity Service", e);
             }
 
             try {
-              Log.i(TAG, "Accessibility Manager");
+              Slog.i(TAG, "Accessibility Manager");
               ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,
                       new AccessibilityManagerService(context));
             } catch (Throwable e) {
-              Log.e(TAG, "Failure starting Accessibility Manager", e);
+              Slog.e(TAG, "Failure starting Accessibility Manager", e);
             }
 
             try {
@@ -280,115 +280,115 @@
                  * NotificationManagerService is dependant on MountService,
                  * (for media / usb notifications) so we must start MountService first.
                  */
-                Log.i(TAG, "Mount Service");
+                Slog.i(TAG, "Mount Service");
                 ServiceManager.addService("mount", new MountService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Mount Service", e);
+                Slog.e(TAG, "Failure starting Mount Service", e);
             }
 
             try {
-                Log.i(TAG, "Notification Manager");
+                Slog.i(TAG, "Notification Manager");
                 notification = new NotificationManagerService(context, statusBar, lights);
                 ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Notification Manager", e);
+                Slog.e(TAG, "Failure starting Notification Manager", e);
             }
 
             try {
-                Log.i(TAG, "Device Storage Monitor");
+                Slog.i(TAG, "Device Storage Monitor");
                 ServiceManager.addService(DeviceStorageMonitorService.SERVICE,
                         new DeviceStorageMonitorService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting DeviceStorageMonitor service", e);
+                Slog.e(TAG, "Failure starting DeviceStorageMonitor service", e);
             }
 
             try {
-                Log.i(TAG, "Location Manager");
+                Slog.i(TAG, "Location Manager");
                 location = new LocationManagerService(context);
                 ServiceManager.addService(Context.LOCATION_SERVICE, location);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Location Manager", e);
+                Slog.e(TAG, "Failure starting Location Manager", e);
             }
 
             try {
-                Log.i(TAG, "Search Service");
+                Slog.i(TAG, "Search Service");
                 ServiceManager.addService(Context.SEARCH_SERVICE,
                         new SearchManagerService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Search Service", e);
+                Slog.e(TAG, "Failure starting Search Service", e);
             }
 
             if (INCLUDE_DEMO) {
-                Log.i(TAG, "Installing demo data...");
+                Slog.i(TAG, "Installing demo data...");
                 (new DemoThread(context)).start();
             }
 
             try {
-                Log.i(TAG, "DropBox Service");
+                Slog.i(TAG, "DropBox Service");
                 ServiceManager.addService(Context.DROPBOX_SERVICE,
                         new DropBoxManagerService(context, new File("/data/system/dropbox")));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting DropBoxManagerService", e);
+                Slog.e(TAG, "Failure starting DropBoxManagerService", e);
             }
 
             try {
-                Log.i(TAG, "Wallpaper Service");
+                Slog.i(TAG, "Wallpaper Service");
                 wallpaper = new WallpaperManagerService(context);
                 ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Wallpaper Service", e);
+                Slog.e(TAG, "Failure starting Wallpaper Service", e);
             }
 
             try {
-                Log.i(TAG, "Audio Service");
+                Slog.i(TAG, "Audio Service");
                 ServiceManager.addService(Context.AUDIO_SERVICE, new AudioService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Audio Service", e);
+                Slog.e(TAG, "Failure starting Audio Service", e);
             }
 
             try {
-                Log.i(TAG, "Headset Observer");
+                Slog.i(TAG, "Headset Observer");
                 // Listen for wired headset changes
                 headset = new HeadsetObserver(context);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting HeadsetObserver", e);
+                Slog.e(TAG, "Failure starting HeadsetObserver", e);
             }
 
             try {
-                Log.i(TAG, "Dock Observer");
+                Slog.i(TAG, "Dock Observer");
                 // Listen for dock station changes
                 dock = new DockObserver(context, power);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting DockObserver", e);
+                Slog.e(TAG, "Failure starting DockObserver", e);
             }
 
             try {
-                Log.i(TAG, "Backup Service");
+                Slog.i(TAG, "Backup Service");
                 ServiceManager.addService(Context.BACKUP_SERVICE,
                         new BackupManagerService(context));
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Backup Service", e);
+                Slog.e(TAG, "Failure starting Backup Service", e);
             }
 
             try {
-                Log.i(TAG, "AppWidget Service");
+                Slog.i(TAG, "AppWidget Service");
                 appWidget = new AppWidgetService(context);
                 ServiceManager.addService(Context.APPWIDGET_SERVICE, appWidget);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting AppWidget Service", e);
+                Slog.e(TAG, "Failure starting AppWidget Service", e);
             }
 
             try {
-                Log.i(TAG, "Recognition Service");
+                Slog.i(TAG, "Recognition Service");
                 recognition = new RecognitionManagerService(context);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure starting Recognition Service", e);
+                Slog.e(TAG, "Failure starting Recognition Service", e);
             }
 
             try {
                 com.android.server.status.StatusBarPolicy.installIcons(context, statusBar);
             } catch (Throwable e) {
-                Log.e(TAG, "Failure installing status bar icons", e);
+                Slog.e(TAG, "Failure installing status bar icons", e);
             }
         }
 
@@ -455,7 +455,7 @@
         ((ActivityManagerService)ActivityManagerNative.getDefault())
                 .systemReady(new Runnable() {
             public void run() {
-                Log.i(TAG, "Making services ready");
+                Slog.i(TAG, "Making services ready");
 
                 if (batteryF != null) batteryF.systemReady();
                 if (connectivityF != null) connectivityF.systemReady();
@@ -474,7 +474,7 @@
         });
 
         Looper.loop();
-        Log.d(TAG, "System ServerThread is exiting!");
+        Slog.d(TAG, "System ServerThread is exiting!");
     }
 }
 
@@ -499,7 +499,7 @@
                 dataset.add(mContext);
             }
         } catch (Throwable e) {
-            Log.e("SystemServer", "Failure installing demo data", e);
+            Slog.e("SystemServer", "Failure installing demo data", e);
         }
 
     }
@@ -546,7 +546,7 @@
     }
 
     public static final void init2() {
-        Log.i(TAG, "Entered the Android system server!");
+        Slog.i(TAG, "Entered the Android system server!");
         Thread thr = new ServerThread();
         thr.setName("android.server.ServerThread");
         thr.start();
diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java
index 3bee40c..664dfa5 100644
--- a/services/java/com/android/server/TelephonyRegistry.java
+++ b/services/java/com/android/server/TelephonyRegistry.java
@@ -29,7 +29,7 @@
 import android.telephony.SignalStrength;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Slog;
 
 import java.util.ArrayList;
 import java.io.FileDescriptor;
@@ -124,7 +124,7 @@
 
     public void listen(String pkgForDebug, IPhoneStateListener callback, int events,
             boolean notifyNow) {
-        // Log.d(TAG, "listen pkg=" + pkgForDebug + " events=0x" +
+        // Slog.d(TAG, "listen pkg=" + pkgForDebug + " events=0x" +
         // Integer.toHexString(events));
         if (events != 0) {
             /* Checks permission and throws Security exception */
@@ -575,7 +575,7 @@
         }
         String msg = "Modify Phone State Permission Denial: " + method + " from pid="
                 + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid();
-        Log.w(TAG, msg);
+        Slog.w(TAG, msg);
         return false;
     }
 
diff --git a/services/java/com/android/server/VibratorService.java b/services/java/com/android/server/VibratorService.java
index 5282ba2..2e7e3e1 100755
--- a/services/java/com/android/server/VibratorService.java
+++ b/services/java/com/android/server/VibratorService.java
@@ -29,7 +29,7 @@
 import android.os.IBinder;
 import android.os.Binder;
 import android.os.SystemClock;
-import android.util.Log;
+import android.util.Slog;
 
 import java.util.LinkedList;
 import java.util.ListIterator;
@@ -155,7 +155,7 @@
                 for (int i=0; i<N; i++) {
                     s += " " + pattern[i];
                 }
-                Log.i(TAG, "vibrating with pattern: " + s);
+                Slog.i(TAG, "vibrating with pattern: " + s);
             }
 
             // we're running in the server so we can't fail
diff --git a/services/java/com/android/server/ViewServer.java b/services/java/com/android/server/ViewServer.java
index e9a1951..ae00438 100644
--- a/services/java/com/android/server/ViewServer.java
+++ b/services/java/com/android/server/ViewServer.java
@@ -16,7 +16,7 @@
 
 package com.android.server;
 
-import android.util.Log;
+import android.util.Slog;
 
 import java.net.ServerSocket;
 import java.net.Socket;
@@ -129,7 +129,7 @@
                 mServer = null;
                 return true;
             } catch (IOException e) {
-                Log.w(LOG_TAG, "Could not close the view server");
+                Slog.w(LOG_TAG, "Could not close the view server");
             }
         }
         return false;
@@ -191,7 +191,7 @@
                     }
 
                     if (!result) {
-                        Log.w(LOG_TAG, "An error occured with the command: " + command);
+                        Slog.w(LOG_TAG, "An error occured with the command: " + command);
                     }
                 } finally {
                     if (in != null) {
@@ -199,7 +199,7 @@
                     }
                 }
             } catch (Exception e) {
-                Log.w(LOG_TAG, "Connection error: ", e);
+                Slog.w(LOG_TAG, "Connection error: ", e);
             } finally {
                 if (client != null) {
                     try {
diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java
index aebb0ff..7a03ebd 100644
--- a/services/java/com/android/server/WallpaperManagerService.java
+++ b/services/java/com/android/server/WallpaperManagerService.java
@@ -46,7 +46,7 @@
 import android.service.wallpaper.IWallpaperEngine;
 import android.service.wallpaper.IWallpaperService;
 import android.service.wallpaper.WallpaperService;
-import android.util.Log;
+import android.util.Slog;
 import android.util.Xml;
 import android.view.IWindowManager;
 import android.view.WindowManager;
@@ -187,10 +187,10 @@
                 mService = null;
                 mEngine = null;
                 if (mWallpaperConnection == this) {
-                    Log.w(TAG, "Wallpaper service gone: " + mWallpaperComponent);
+                    Slog.w(TAG, "Wallpaper service gone: " + mWallpaperComponent);
                     if (!mWallpaperUpdating && (mLastDiedTime+MIN_WALLPAPER_CRASH_TIME)
                                 > SystemClock.uptimeMillis()) {
-                        Log.w(TAG, "Reverting to built-in wallpaper!");
+                        Slog.w(TAG, "Reverting to built-in wallpaper!");
                         bindWallpaperComponentLocked(null);
                     }
                 }
@@ -254,7 +254,7 @@
                             || change == PACKAGE_TEMPORARY_CHANGE) {
                         changed = true;
                         if (doit) {
-                            Log.w(TAG, "Wallpaper uninstalled, removing: " + mWallpaperComponent);
+                            Slog.w(TAG, "Wallpaper uninstalled, removing: " + mWallpaperComponent);
                             clearWallpaperLocked();
                         }
                     }
@@ -272,7 +272,7 @@
                         mContext.getPackageManager().getServiceInfo(
                                 mWallpaperComponent, 0);
                     } catch (NameNotFoundException e) {
-                        Log.w(TAG, "Wallpaper component gone, removing: " + mWallpaperComponent);
+                        Slog.w(TAG, "Wallpaper component gone, removing: " + mWallpaperComponent);
                         clearWallpaperLocked();
                     }
                 }
@@ -291,7 +291,7 @@
     }
     
     public WallpaperManagerService(Context context) {
-        if (DEBUG) Log.v(TAG, "WallpaperService startup");
+        if (DEBUG) Slog.v(TAG, "WallpaperService startup");
         mContext = context;
         mIWindowManager = IWindowManager.Stub.asInterface(
                 ServiceManager.getService(Context.WINDOW_SERVICE));
@@ -309,16 +309,16 @@
     }
     
     public void systemReady() {
-        if (DEBUG) Log.v(TAG, "systemReady");
+        if (DEBUG) Slog.v(TAG, "systemReady");
         synchronized (mLock) {
             try {
                 bindWallpaperComponentLocked(mNextWallpaperComponent);
             } catch (RuntimeException e) {
-                Log.w(TAG, "Failure starting previous wallpaper", e);
+                Slog.w(TAG, "Failure starting previous wallpaper", e);
                 try {
                     bindWallpaperComponentLocked(null);
                 } catch (RuntimeException e2) {
-                    Log.w(TAG, "Failure starting default wallpaper", e2);
+                    Slog.w(TAG, "Failure starting default wallpaper", e2);
                     clearWallpaperComponentLocked();
                 }
             }
@@ -326,7 +326,7 @@
     }
     
     public void clearWallpaper() {
-        if (DEBUG) Log.v(TAG, "clearWallpaper");
+        if (DEBUG) Slog.v(TAG, "clearWallpaper");
         synchronized (mLock) {
             clearWallpaperLocked();
         }
@@ -399,7 +399,7 @@
                 return ParcelFileDescriptor.open(f, MODE_READ_ONLY);
             } catch (FileNotFoundException e) {
                 /* Shouldn't happen as we check to see if the file exists */
-                Log.w(TAG, "Error getting wallpaper", e);
+                Slog.w(TAG, "Error getting wallpaper", e);
             }
             return null;
         }
@@ -415,7 +415,7 @@
     }
     
     public ParcelFileDescriptor setWallpaper(String name) {
-        if (DEBUG) Log.v(TAG, "setWallpaper");
+        if (DEBUG) Slog.v(TAG, "setWallpaper");
         
         checkPermission(android.Manifest.permission.SET_WALLPAPER);
         synchronized (mLock) {
@@ -442,13 +442,13 @@
             mName = name;
             return fd;
         } catch (FileNotFoundException e) {
-            Log.w(TAG, "Error setting wallpaper", e);
+            Slog.w(TAG, "Error setting wallpaper", e);
         }
         return null;
     }
 
     public void setWallpaperComponent(ComponentName name) {
-        if (DEBUG) Log.v(TAG, "setWallpaperComponent name=" + name);
+        if (DEBUG) Slog.v(TAG, "setWallpaperComponent name=" + name);
         checkPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT);
         synchronized (mLock) {
             final long ident = Binder.clearCallingIdentity();
@@ -461,19 +461,19 @@
     }
     
     void bindWallpaperComponentLocked(ComponentName componentName) {
-        if (DEBUG) Log.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
+        if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName);
         
         // Has the component changed?
         if (mWallpaperConnection != null) {
             if (mWallpaperComponent == null) {
                 if (componentName == null) {
-                    if (DEBUG) Log.v(TAG, "bindWallpaperComponentLocked: still using default");
+                    if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: still using default");
                     // Still using default wallpaper.
                     return;
                 }
             } else if (mWallpaperComponent.equals(componentName)) {
                 // Changing to same wallpaper.
-                if (DEBUG) Log.v(TAG, "same wallpaper");
+                if (DEBUG) Slog.v(TAG, "same wallpaper");
                 return;
             }
         }
@@ -485,14 +485,14 @@
                 if (defaultComponent != null) {
                     // See if there is a default wallpaper component specified
                     componentName = ComponentName.unflattenFromString(defaultComponent);
-                    if (DEBUG) Log.v(TAG, "Use default component wallpaper:" + componentName);
+                    if (DEBUG) Slog.v(TAG, "Use default component wallpaper:" + componentName);
                 }
                 if (componentName == null) {
                     // Fall back to static image wallpaper
                     componentName = mImageWallpaperComponent;
                     //clearWallpaperComponentLocked();
                     //return;
-                    if (DEBUG) Log.v(TAG, "Using image wallpaper");
+                    if (DEBUG) Slog.v(TAG, "Using image wallpaper");
                 }
             }
             ServiceInfo si = mContext.getPackageManager().getServiceInfo(componentName,
@@ -531,7 +531,7 @@
             }
             
             // Bind the service!
-            if (DEBUG) Log.v(TAG, "Binding to:" + componentName);
+            if (DEBUG) Slog.v(TAG, "Binding to:" + componentName);
             WallpaperConnection newConn = new WallpaperConnection(wi);
             intent.setComponent(componentName);
             intent.putExtra(Intent.EXTRA_CLIENT_LABEL,
@@ -552,7 +552,7 @@
             mWallpaperConnection = newConn;
             mLastDiedTime = SystemClock.uptimeMillis();
             try {
-                if (DEBUG) Log.v(TAG, "Adding window token: " + newConn.mToken);
+                if (DEBUG) Slog.v(TAG, "Adding window token: " + newConn.mToken);
                 mIWindowManager.addWindowToken(newConn.mToken,
                         WindowManager.LayoutParams.TYPE_WALLPAPER);
             } catch (RemoteException e) {
@@ -574,7 +574,7 @@
             }
             mContext.unbindService(mWallpaperConnection);
             try {
-                if (DEBUG) Log.v(TAG, "Removing window token: "
+                if (DEBUG) Slog.v(TAG, "Removing window token: "
                         + mWallpaperConnection.mToken);
                 mIWindowManager.removeWindowToken(mWallpaperConnection.mToken);
             } catch (RemoteException e) {
@@ -589,7 +589,7 @@
                     WindowManager.LayoutParams.TYPE_WALLPAPER, false,
                     mWidth, mHeight);
         } catch (RemoteException e) {
-            Log.w(TAG, "Failed attaching wallpaper; clearing", e);
+            Slog.w(TAG, "Failed attaching wallpaper; clearing", e);
             if (!mWallpaperUpdating) {
                 bindWallpaperComponentLocked(null);
             }
@@ -659,7 +659,7 @@
     }
 
     private void loadSettingsLocked() {
-        if (DEBUG) Log.v(TAG, "loadSettingsLocked");
+        if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
         
         JournaledFile journal = makeJournaledFile();
         FileInputStream stream = null;
@@ -685,25 +685,25 @@
                                 : null;
                           
                         if (DEBUG) {
-                            Log.v(TAG, "mWidth:" + mWidth);
-                            Log.v(TAG, "mHeight:" + mHeight);
-                            Log.v(TAG, "mName:" + mName);
-                            Log.v(TAG, "mNextWallpaperComponent:" + mNextWallpaperComponent);
+                            Slog.v(TAG, "mWidth:" + mWidth);
+                            Slog.v(TAG, "mHeight:" + mHeight);
+                            Slog.v(TAG, "mName:" + mName);
+                            Slog.v(TAG, "mNextWallpaperComponent:" + mNextWallpaperComponent);
                         }
                     }
                 }
             } while (type != XmlPullParser.END_DOCUMENT);
             success = true;
         } catch (NullPointerException e) {
-            Log.w(TAG, "failed parsing " + file + " " + e);
+            Slog.w(TAG, "failed parsing " + file + " " + e);
         } catch (NumberFormatException e) {
-            Log.w(TAG, "failed parsing " + file + " " + e);
+            Slog.w(TAG, "failed parsing " + file + " " + e);
         } catch (XmlPullParserException e) {
-            Log.w(TAG, "failed parsing " + file + " " + e);
+            Slog.w(TAG, "failed parsing " + file + " " + e);
         } catch (IOException e) {
-            Log.w(TAG, "failed parsing " + file + " " + e);
+            Slog.w(TAG, "failed parsing " + file + " " + e);
         } catch (IndexOutOfBoundsException e) {
-            Log.w(TAG, "failed parsing " + file + " " + e);
+            Slog.w(TAG, "failed parsing " + file + " " + e);
         }
         try {
             if (stream != null) {
@@ -721,7 +721,7 @@
     }
 
     void settingsRestored() {
-        if (DEBUG) Log.v(TAG, "settingsRestored");
+        if (DEBUG) Slog.v(TAG, "settingsRestored");
         
         boolean success = false;
         synchronized (mLock) {
@@ -741,13 +741,13 @@
                 // If there's a wallpaper name, we use that.  If that can't be loaded, then we
                 // use the default.
                 if ("".equals(mName)) {
-                    if (DEBUG) Log.v(TAG, "settingsRestored: name is empty");
+                    if (DEBUG) Slog.v(TAG, "settingsRestored: name is empty");
                     success = true;
                 } else {
-                    if (DEBUG) Log.v(TAG, "settingsRestored: attempting to restore named resource");
+                    if (DEBUG) Slog.v(TAG, "settingsRestored: attempting to restore named resource");
                     success = restoreNamedResourceLocked();
                 }
-                if (DEBUG) Log.v(TAG, "settingsRestored: success=" + success);
+                if (DEBUG) Slog.v(TAG, "settingsRestored: success=" + success);
                 if (success) {
                     bindWallpaperComponentLocked(mImageWallpaperComponent);
                 }
@@ -755,7 +755,7 @@
         }
 
         if (!success) {
-            Log.e(TAG, "Failed to restore wallpaper: '" + mName + "'");
+            Slog.e(TAG, "Failed to restore wallpaper: '" + mName + "'");
             mName = "";
             WALLPAPER_FILE.delete();
         }
@@ -792,7 +792,7 @@
                     Resources r = c.getResources();
                     resId = r.getIdentifier(resName, null, null);
                     if (resId == 0) {
-                        Log.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
+                        Slog.e(TAG, "couldn't resolve identifier pkg=" + pkg + " type=" + type
                                 + " ident=" + ident);
                         return false;
                     }
@@ -807,14 +807,14 @@
                     }
                     // mWallpaperObserver will notice the close and send the change broadcast
 
-                    Log.v(TAG, "Restored wallpaper: " + resName);
+                    Slog.v(TAG, "Restored wallpaper: " + resName);
                     return true;
                 } catch (NameNotFoundException e) {
-                    Log.e(TAG, "Package name " + pkg + " not found");
+                    Slog.e(TAG, "Package name " + pkg + " not found");
                 } catch (Resources.NotFoundException e) {
-                    Log.e(TAG, "Resource not found: " + resId);
+                    Slog.e(TAG, "Resource not found: " + resId);
                 } catch (IOException e) {
-                    Log.e(TAG, "IOException while restoring wallpaper ", e);
+                    Slog.e(TAG, "IOException while restoring wallpaper ", e);
                 } finally {
                     if (res != null) {
                         try {
diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java
index a6bfd99..ee69715 100644
--- a/services/java/com/android/server/Watchdog.java
+++ b/services/java/com/android/server/Watchdog.java
@@ -34,7 +34,7 @@
 import android.provider.Settings;
 import android.util.Config;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -229,7 +229,7 @@
                         // During the last pass we collected pss information, so
                         // now it is time to report it.
                         mHaveGlobalPss = false;
-                        if (localLOGV) Log.v(TAG, "Received global pss, logging.");
+                        if (localLOGV) Slog.v(TAG, "Received global pss, logging.");
                         logGlobalMemory();
                     }
                 } break;
@@ -239,7 +239,7 @@
                         // During the last pass we collected pss information, so
                         // now it is time to report it.
                         mHavePss = false;
-                        if (localLOGV) Log.v(TAG, "Have pss, checking memory.");
+                        if (localLOGV) Slog.v(TAG, "Have pss, checking memory.");
                         checkMemory();
                     }
 
@@ -247,7 +247,7 @@
                         // During the last pass we collected pss information, so
                         // now it is time to report it.
                         mHaveGlobalPss = false;
-                        if (localLOGV) Log.v(TAG, "Have global pss, logging.");
+                        if (localLOGV) Slog.v(TAG, "Have global pss, logging.");
                         logGlobalMemory();
                     }
 
@@ -275,7 +275,7 @@
                         // things simple, we will assume that everyone has
                         // reported back by the next MONITOR message.
                         mLastMemCheckTime = now;
-                        if (localLOGV) Log.v(TAG, "Collecting memory usage.");
+                        if (localLOGV) Slog.v(TAG, "Collecting memory usage.");
                         collectMemory();
                         mHavePss = true;
 
@@ -285,7 +285,7 @@
                         long realtimeNow = SystemClock.elapsedRealtime();
                         if ((mLastMemCheckRealtime+memCheckRealtimeInterval) < realtimeNow) {
                             mLastMemCheckRealtime = realtimeNow;
-                            if (localLOGV) Log.v(TAG, "Collecting global memory usage.");
+                            if (localLOGV) Slog.v(TAG, "Collecting global memory usage.");
                             collectGlobalMemory();
                             mHaveGlobalPss = true;
                         }
@@ -315,7 +315,7 @@
     final class CheckupReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context c, Intent intent) {
-            if (localLOGV) Log.v(TAG, "Alarm went off, checking memory.");
+            if (localLOGV) Slog.v(TAG, "Alarm went off, checking memory.");
             checkMemory();
         }
     }
@@ -323,7 +323,7 @@
     final class RebootReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context c, Intent intent) {
-            if (localLOGV) Log.v(TAG, "Alarm went off, checking reboot.");
+            if (localLOGV) Slog.v(TAG, "Alarm went off, checking reboot.");
             checkReboot(true);
         }
     }
@@ -494,7 +494,7 @@
                 if (mPhoneMemMonitor.checkLocked(curTime, mPhonePid,
                         mPhonePss)) {
                     // Just kill the phone process and let it restart.
-                    Log.i(TAG, "Watchdog is killing the phone process");
+                    Slog.i(TAG, "Watchdog is killing the phone process");
                     Process.killProcess(mPhonePid);
                 }
             } else {
@@ -511,25 +511,25 @@
                 } else if (nextTime >= mMemcheckExecEndTime){
                     // Need to check during next exec time...  so that needs
                     // to be computed.
-                    if (localLOGV) Log.v(TAG, "Computing next time range");
+                    if (localLOGV) Slog.v(TAG, "Computing next time range");
                     computeMemcheckTimesLocked(nextTime);
                     nextTime = mMemcheckExecStartTime;
                 }
 
                 if (localLOGV) {
                     mCalendar.setTimeInMillis(nextTime);
-                    Log.v(TAG, "Next Alarm Time: " + mCalendar);
+                    Slog.v(TAG, "Next Alarm Time: " + mCalendar);
                 }
             }
         }
 
         if (needScheduledCheck) {
-            if (localLOGV) Log.v(TAG, "Scheduling next memcheck alarm for "
+            if (localLOGV) Slog.v(TAG, "Scheduling next memcheck alarm for "
                     + ((nextTime-curTime)/1000/60) + "m from now");
             mAlarm.remove(mCheckupIntent);
             mAlarm.set(AlarmManager.RTC_WAKEUP, nextTime, mCheckupIntent);
         } else {
-            if (localLOGV) Log.v(TAG, "No need to schedule a memcheck alarm!");
+            if (localLOGV) Slog.v(TAG, "No need to schedule a memcheck alarm!");
             mAlarm.remove(mCheckupIntent);
         }
     }
@@ -592,7 +592,7 @@
         mRebootInterval = rebootInterval;
         if (rebootInterval <= 0) {
             // No reboot interval requested.
-            if (localLOGV) Log.v(TAG, "No need to schedule a reboot alarm!");
+            if (localLOGV) Slog.v(TAG, "No need to schedule a reboot alarm!");
             mAlarm.remove(mRebootIntent);
             return;
         }
@@ -663,7 +663,7 @@
             }
         }
 
-        if (localLOGV) Log.v(TAG, "Scheduling next reboot alarm for "
+        if (localLOGV) Slog.v(TAG, "Scheduling next reboot alarm for "
                 + ((realStartTime-now)/1000/60) + "m from now");
         mAlarm.remove(mRebootIntent);
         mAlarm.set(AlarmManager.RTC_WAKEUP, realStartTime, mRebootIntent);
@@ -673,11 +673,11 @@
      * Perform a full reboot of the system.
      */
     void rebootSystem(String reason) {
-        Log.i(TAG, "Rebooting system because: " + reason);
+        Slog.i(TAG, "Rebooting system because: " + reason);
         try {
             android.os.Power.reboot(reason);
         } catch (IOException e) {
-            Log.e(TAG, "Reboot failed!", e);
+            Slog.e(TAG, "Reboot failed!", e);
         }
     }
 
@@ -757,11 +757,11 @@
 
         if (localLOGV) {
             mCalendar.setTimeInMillis(curTime);
-            Log.v(TAG, "Current Time: " + mCalendar);
+            Slog.v(TAG, "Current Time: " + mCalendar);
             mCalendar.setTimeInMillis(mMemcheckExecStartTime);
-            Log.v(TAG, "Start Check Time: " + mCalendar);
+            Slog.v(TAG, "Start Check Time: " + mCalendar);
             mCalendar.setTimeInMillis(mMemcheckExecEndTime);
-            Log.v(TAG, "End Check Time: " + mCalendar);
+            Slog.v(TAG, "End Check Time: " + mCalendar);
         }
     }
 
@@ -810,7 +810,7 @@
                     } catch (InterruptedException e) {
                         if (SystemProperties.getBoolean("ro.secure", false)) {
                             // If this is a secure build, just log the error.
-                            Log.e("WatchDog", "Woof! Woof! Interrupter!");
+                            Slog.e("WatchDog", "Woof! Woof! Interrupter!");
                         } else {
                             throw new AssertionError("Someone interrupted the watchdog");
                         }
@@ -839,7 +839,7 @@
 
             // Only kill the process if the debugger is not attached.
             if (!Debug.isDebuggerConnected()) {
-                Log.i(TAG, "Watchdog is killing the system process");
+                Slog.i(TAG, "Watchdog is killing the system process");
                 Process.killProcess(Process.myPid());
             }
         }
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 60cf5a2..1455973 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -54,7 +54,7 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
-import android.util.Log;
+import android.util.Slog;
 import android.text.TextUtils;
 
 import java.util.ArrayList;
@@ -218,7 +218,7 @@
                 }
         );
 
-        Log.i(TAG, "WifiService starting up with Wi-Fi " +
+        Slog.i(TAG, "WifiService starting up with Wi-Fi " +
                 (wifiEnabled ? "enabled" : "disabled"));
 
         mContext.registerReceiver(
@@ -346,13 +346,13 @@
         if (enable) {
             synchronized (mWifiStateTracker) {
                 if (!WifiNative.loadDriver()) {
-                    Log.e(TAG, "Failed to load Wi-Fi driver.");
+                    Slog.e(TAG, "Failed to load Wi-Fi driver.");
                     setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
                     return false;
                 }
                 if (!WifiNative.startSupplicant()) {
                     WifiNative.unloadDriver();
-                    Log.e(TAG, "Failed to start supplicant daemon.");
+                    Slog.e(TAG, "Failed to start supplicant daemon.");
                     setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
                     return false;
                 }
@@ -368,7 +368,7 @@
             boolean failedToStopSupplicantOrUnloadDriver = false;
             synchronized (mWifiStateTracker) {
                 if (!WifiNative.stopSupplicant()) {
-                    Log.e(TAG, "Failed to stop supplicant daemon.");
+                    Slog.e(TAG, "Failed to stop supplicant daemon.");
                     setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
                     failedToStopSupplicantOrUnloadDriver = true;
                 }
@@ -380,7 +380,7 @@
                 mWifiStateTracker.resetConnections(true);
 
                 if (!WifiNative.unloadDriver()) {
-                    Log.e(TAG, "Failed to unload Wi-Fi driver.");
+                    Slog.e(TAG, "Failed to unload Wi-Fi driver.");
                     if (!failedToStopSupplicantOrUnloadDriver) {
                         setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);
                         failedToStopSupplicantOrUnloadDriver = true;
@@ -732,7 +732,7 @@
                 netId = WifiNative.addNetworkCommand();
                 if (netId < 0) {
                     if (DBG) {
-                        Log.d(TAG, "Failed to add a network!");
+                        Slog.d(TAG, "Failed to add a network!");
                     }
                     return -1;
                 }
@@ -763,7 +763,7 @@
                         WifiConfiguration.ssidVarName,
                         convertToQuotedString(config.SSID))) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set SSID: "+config.SSID);
+                    Slog.d(TAG, "failed to set SSID: "+config.SSID);
                 }
                 break setVariables;
             }
@@ -774,7 +774,7 @@
                         WifiConfiguration.bssidVarName,
                         config.BSSID)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set BSSID: "+config.BSSID);
+                    Slog.d(TAG, "failed to set BSSID: "+config.BSSID);
                 }
                 break setVariables;
             }
@@ -787,7 +787,7 @@
                         WifiConfiguration.KeyMgmt.varName,
                         allowedKeyManagementString)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set key_mgmt: "+
+                    Slog.d(TAG, "failed to set key_mgmt: "+
                             allowedKeyManagementString);
                 }
                 break setVariables;
@@ -801,7 +801,7 @@
                         WifiConfiguration.Protocol.varName,
                         allowedProtocolsString)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set proto: "+
+                    Slog.d(TAG, "failed to set proto: "+
                             allowedProtocolsString);
                 }
                 break setVariables;
@@ -815,7 +815,7 @@
                         WifiConfiguration.AuthAlgorithm.varName,
                         allowedAuthAlgorithmsString)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set auth_alg: "+
+                    Slog.d(TAG, "failed to set auth_alg: "+
                             allowedAuthAlgorithmsString);
                 }
                 break setVariables;
@@ -829,7 +829,7 @@
                         WifiConfiguration.PairwiseCipher.varName,
                         allowedPairwiseCiphersString)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set pairwise: "+
+                    Slog.d(TAG, "failed to set pairwise: "+
                             allowedPairwiseCiphersString);
                 }
                 break setVariables;
@@ -843,7 +843,7 @@
                         WifiConfiguration.GroupCipher.varName,
                         allowedGroupCiphersString)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set group: "+
+                    Slog.d(TAG, "failed to set group: "+
                             allowedGroupCiphersString);
                 }
                 break setVariables;
@@ -857,7 +857,7 @@
                         WifiConfiguration.pskVarName,
                         config.preSharedKey)) {
                 if (DBG) {
-                    Log.d(TAG, "failed to set psk: "+config.preSharedKey);
+                    Slog.d(TAG, "failed to set psk: "+config.preSharedKey);
                 }
                 break setVariables;
             }
@@ -873,7 +873,7 @@
                                     WifiConfiguration.wepKeyVarNames[i],
                                     config.wepKeys[i])) {
                             if (DBG) {
-                                Log.d(TAG,
+                                Slog.d(TAG,
                                         "failed to set wep_key"+i+": " +
                                         config.wepKeys[i]);
                             }
@@ -890,7 +890,7 @@
                             WifiConfiguration.wepTxKeyIdxVarName,
                             Integer.toString(config.wepTxKeyIndex))) {
                     if (DBG) {
-                        Log.d(TAG,
+                        Slog.d(TAG,
                                 "failed to set wep_tx_keyidx: "+
                                 config.wepTxKeyIndex);
                     }
@@ -903,7 +903,7 @@
                         WifiConfiguration.priorityVarName,
                         Integer.toString(config.priority))) {
                 if (DBG) {
-                    Log.d(TAG, config.SSID + ": failed to set priority: "
+                    Slog.d(TAG, config.SSID + ": failed to set priority: "
                             +config.priority);
                 }
                 break setVariables;
@@ -914,7 +914,7 @@
                         WifiConfiguration.hiddenSSIDVarName,
                         Integer.toString(config.hiddenSSID ? 1 : 0))) {
                 if (DBG) {
-                    Log.d(TAG, config.SSID + ": failed to set hiddenSSID: "+
+                    Slog.d(TAG, config.SSID + ": failed to set hiddenSSID: "+
                             config.hiddenSSID);
                 }
                 break setVariables;
@@ -933,7 +933,7 @@
                                 varName,
                                 value)) {
                         if (DBG) {
-                            Log.d(TAG, config.SSID + ": failed to set " + varName +
+                            Slog.d(TAG, config.SSID + ": failed to set " + varName +
                                     ": " + value);
                         }
                         break setVariables;
@@ -952,7 +952,7 @@
             if (newNetwork) {
                 removeNetwork(netId);
                 if (DBG) {
-                    Log.d(TAG,
+                    Slog.d(TAG,
                             "Failed to set a network variable, removed network: "
                             + netId);
                 }
@@ -994,7 +994,7 @@
             // if we ever get here, we should probably add the
             // value to WifiConfiguration to reflect that it's
             // supported by the WPA supplicant
-            Log.w(TAG, "Failed to look-up a string: " + string);
+            Slog.w(TAG, "Failed to look-up a string: " + string);
         }
 
         return -1;
@@ -1098,7 +1098,7 @@
                     if (scanResult != null) {
                         scanList.add(scanResult);
                     } else if (DBG) {
-                        Log.w(TAG, "misformatted scan result for: " + line);
+                        Slog.w(TAG, "misformatted scan result for: " + line);
                     }
                 }
                 lineBeg = lineEnd + 1;
@@ -1185,7 +1185,7 @@
                         }
                     }
                 } else {
-                    Log.w(TAG, "Misformatted scan result text with " +
+                    Slog.w(TAG, "Misformatted scan result text with " +
                           result.length + " fields: " + line);
                 }
             }
@@ -1256,7 +1256,7 @@
      * {@code numChannels} is outside the valid range.
      */
     public boolean setNumAllowedChannels(int numChannels, boolean persist) {
-        Log.i(TAG, "WifiService trying to setNumAllowed to "+numChannels+
+        Slog.i(TAG, "WifiService trying to setNumAllowed to "+numChannels+
                 " with persist set to "+persist);
         enforceChangePermission();
         /*
@@ -1342,13 +1342,13 @@
                 Settings.System.getInt(mContext.getContentResolver(),
                                        Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
             if (action.equals(Intent.ACTION_SCREEN_ON)) {
-                Log.d(TAG, "ACTION_SCREEN_ON");
+                Slog.d(TAG, "ACTION_SCREEN_ON");
                 mAlarmManager.cancel(mIdleIntent);
                 mDeviceIdle = false;
                 mScreenOff = false;
                 mWifiStateTracker.enableRssiPolling(true);
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
-                Log.d(TAG, "ACTION_SCREEN_OFF");
+                Slog.d(TAG, "ACTION_SCREEN_OFF");
                 mScreenOff = true;
                 mWifiStateTracker.enableRssiPolling(false);
                 /*
@@ -1365,21 +1365,21 @@
                         // as long as we would if connected (below)
                         // TODO - fix the race conditions and switch back to the immediate turn-off
                         long triggerTime = System.currentTimeMillis() + (2*60*1000); // 2 min
-                        Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for 120,000 ms");
+                        Slog.d(TAG, "setting ACTION_DEVICE_IDLE timer for 120,000 ms");
                         mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                         //  // do not keep Wifi awake when screen is off if Wifi is not associated
                         //  mDeviceIdle = true;
                         //  updateWifiState();
                     } else {
                         long triggerTime = System.currentTimeMillis() + idleMillis;
-                        Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
+                        Slog.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
                         mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                     }
                 }
                 /* we can return now -- there's nothing to do until we get the idle intent back */
                 return;
             } else if (action.equals(ACTION_DEVICE_IDLE)) {
-                Log.d(TAG, "got ACTION_DEVICE_IDLE");
+                Slog.d(TAG, "got ACTION_DEVICE_IDLE");
                 mDeviceIdle = true;
             } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                 /*
@@ -1390,11 +1390,11 @@
                  * the already-set timer.
                  */
                 int pluggedType = intent.getIntExtra("plugged", 0);
-                Log.d(TAG, "ACTION_BATTERY_CHANGED pluggedType: " + pluggedType);
+                Slog.d(TAG, "ACTION_BATTERY_CHANGED pluggedType: " + pluggedType);
                 if (mScreenOff && shouldWifiStayAwake(stayAwakeConditions, mPluggedType) &&
                         !shouldWifiStayAwake(stayAwakeConditions, pluggedType)) {
                     long triggerTime = System.currentTimeMillis() + idleMillis;
-                    Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
+                    Slog.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
                     mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                     mPluggedType = pluggedType;
                     return;
@@ -1752,7 +1752,7 @@
     }
 
     private boolean acquireWifiLockLocked(WifiLock wifiLock) {
-        Log.d(TAG, "acquireWifiLockLocked: " + wifiLock);
+        Slog.d(TAG, "acquireWifiLockLocked: " + wifiLock);
 
         mLocks.addLock(wifiLock);
 
@@ -1790,7 +1790,7 @@
 
         WifiLock wifiLock = mLocks.removeLock(lock);
 
-        Log.d(TAG, "releaseWifiLockLocked: " + wifiLock);
+        Slog.d(TAG, "releaseWifiLockLocked: " + wifiLock);
 
         hadLock = (wifiLock != null);
 
@@ -1847,7 +1847,7 @@
         }
 
         public void binderDied() {
-            Log.e(TAG, "Multicaster binderDied");
+            Slog.e(TAG, "Multicaster binderDied");
             synchronized (mMulticasters) {
                 int i = mMulticasters.indexOf(this);
                 if (i != -1) {
diff --git a/services/java/com/android/server/WifiWatchdogService.java b/services/java/com/android/server/WifiWatchdogService.java
index f2347ed..e50b317 100644
--- a/services/java/com/android/server/WifiWatchdogService.java
+++ b/services/java/com/android/server/WifiWatchdogService.java
@@ -34,7 +34,7 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Config;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.IOException;
 import java.net.DatagramPacket;
@@ -281,7 +281,7 @@
                     // Wait for the handler to be set by the other thread
                     wait();
                 } catch (InterruptedException e) {
-                    Log.e(TAG, "Interrupted while waiting on handler.");
+                    Slog.e(TAG, "Interrupted while waiting on handler.");
                 }
             }
         }
@@ -293,11 +293,11 @@
      * Logs with the current thread.
      */
     private static void myLogV(String message) {
-        Log.v(TAG, "(" + Thread.currentThread().getName() + ") " + message);
+        Slog.v(TAG, "(" + Thread.currentThread().getName() + ") " + message);
     }
     
     private static void myLogD(String message) {
-        Log.d(TAG, "(" + Thread.currentThread().getName() + ") " + message);
+        Slog.d(TAG, "(" + Thread.currentThread().getName() + ") " + message);
     }
     
     /**
@@ -364,7 +364,7 @@
             }
             
             if (V) {
-                Log.v(TAG, (dnsAlive ? "  +" : "  Ignored: -"));
+                Slog.v(TAG, (dnsAlive ? "  +" : "  Ignored: -"));
             }
 
             if (shouldCancel()) return false;
@@ -372,7 +372,7 @@
             try {
                 Thread.sleep(pingDelay);
             } catch (InterruptedException e) {
-                Log.w(TAG, "Interrupted while pausing between pings", e);
+                Slog.w(TAG, "Interrupted while pausing between pings", e);
             }
         }
         
@@ -383,11 +383,11 @@
             if (DnsPinger.isDnsReachable(dns, getPingTimeoutMs())) {
                 successCounter++;
                 if (V) {
-                    Log.v(TAG, "  +");
+                    Slog.v(TAG, "  +");
                 }
             } else {
                 if (V) {
-                    Log.v(TAG, "  -");
+                    Slog.v(TAG, "  -");
                 }
             }
 
@@ -396,13 +396,13 @@
             try {
                 Thread.sleep(pingDelay);
             } catch (InterruptedException e) {
-                Log.w(TAG, "Interrupted while pausing between pings", e);
+                Slog.w(TAG, "Interrupted while pausing between pings", e);
             }
         }
         
         int packetLossPercentage = 100 * (numPings - successCounter) / numPings;
         if (D) {
-            Log.d(TAG, packetLossPercentage
+            Slog.d(TAG, packetLossPercentage
                     + "% packet loss (acceptable is " + acceptableLoss + "%)");
         }
         
@@ -544,7 +544,7 @@
             if (ssid == null) {
                 // It's still null, give up
                 if (V) {
-                    Log.v(TAG, "  Invalid SSID, returning false");
+                    Slog.v(TAG, "  Invalid SSID, returning false");
                 }
                 return false;
             }
@@ -559,7 +559,7 @@
             if (TextUtils.isEmpty(bssid)) {
                 // It's still null, give up
                 if (V) {
-                    Log.v(TAG, "  Invalid BSSID, returning false");
+                    Slog.v(TAG, "  Invalid BSSID, returning false");
                 }
                 return false;
             }
@@ -567,7 +567,7 @@
 
         if (!isOnWatchList(ssid)) {
             if (V) {
-                Log.v(TAG, "  SSID not on watch list, returning false");
+                Slog.v(TAG, "  SSID not on watch list, returning false");
             }
             return false;
         }
@@ -667,7 +667,7 @@
         // Make sure we are not sleeping
         if (mState == WatchdogState.SLEEP) {
             if (V) {
-                Log.v(TAG, "  Sleeping (in " + mSsid + "), so returning");
+                Slog.v(TAG, "  Sleeping (in " + mSsid + "), so returning");
             }
             return;
         }
@@ -681,7 +681,7 @@
         mNumApsChecked++;
         if (mNumApsChecked > getMaxApChecks()) {
             if (V) {
-                Log.v(TAG, "  Passed the max attempts (" + getMaxApChecks()
+                Slog.v(TAG, "  Passed the max attempts (" + getMaxApChecks()
                         + "), going to sleep for " + mSsid);
             }
             mHandler.sleep(mSsid);
@@ -692,7 +692,7 @@
         boolean isApAlive = checkDnsConnectivity();
         
         if (V) {
-            Log.v(TAG, "  Is it alive: " + isApAlive);
+            Slog.v(TAG, "  Is it alive: " + isApAlive);
         }
 
         // Take action based on results
@@ -753,7 +753,7 @@
         
         if (!mWifiStateTracker.addToBlacklist(bssid)) {
             // There's a known bug where this method returns failure on success
-            //Log.e(TAG, "Blacklisting " + bssid + " failed");
+            //Slog.e(TAG, "Blacklisting " + bssid + " failed");
         }
 
         if (D) {
@@ -780,7 +780,7 @@
         // Make sure we are not sleeping
         if (mState == WatchdogState.SLEEP) {
             if (V) {
-                Log.v(TAG, "  handleBackgroundCheckAp: Sleeping (in " + mSsid + "), so returning");
+                Slog.v(TAG, "  handleBackgroundCheckAp: Sleeping (in " + mSsid + "), so returning");
             }
             return;
         }
@@ -807,7 +807,7 @@
         boolean isApAlive = backgroundCheckDnsConnectivity();
         
         if (V && !isApAlive) {
-            Log.v(TAG, "  handleBackgroundCheckAp: Is it alive: " + isApAlive);
+            Slog.v(TAG, "  handleBackgroundCheckAp: Is it alive: " + isApAlive);
         }
 
         if (shouldCancel()) {
@@ -851,7 +851,7 @@
              */
             if (!mWifiStateTracker.clearBlacklist()) {
                 // There's a known bug where this method returns failure on success
-                //Log.e(TAG, "Clearing blacklist failed");
+                //Slog.e(TAG, "Clearing blacklist failed");
             }
             
             if (V) {
@@ -895,7 +895,7 @@
         
         // If we're sleeping, don't do anything
         if (mState == WatchdogState.SLEEP) {
-            Log.v(TAG, "  Sleeping (in " + mSsid + "), so returning");
+            Slog.v(TAG, "  Sleeping (in " + mSsid + "), so returning");
             return;
         }
         
@@ -903,7 +903,7 @@
         setIdleState(false);
         
         if (V) {
-            Log.v(TAG, "  Set state to IDLE");
+            Slog.v(TAG, "  Set state to IDLE");
         }
     }
     
@@ -1245,13 +1245,13 @@
                 
             } catch (SocketException e) {
                 if (V) {
-                    Log.v(TAG, "DnsPinger.isReachable received SocketException", e);
+                    Slog.v(TAG, "DnsPinger.isReachable received SocketException", e);
                 }
                 return false;
                 
             } catch (UnknownHostException e) {
                 if (V) {
-                    Log.v(TAG, "DnsPinger.isReachable is unable to resolve the DNS host", e);
+                    Slog.v(TAG, "DnsPinger.isReachable is unable to resolve the DNS host", e);
                 }
                 return false;
 
@@ -1260,13 +1260,13 @@
                 
             } catch (IOException e) {
                 if (V) {
-                    Log.v(TAG, "DnsPinger.isReachable got an IOException", e);
+                    Slog.v(TAG, "DnsPinger.isReachable got an IOException", e);
                 }
                 return false;
                 
             } catch (Exception e) {
                 if (V || Config.LOGD) {
-                    Log.d(TAG, "DnsPinger.isReachable got an unknown exception", e);
+                    Slog.d(TAG, "DnsPinger.isReachable got an unknown exception", e);
                 }
                 return false;
             }
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index a481036..8781263 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -84,7 +84,7 @@
 import android.provider.Settings;
 import android.util.DisplayMetrics;
 import android.util.EventLog;
-import android.util.Log;
+import android.util.Slog;
 import android.util.SparseIntArray;
 import android.view.Display;
 import android.view.Gravity;
@@ -380,6 +380,9 @@
 
     int mLayoutSeq = 0;
     
+    // State while inside of layoutAndPlaceSurfacesLocked().
+    boolean mFocusMayChange;
+    
     Configuration mCurConfiguration = new Configuration();
     
     // This is held as long as we have the screen frozen, to give us time to
@@ -555,7 +558,7 @@
         public void run() {
             Looper.prepare();
             //Looper.myLooper().setMessageLogging(new LogPrinter(
-            //        Log.VERBOSE, "WindowManagerPolicy"));
+            //        Log.VERBOSE, "WindowManagerPolicy", Log.LOG_ID_SYSTEM));
             android.os.Process.setThreadPriority(
                     android.os.Process.THREAD_PRIORITY_FOREGROUND);
             mPolicy.init(mContext, mService, mPM);
@@ -638,7 +641,7 @@
             // The window manager only throws security exceptions, so let's
             // log all others.
             if (!(e instanceof SecurityException)) {
-                Log.e(TAG, "Window Manager Crash", e);
+                Slog.e(TAG, "Window Manager Crash", e);
             }
             throw e;
         }
@@ -646,7 +649,7 @@
 
     private void placeWindowAfter(Object pos, WindowState window) {
         final int i = mWindows.indexOf(pos);
-        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
+        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Slog.v(
             TAG, "Adding window " + window + " at "
             + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
         mWindows.add(i+1, window);
@@ -654,7 +657,7 @@
 
     private void placeWindowBefore(Object pos, WindowState window) {
         final int i = mWindows.indexOf(pos);
-        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
+        if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Slog.v(
             TAG, "Adding window " + window + " at "
             + i + " of " + mWindows.size() + " (before " + pos + ")");
         mWindows.add(i, window);
@@ -711,7 +714,7 @@
                                 //apptoken note that the window could be a floating window
                                 //that was created later or a window at the top of the list of
                                 //windows associated with this token.
-                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
+                                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Slog.v(
                                         TAG, "Adding window " + win + " at "
                                         + (newIdx+1) + " of " + N);
                                 localmWindows.add(newIdx+1, win);
@@ -719,7 +722,7 @@
                         }
                     }
                 } else {
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                         TAG, "Figuring out where to add app window "
                         + client.asBinder() + " (token=" + token + ")");
                     // Figure out where the window should go, based on the
@@ -793,7 +796,7 @@
                                     break;
                                 }
                             }
-                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
+                            if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Slog.v(
                                     TAG, "Adding window " + win + " at "
                                     + i + " of " + N);
                             localmWindows.add(i, win);
@@ -810,7 +813,7 @@
                     }
                 }
                 if (i < 0) i = 0;
-                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(
+                if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Slog.v(
                         TAG, "Adding window " + win + " at "
                         + i + " of " + N);
                 localmWindows.add(i, win);
@@ -894,10 +897,10 @@
             i--;
             w = (WindowState)localmWindows.get(i);
 
-            //Log.i(TAG, "Checking window @" + i + " " + w + " fl=0x"
+            //Slog.i(TAG, "Checking window @" + i + " " + w + " fl=0x"
             //        + Integer.toHexString(w.mAttrs.flags));
             if (canBeImeTarget(w)) {
-                //Log.i(TAG, "Putting input method here!");
+                //Slog.i(TAG, "Putting input method here!");
 
                 // Yet more tricksyness!  If this window is a "starting"
                 // window, we do actually want to be on top of it, but
@@ -919,7 +922,7 @@
 
         mUpcomingInputMethodTarget = w;
 
-        if (DEBUG_INPUT_METHOD) Log.v(TAG, "Desired input method target="
+        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Desired input method target="
                 + w + " willMove=" + willMove);
 
         if (willMove && w != null) {
@@ -953,7 +956,7 @@
                 }
 
                 if (highestTarget != null) {
-                    if (DEBUG_INPUT_METHOD) Log.v(TAG, "mNextAppTransition="
+                    if (DEBUG_INPUT_METHOD) Slog.v(TAG, "mNextAppTransition="
                             + mNextAppTransition + " " + highestTarget
                             + " animating=" + highestTarget.isAnimating()
                             + " layer=" + highestTarget.mAnimLayer
@@ -978,12 +981,12 @@
             }
         }
 
-        //Log.i(TAG, "Placing input method @" + (i+1));
+        //Slog.i(TAG, "Placing input method @" + (i+1));
         if (w != null) {
             if (willMove) {
                 RuntimeException e = new RuntimeException();
                 if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                if (DEBUG_INPUT_METHOD) Log.w(TAG, "Moving IM target from "
+                if (DEBUG_INPUT_METHOD) Slog.w(TAG, "Moving IM target from "
                         + mInputMethodTarget + " to " + w, e);
                 mInputMethodTarget = w;
                 if (w.mAppToken != null) {
@@ -997,7 +1000,7 @@
         if (willMove) {
             RuntimeException e = new RuntimeException();
             if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-            if (DEBUG_INPUT_METHOD) Log.w(TAG, "Moving IM target from "
+            if (DEBUG_INPUT_METHOD) Slog.w(TAG, "Moving IM target from "
                     + mInputMethodTarget + " to null", e);
             mInputMethodTarget = null;
             setInputMethodAnimLayerAdjustment(0);
@@ -1009,7 +1012,7 @@
         int pos = findDesiredInputMethodWindowIndexLocked(true);
         if (pos >= 0) {
             win.mTargetAppToken = mInputMethodTarget.mAppToken;
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(
                     TAG, "Adding input method window " + win + " at " + pos);
             mWindows.add(pos, win);
             moveInputMethodDialogsLocked(pos+1);
@@ -1021,19 +1024,19 @@
     }
 
     void setInputMethodAnimLayerAdjustment(int adj) {
-        if (DEBUG_LAYERS) Log.v(TAG, "Setting im layer adj to " + adj);
+        if (DEBUG_LAYERS) Slog.v(TAG, "Setting im layer adj to " + adj);
         mInputMethodAnimLayerAdjustment = adj;
         WindowState imw = mInputMethodWindow;
         if (imw != null) {
             imw.mAnimLayer = imw.mLayer + adj;
-            if (DEBUG_LAYERS) Log.v(TAG, "IM win " + imw
+            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
                     + " anim layer: " + imw.mAnimLayer);
             int wi = imw.mChildWindows.size();
             while (wi > 0) {
                 wi--;
                 WindowState cw = (WindowState)imw.mChildWindows.get(wi);
                 cw.mAnimLayer = cw.mLayer + adj;
-                if (DEBUG_LAYERS) Log.v(TAG, "IM win " + cw
+                if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + cw
                         + " anim layer: " + cw.mAnimLayer);
             }
         }
@@ -1042,7 +1045,7 @@
             di --;
             imw = mInputMethodDialogs.get(di);
             imw.mAnimLayer = imw.mLayer + adj;
-            if (DEBUG_LAYERS) Log.v(TAG, "IM win " + imw
+            if (DEBUG_LAYERS) Slog.v(TAG, "IM win " + imw
                     + " anim layer: " + imw.mAnimLayer);
         }
     }
@@ -1051,7 +1054,7 @@
         int wpos = mWindows.indexOf(win);
         if (wpos >= 0) {
             if (wpos < interestingPos) interestingPos--;
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Temp removing at " + wpos + ": " + win);
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing at " + wpos + ": " + win);
             mWindows.remove(wpos);
             int NC = win.mChildWindows.size();
             while (NC > 0) {
@@ -1060,7 +1063,7 @@
                 int cpos = mWindows.indexOf(cw);
                 if (cpos >= 0) {
                     if (cpos < interestingPos) interestingPos--;
-                    if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Temp removing child at "
+                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Temp removing child at "
                             + cpos + ": " + cw);
                     mWindows.remove(cpos);
                 }
@@ -1076,7 +1079,7 @@
         // this case should be rare, so it shouldn't be that big a deal.
         int wpos = mWindows.indexOf(win);
         if (wpos >= 0) {
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "ReAdd removing from " + wpos
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "ReAdd removing from " + wpos
                     + ": " + win);
             mWindows.remove(wpos);
             reAddWindowLocked(wpos, win);
@@ -1087,7 +1090,7 @@
         int N = mWindows.size();
         while (N > 0) {
             N--;
-            Log.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
+            Slog.v(TAG, prefix + "#" + N + ": " + mWindows.get(N));
         }
     }
 
@@ -1095,12 +1098,12 @@
         ArrayList<WindowState> dialogs = mInputMethodDialogs;
 
         final int N = dialogs.size();
-        if (DEBUG_INPUT_METHOD) Log.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
+        if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Removing " + N + " dialogs w/pos=" + pos);
         for (int i=0; i<N; i++) {
             pos = tmpRemoveWindowLocked(pos, dialogs.get(i));
         }
         if (DEBUG_INPUT_METHOD) {
-            Log.v(TAG, "Window list w/pos=" + pos);
+            Slog.v(TAG, "Window list w/pos=" + pos);
             logWindowList("  ");
         }
 
@@ -1112,14 +1115,14 @@
                     pos++;
                 }
             }
-            if (DEBUG_INPUT_METHOD) Log.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
+            if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Adding " + N + " dialogs at pos=" + pos);
             for (int i=0; i<N; i++) {
                 WindowState win = dialogs.get(i);
                 win.mTargetAppToken = targetAppToken;
                 pos = reAddWindowLocked(pos, win);
             }
             if (DEBUG_INPUT_METHOD) {
-                Log.v(TAG, "Final window list:");
+                Slog.v(TAG, "Final window list:");
                 logWindowList("  ");
             }
             return;
@@ -1129,7 +1132,7 @@
             win.mTargetAppToken = null;
             reAddWindowToListInOrderLocked(win);
             if (DEBUG_INPUT_METHOD) {
-                Log.v(TAG, "No IM target, final list:");
+                Slog.v(TAG, "No IM target, final list:");
                 logWindowList("  ");
             }
         }
@@ -1188,18 +1191,18 @@
 
             if (imWin != null) {
                 if (DEBUG_INPUT_METHOD) {
-                    Log.v(TAG, "Moving IM from " + imPos);
+                    Slog.v(TAG, "Moving IM from " + imPos);
                     logWindowList("  ");
                 }
                 imPos = tmpRemoveWindowLocked(imPos, imWin);
                 if (DEBUG_INPUT_METHOD) {
-                    Log.v(TAG, "List after moving with new pos " + imPos + ":");
+                    Slog.v(TAG, "List after moving with new pos " + imPos + ":");
                     logWindowList("  ");
                 }
                 imWin.mTargetAppToken = mInputMethodTarget.mAppToken;
                 reAddWindowLocked(imPos, imWin);
                 if (DEBUG_INPUT_METHOD) {
-                    Log.v(TAG, "List after moving IM to " + imPos + ":");
+                    Slog.v(TAG, "List after moving IM to " + imPos + ":");
                     logWindowList("  ");
                 }
                 if (DN > 0) moveInputMethodDialogsLocked(imPos+1);
@@ -1212,12 +1215,12 @@
             // because they aren't currently associated with a focus window.
 
             if (imWin != null) {
-                if (DEBUG_INPUT_METHOD) Log.v(TAG, "Moving IM from " + imPos);
+                if (DEBUG_INPUT_METHOD) Slog.v(TAG, "Moving IM from " + imPos);
                 tmpRemoveWindowLocked(0, imWin);
                 imWin.mTargetAppToken = null;
                 reAddWindowToListInOrderLocked(imWin);
                 if (DEBUG_INPUT_METHOD) {
-                    Log.v(TAG, "List with no IM target:");
+                    Slog.v(TAG, "List with no IM target:");
                     logWindowList("  ");
                 }
                 if (DN > 0) moveInputMethodDialogsLocked(-1);;
@@ -1239,7 +1242,7 @@
     }
 
     final boolean isWallpaperVisible(WindowState wallpaperTarget) {
-        if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper vis: target obscured="
+        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
                 + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
                 + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
                         ? wallpaperTarget.mAppToken.animation : null)
@@ -1286,19 +1289,19 @@
                 // If this window's app token is hidden and not animating,
                 // it is of no interest to us.
                 if (w.mAppToken.hidden && w.mAppToken.animation == null) {
-                    if (DEBUG_WALLPAPER) Log.v(TAG,
+                    if (DEBUG_WALLPAPER) Slog.v(TAG,
                             "Skipping hidden or animating token: " + w);
                     topCurW = null;
                     continue;
                 }
             }
-            if (DEBUG_WALLPAPER) Log.v(TAG, "Win " + w + ": readyfordisplay="
+            if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay="
                     + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending
                     + " commitdrawpending=" + w.mCommitDrawPending);
             if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay()
                     && (mWallpaperTarget == w
                             || (!w.mDrawPending && !w.mCommitDrawPending))) {
-                if (DEBUG_WALLPAPER) Log.v(TAG,
+                if (DEBUG_WALLPAPER) Slog.v(TAG,
                         "Found wallpaper activity: #" + i + "=" + w);
                 foundW = w;
                 foundI = i;
@@ -1308,7 +1311,7 @@
                     // The current wallpaper target is animating, so we'll
                     // look behind it for another possible target and figure
                     // out what is going on below.
-                    if (DEBUG_WALLPAPER) Log.v(TAG, "Win " + w
+                    if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w
                             + ": token animating, looking behind.");
                     continue;
                 }
@@ -1326,12 +1329,12 @@
             // enough (we'll just wait until whatever transition is pending
             // executes).
             if (mWallpaperTarget != null && mWallpaperTarget.mAppToken != null) {
-                if (DEBUG_WALLPAPER) Log.v(TAG,
+                if (DEBUG_WALLPAPER) Slog.v(TAG,
                         "Wallpaper not changing: waiting for app anim in current target");
                 return 0;
             }
             if (foundW != null && foundW.mAppToken != null) {
-                if (DEBUG_WALLPAPER) Log.v(TAG,
+                if (DEBUG_WALLPAPER) Slog.v(TAG,
                         "Wallpaper not changing: waiting for app anim in found target");
                 return 0;
             }
@@ -1339,7 +1342,7 @@
 
         if (mWallpaperTarget != foundW) {
             if (DEBUG_WALLPAPER) {
-                Log.v(TAG, "New wallpaper target: " + foundW
+                Slog.v(TAG, "New wallpaper target: " + foundW
                         + " oldTarget: " + mWallpaperTarget);
             }
 
@@ -1357,17 +1360,17 @@
                 boolean foundAnim = foundW.mAnimation != null
                         || (foundW.mAppToken != null && foundW.mAppToken.animation != null);
                 if (DEBUG_WALLPAPER) {
-                    Log.v(TAG, "New animation: " + foundAnim
+                    Slog.v(TAG, "New animation: " + foundAnim
                             + " old animation: " + oldAnim);
                 }
                 if (foundAnim && oldAnim) {
                     int oldI = localmWindows.indexOf(oldW);
                     if (DEBUG_WALLPAPER) {
-                        Log.v(TAG, "New i: " + foundI + " old i: " + oldI);
+                        Slog.v(TAG, "New i: " + foundI + " old i: " + oldI);
                     }
                     if (oldI >= 0) {
                         if (DEBUG_WALLPAPER) {
-                            Log.v(TAG, "Animating wallpapers: old#" + oldI
+                            Slog.v(TAG, "Animating wallpapers: old#" + oldI
                                     + "=" + oldW + "; new#" + foundI
                                     + "=" + foundW);
                         }
@@ -1375,7 +1378,7 @@
                         // Set the new target correctly.
                         if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
                             if (DEBUG_WALLPAPER) {
-                                Log.v(TAG, "Old wallpaper still the target.");
+                                Slog.v(TAG, "Old wallpaper still the target.");
                             }
                             mWallpaperTarget = oldW;
                         }
@@ -1386,7 +1389,7 @@
                         if (foundI > oldI) {
                             // The new target is on top of the old one.
                             if (DEBUG_WALLPAPER) {
-                                Log.v(TAG, "Found target above old target.");
+                                Slog.v(TAG, "Found target above old target.");
                             }
                             mUpperWallpaperTarget = foundW;
                             mLowerWallpaperTarget = oldW;
@@ -1395,7 +1398,7 @@
                         } else {
                             // The new target is below the old one.
                             if (DEBUG_WALLPAPER) {
-                                Log.v(TAG, "Found target below old target.");
+                                Slog.v(TAG, "Found target below old target.");
                             }
                             mUpperWallpaperTarget = oldW;
                             mLowerWallpaperTarget = foundW;
@@ -1414,7 +1417,7 @@
                             && mUpperWallpaperTarget.mAppToken.animation != null);
             if (!lowerAnimating || !upperAnimating) {
                 if (DEBUG_WALLPAPER) {
-                    Log.v(TAG, "No longer animating wallpaper targets!");
+                    Slog.v(TAG, "No longer animating wallpaper targets!");
                 }
                 mLowerWallpaperTarget = null;
                 mUpperWallpaperTarget = null;
@@ -1426,7 +1429,7 @@
             // The window is visible to the compositor...  but is it visible
             // to the user?  That is what the wallpaper cares about.
             visible = isWallpaperVisible(foundW);
-            if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper visibility: " + visible);
+            if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper visibility: " + visible);
 
             // If the wallpaper target is animating, we may need to copy
             // its layer adjustment.  Only do this if we are not transfering
@@ -1457,7 +1460,7 @@
                 foundI--;
             }
         } else {
-            if (DEBUG_WALLPAPER) Log.v(TAG, "No wallpaper target");
+            if (DEBUG_WALLPAPER) Slog.v(TAG, "No wallpaper target");
         }
 
         if (foundW == null && topCurW != null) {
@@ -1510,7 +1513,7 @@
                 if (wallpaper.mWallpaperVisible != visible) {
                     wallpaper.mWallpaperVisible = visible;
                     try {
-                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Log.v(TAG,
+                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
                                 "Setting visibility of wallpaper " + wallpaper
                                 + ": " + visible);
                         wallpaper.mClient.dispatchAppVisibility(visible);
@@ -1519,7 +1522,7 @@
                 }
 
                 wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
-                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper win "
+                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
                         + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
 
                 // First, if this window is at the current index, then all
@@ -1536,7 +1539,7 @@
                 // not in the list.
                 int oldIndex = localmWindows.indexOf(wallpaper);
                 if (oldIndex >= 0) {
-                    if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Wallpaper removing at "
+                    if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Wallpaper removing at "
                             + oldIndex + ": " + wallpaper);
                     localmWindows.remove(oldIndex);
                     if (oldIndex < foundI) {
@@ -1545,7 +1548,7 @@
                 }
 
                 // Now stick it in.
-                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+                if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
                         "Moving wallpaper " + wallpaper
                         + " from " + oldIndex + " to " + foundI);
 
@@ -1558,7 +1561,7 @@
     }
 
     void setWallpaperAnimLayerAdjustmentLocked(int adj) {
-        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Log.v(TAG,
+        if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG,
                 "Setting wallpaper layer adj to " + adj);
         mWallpaperAnimLayerAdjustment = adj;
         int curTokenIndex = mWallpaperTokens.size();
@@ -1570,7 +1573,7 @@
                 curWallpaperIndex--;
                 WindowState wallpaper = token.windows.get(curWallpaperIndex);
                 wallpaper.mAnimLayer = wallpaper.mLayer + adj;
-                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper win "
+                if (DEBUG_LAYERS || DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper win "
                         + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
             }
         }
@@ -1586,7 +1589,7 @@
         int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
         changed = wallpaperWin.mXOffset != offset;
         if (changed) {
-            if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
+            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
                     + wallpaperWin + " x: " + offset);
             wallpaperWin.mXOffset = offset;
         }
@@ -1601,7 +1604,7 @@
         int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
         offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
         if (wallpaperWin.mYOffset != offset) {
-            if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
+            if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper "
                     + wallpaperWin + " y: " + offset);
             changed = true;
             wallpaperWin.mYOffset = offset;
@@ -1614,7 +1617,7 @@
 
         if (rawChanged) {
             try {
-                if (DEBUG_WALLPAPER) Log.v(TAG, "Report new wp offset "
+                if (DEBUG_WALLPAPER) Slog.v(TAG, "Report new wp offset "
                         + wallpaperWin + " x=" + wallpaperWin.mWallpaperX
                         + " y=" + wallpaperWin.mWallpaperY);
                 if (sync) {
@@ -1629,15 +1632,15 @@
                         if ((mLastWallpaperTimeoutTime+WALLPAPER_TIMEOUT_RECOVERY)
                                 < start) {
                             try {
-                                if (DEBUG_WALLPAPER) Log.v(TAG,
+                                if (DEBUG_WALLPAPER) Slog.v(TAG,
                                         "Waiting for offset complete...");
                                 mWindowMap.wait(WALLPAPER_TIMEOUT);
                             } catch (InterruptedException e) {
                             }
-                            if (DEBUG_WALLPAPER) Log.v(TAG, "Offset complete!");
+                            if (DEBUG_WALLPAPER) Slog.v(TAG, "Offset complete!");
                             if ((start+WALLPAPER_TIMEOUT)
                                     < SystemClock.uptimeMillis()) {
-                                Log.i(TAG, "Timeout waiting for wallpaper to offset: "
+                                Slog.i(TAG, "Timeout waiting for wallpaper to offset: "
                                         + wallpaperWin);
                                 mLastWallpaperTimeoutTime = start;
                             }
@@ -1729,7 +1732,7 @@
                 if (wallpaper.mWallpaperVisible != visible) {
                     wallpaper.mWallpaperVisible = visible;
                     try {
-                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Log.v(TAG,
+                        if (DEBUG_VISIBILITY || DEBUG_WALLPAPER) Slog.v(TAG,
                                 "Updating visibility of wallpaper " + wallpaper
                                 + ": " + visible);
                         wallpaper.mClient.dispatchAppVisibility(visible);
@@ -1772,7 +1775,7 @@
                     }
                     wallpaper.mClient.dispatchPointer(ev, eventTime, false);
                 } catch (RemoteException e) {
-                    Log.w(TAG, "Failure sending pointer to wallpaper", e);
+                    Slog.w(TAG, "Failure sending pointer to wallpaper", e);
                 }
             }
         }
@@ -1790,7 +1793,7 @@
         // sending events until the final up.
         if (mSendingPointersToWallpaper) {
             if (skipped) {
-                Log.i(TAG, "Sending skipped pointer to wallpaper!");
+                Slog.i(TAG, "Sending skipped pointer to wallpaper!");
             }
             sendPointerToWallpaperLocked(relWin, pointer, eventTime);
             
@@ -1828,20 +1831,20 @@
             }
 
             if (mWindowMap.containsKey(client.asBinder())) {
-                Log.w(TAG, "Window " + client + " is already added");
+                Slog.w(TAG, "Window " + client + " is already added");
                 return WindowManagerImpl.ADD_DUPLICATE_ADD;
             }
 
             if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
                 attachedWindow = windowForClientLocked(null, attrs.token, false);
                 if (attachedWindow == null) {
-                    Log.w(TAG, "Attempted to add window with token that is not a window: "
+                    Slog.w(TAG, "Attempted to add window with token that is not a window: "
                           + attrs.token + ".  Aborting.");
                     return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
                 }
                 if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
                         && attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
-                    Log.w(TAG, "Attempted to add window with token that is a sub-window: "
+                    Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
                             + attrs.token + ".  Aborting.");
                     return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
                 }
@@ -1852,17 +1855,17 @@
             if (token == null) {
                 if (attrs.type >= FIRST_APPLICATION_WINDOW
                         && attrs.type <= LAST_APPLICATION_WINDOW) {
-                    Log.w(TAG, "Attempted to add application window with unknown token "
+                    Slog.w(TAG, "Attempted to add application window with unknown token "
                           + attrs.token + ".  Aborting.");
                     return WindowManagerImpl.ADD_BAD_APP_TOKEN;
                 }
                 if (attrs.type == TYPE_INPUT_METHOD) {
-                    Log.w(TAG, "Attempted to add input method window with unknown token "
+                    Slog.w(TAG, "Attempted to add input method window with unknown token "
                           + attrs.token + ".  Aborting.");
                     return WindowManagerImpl.ADD_BAD_APP_TOKEN;
                 }
                 if (attrs.type == TYPE_WALLPAPER) {
-                    Log.w(TAG, "Attempted to add wallpaper window with unknown token "
+                    Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
                           + attrs.token + ".  Aborting.");
                     return WindowManagerImpl.ADD_BAD_APP_TOKEN;
                 }
@@ -1872,29 +1875,29 @@
                     && attrs.type <= LAST_APPLICATION_WINDOW) {
                 AppWindowToken atoken = token.appWindowToken;
                 if (atoken == null) {
-                    Log.w(TAG, "Attempted to add window with non-application token "
+                    Slog.w(TAG, "Attempted to add window with non-application token "
                           + token + ".  Aborting.");
                     return WindowManagerImpl.ADD_NOT_APP_TOKEN;
                 } else if (atoken.removed) {
-                    Log.w(TAG, "Attempted to add window with exiting application token "
+                    Slog.w(TAG, "Attempted to add window with exiting application token "
                           + token + ".  Aborting.");
                     return WindowManagerImpl.ADD_APP_EXITING;
                 }
                 if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
                     // No need for this guy!
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                             TAG, "**** NO NEED TO START: " + attrs.getTitle());
                     return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
                 }
             } else if (attrs.type == TYPE_INPUT_METHOD) {
                 if (token.windowType != TYPE_INPUT_METHOD) {
-                    Log.w(TAG, "Attempted to add input method window with bad token "
+                    Slog.w(TAG, "Attempted to add input method window with bad token "
                             + attrs.token + ".  Aborting.");
                       return WindowManagerImpl.ADD_BAD_APP_TOKEN;
                 }
             } else if (attrs.type == TYPE_WALLPAPER) {
                 if (token.windowType != TYPE_WALLPAPER) {
-                    Log.w(TAG, "Attempted to add wallpaper window with bad token "
+                    Slog.w(TAG, "Attempted to add wallpaper window with bad token "
                             + attrs.token + ".  Aborting.");
                       return WindowManagerImpl.ADD_BAD_APP_TOKEN;
                 }
@@ -1905,7 +1908,7 @@
             if (win.mDeathRecipient == null) {
                 // Client has apparently died, so there is no reason to
                 // continue.
-                Log.w(TAG, "Adding window client " + client.asBinder()
+                Slog.w(TAG, "Adding window client " + client.asBinder()
                         + " that is dead, aborting.");
                 return WindowManagerImpl.ADD_APP_EXITING;
             }
@@ -1990,7 +1993,7 @@
                     mKeyWaiter.handleNewWindowLocked(mCurrentFocus);
                 }
             }
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "New client " + client.asBinder()
                 + ": window=" + win);
             
@@ -2024,7 +2027,7 @@
 
     public void removeWindowLocked(Session session, WindowState win) {
 
-        if (localLOGV || DEBUG_FOCUS) Log.v(
+        if (localLOGV || DEBUG_FOCUS) Slog.v(
             TAG, "Remove " + win + " client="
             + Integer.toHexString(System.identityHashCode(
                 win.mClient.asBinder()))
@@ -2032,7 +2035,7 @@
 
         final long origId = Binder.clearCallingIdentity();
 
-        if (DEBUG_APP_TRANSITIONS) Log.v(
+        if (DEBUG_APP_TRANSITIONS) Slog.v(
                 TAG, "Remove " + win + ": mSurface=" + win.mSurface
                 + " mExiting=" + win.mExiting
                 + " isAnimating=" + win.isAnimating()
@@ -2063,7 +2066,7 @@
             }
             if (win.mExiting || win.isAnimating()) {
                 // The exit animation is running... wait for it!
-                //Log.i(TAG, "*** Running exit animation...");
+                //Slog.i(TAG, "*** Running exit animation...");
                 win.mExiting = true;
                 win.mRemoveOnExit = true;
                 mLayoutNeeded = true;
@@ -2105,7 +2108,7 @@
         if (false) {
             RuntimeException e = new RuntimeException("here");
             e.fillInStackTrace();
-            Log.w(TAG, "Removing window " + win, e);
+            Slog.w(TAG, "Removing window " + win, e);
         }
 
         mPolicy.removeWindowLw(win);
@@ -2113,7 +2116,7 @@
 
         mWindowMap.remove(win.mClient.asBinder());
         mWindows.remove(win);
-        if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Final remove of window: " + win);
+        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Final remove of window: " + win);
 
         if (mInputMethodWindow == win) {
             mInputMethodWindow = null;
@@ -2127,7 +2130,7 @@
         if (atoken != null) {
             atoken.allAppWindows.remove(win);
         }
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
                 TAG, "**** Removing window " + win + ": count="
                 + token.windows.size());
         if (token.windows.size() == 0) {
@@ -2150,7 +2153,7 @@
                 // If this is the last window except for a starting transition
                 // window, we need to get rid of the starting transition.
                 if (DEBUG_STARTING_WINDOW) {
-                    Log.v(TAG, "Schedule remove starting " + token
+                    Slog.v(TAG, "Schedule remove starting " + token
                             + ": no more real windows");
                 }
                 Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken);
@@ -2181,15 +2184,15 @@
             synchronized (mWindowMap) {
                 WindowState w = windowForClientLocked(session, client, false);
                 if ((w != null) && (w.mSurface != null)) {
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, ">>> OPEN TRANSACTION");
+                    if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION");
                     Surface.openTransaction();
                     try {
-                        if (SHOW_TRANSACTIONS) Log.i(
+                        if (SHOW_TRANSACTIONS) Slog.i(
                                 TAG, "  SURFACE " + w.mSurface
                                 + ": transparentRegionHint=" + region);
                         w.mSurface.setTransparentRegionHint(region);
                     } finally {
-                        if (SHOW_TRANSACTIONS) Log.i(TAG, "<<< CLOSE TRANSACTION");
+                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION");
                         Surface.closeTransaction();
                     }
                 }
@@ -2315,7 +2318,7 @@
                 attrChanges = win.mAttrs.copyFrom(attrs);
             }
 
-            if (DEBUG_LAYOUT) Log.v(TAG, "Relayout " + win + ": " + win.mAttrs);
+            if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
 
             if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) {
                 win.mAlpha = attrs.alpha;
@@ -2370,6 +2373,8 @@
                 }
                 if (displayed && (win.mAttrs.flags
                         & WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) != 0) {
+                    if (DEBUG_VISIBILITY) Slog.v(TAG,
+                            "Relayout window turning screen on: " + win);
                     win.mTurnOnScreen = true;
                 }
                 if ((attrChanges&WindowManager.LayoutParams.FORMAT_CHANGED) != 0) {
@@ -2383,7 +2388,7 @@
                         outSurface.copyFrom(surface);
                         win.mReportDestroySurface = false;
                         win.mSurfacePendingDestroy = false;
-                        if (SHOW_TRANSACTIONS) Log.i(TAG,
+                        if (SHOW_TRANSACTIONS) Slog.i(TAG,
                                 "  OUT SURFACE " + outSurface + ": copied");
                     } else {
                         // For some reason there isn't a surface.  Clear the
@@ -2391,7 +2396,7 @@
                         outSurface.release();
                     }
                 } catch (Exception e) {
-                    Log.w(TAG, "Exception thrown when creating surface for client "
+                    Slog.w(TAG, "Exception thrown when creating surface for client "
                              + client + " (" + win.mAttrs.getTitle() + ")",
                              e);
                     Binder.restoreCallingIdentity(origId);
@@ -2421,7 +2426,7 @@
             } else {
                 win.mEnterAnimationPending = false;
                 if (win.mSurface != null) {
-                    if (DEBUG_VISIBILITY) Log.i(TAG, "Relayout invis " + win
+                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Relayout invis " + win
                             + ": mExiting=" + win.mExiting
                             + " mSurfacePendingDestroy=" + win.mSurfacePendingDestroy);
                     // If we are not currently running the exit animation, we
@@ -2467,9 +2472,9 @@
                     // destroyed at this point.
                     win.mSurfacePendingDestroy = false;
                     outSurface.release();
-                    if (DEBUG_VISIBILITY) Log.i(TAG, "Releasing surface in: " + win);
+                    if (DEBUG_VISIBILITY) Slog.i(TAG, "Releasing surface in: " + win);
                 } else if (win.mSurface != null) {
-                    if (DEBUG_VISIBILITY) Log.i(TAG,
+                    if (DEBUG_VISIBILITY) Slog.i(TAG,
                             "Keeping surface, will report destroy: " + win);
                     win.mReportDestroySurface = true;
                     outSurface.copyFrom(win.mSurface);
@@ -2521,7 +2526,7 @@
             outFrame.set(win.mFrame);
             outContentInsets.set(win.mContentInsets);
             outVisibleInsets.set(win.mVisibleInsets);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Relayout given client " + client.asBinder()
                 + ", requestedWidth=" + requestedWidth
                 + ", requestedHeight=" + requestedHeight
@@ -2529,7 +2534,7 @@
                 + "\nRelayout returning frame=" + outFrame
                 + ", surface=" + outSurface);
 
-            if (localLOGV || DEBUG_FOCUS) Log.v(
+            if (localLOGV || DEBUG_FOCUS) Slog.v(
                 TAG, "Relayout of " + win + ": focusMayChange=" + focusMayChange);
 
             inTouchMode = mInTouchMode;
@@ -2561,7 +2566,7 @@
     }
 
     private AttributeCache.Entry getCachedAnimations(WindowManager.LayoutParams lp) {
-        if (DEBUG_ANIM) Log.v(TAG, "Loading animations: params package="
+        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: params package="
                 + (lp != null ? lp.packageName : null)
                 + " resId=0x" + (lp != null ? Integer.toHexString(lp.windowAnimations) : null));
         if (lp != null && lp.windowAnimations != 0) {
@@ -2573,7 +2578,7 @@
             if ((resId&0xFF000000) == 0x01000000) {
                 packageName = "android";
             }
-            if (DEBUG_ANIM) Log.v(TAG, "Loading animations: picked package="
+            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
                     + packageName);
             return AttributeCache.instance().get(packageName, resId,
                     com.android.internal.R.styleable.WindowAnimation);
@@ -2582,13 +2587,13 @@
     }
 
     private AttributeCache.Entry getCachedAnimations(String packageName, int resId) {
-        if (DEBUG_ANIM) Log.v(TAG, "Loading animations: params package="
+        if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: params package="
                 + packageName + " resId=0x" + Integer.toHexString(resId));
         if (packageName != null) {
             if ((resId&0xFF000000) == 0x01000000) {
                 packageName = "android";
             }
-            if (DEBUG_ANIM) Log.v(TAG, "Loading animations: picked package="
+            if (DEBUG_ANIM) Slog.v(TAG, "Loading animations: picked package="
                     + packageName);
             return AttributeCache.instance().get(packageName, resId,
                     com.android.internal.R.styleable.WindowAnimation);
@@ -2643,7 +2648,7 @@
                     a = loadAnimation(win.mAttrs, attr);
                 }
             }
-            if (DEBUG_ANIM) Log.v(TAG, "applyAnimation: win=" + win
+            if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: win=" + win
                     + " anim=" + anim + " attr=0x" + Integer.toHexString(attr)
                     + " mAnimation=" + win.mAnimation
                     + " isEntrance=" + isEntrance);
@@ -2651,7 +2656,7 @@
                 if (DEBUG_ANIM) {
                     RuntimeException e = new RuntimeException();
                     if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                    Log.v(TAG, "Loaded animation " + a + " for " + win, e);
+                    Slog.v(TAG, "Loaded animation " + a + " for " + win, e);
                 }
                 win.setAnimation(a);
                 win.mAnimationIsEntrance = isEntrance;
@@ -2705,7 +2710,7 @@
             Animation a;
             if (lp != null && (lp.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
                 a = new FadeInOutAnimation(enter);
-                if (DEBUG_ANIM) Log.v(TAG,
+                if (DEBUG_ANIM) Slog.v(TAG,
                         "applying FadeInOutAnimation for a window in compatibility mode");
             } else if (mNextAppTransitionPackage != null) {
                 a = loadAnimation(mNextAppTransitionPackage, enter ?
@@ -2765,7 +2770,7 @@
                         break;
                 }
                 a = animAttr != 0 ? loadAnimation(lp, animAttr) : null;
-                if (DEBUG_ANIM) Log.v(TAG, "applyAnimation: wtoken=" + wtoken
+                if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
                         + " anim=" + a
                         + " animAttr=0x" + Integer.toHexString(animAttr)
                         + " transit=" + transit);
@@ -2774,7 +2779,7 @@
                 if (DEBUG_ANIM) {
                     RuntimeException e = new RuntimeException();
                     if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                    Log.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
+                    Slog.v(TAG, "Loaded animation " + a + " for " + wtoken, e);
                 }
                 wtoken.setAnimation(a);
             }
@@ -2799,20 +2804,20 @@
                 continue;
             }
             if (tokens.get(v) != wtoken.token) {
-                Log.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
+                Slog.w(TAG, "Tokens out of sync: external is " + tokens.get(v)
                       + " @ " + v + ", internal is " + wtoken.token + " @ " + m);
             }
             v--;
             m--;
         }
         while (v >= 0) {
-            Log.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
+            Slog.w(TAG, "External token not found: " + tokens.get(v) + " @ " + v);
             v--;
         }
         while (m >= 0) {
             AppWindowToken wtoken = mAppTokens.get(m);
             if (!wtoken.removed) {
-                Log.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
+                Slog.w(TAG, "Invalid internal token: " + wtoken.token + " @ " + m);
             }
             m--;
         }
@@ -2832,7 +2837,7 @@
                 + Binder.getCallingPid()
                 + ", uid=" + Binder.getCallingUid()
                 + " requires " + permission;
-        Log.w(TAG, msg);
+        Slog.w(TAG, msg);
         return false;
     }
 
@@ -2853,7 +2858,7 @@
         synchronized(mWindowMap) {
             WindowToken wtoken = mTokenMap.get(token);
             if (wtoken != null) {
-                Log.w(TAG, "Attempted to add existing input method token: " + token);
+                Slog.w(TAG, "Attempted to add existing input method token: " + token);
                 return;
             }
             wtoken = new WindowToken(token, type, true);
@@ -2913,7 +2918,7 @@
                 }
 
             } else {
-                Log.w(TAG, "Attempted to remove non-existing token: " + token);
+                Slog.w(TAG, "Attempted to remove non-existing token: " + token);
             }
         }
         Binder.restoreCallingIdentity(origId);
@@ -2929,7 +2934,7 @@
         synchronized(mWindowMap) {
             AppWindowToken wtoken = findAppWindowToken(token.asBinder());
             if (wtoken != null) {
-                Log.w(TAG, "Attempted to add existing app token: " + token);
+                Slog.w(TAG, "Attempted to add existing app token: " + token);
                 return;
             }
             wtoken = new AppWindowToken(token);
@@ -2937,7 +2942,7 @@
             wtoken.appFullscreen = fullscreen;
             wtoken.requestedOrientation = requestedOrientation;
             mAppTokens.add(addPos, wtoken);
-            if (localLOGV) Log.v(TAG, "Adding new app token: " + wtoken);
+            if (localLOGV) Slog.v(TAG, "Adding new app token: " + wtoken);
             mTokenMap.put(token.asBinder(), wtoken);
             mTokenList.add(wtoken);
 
@@ -2958,7 +2963,7 @@
         synchronized(mWindowMap) {
             AppWindowToken wtoken = findAppWindowToken(token);
             if (wtoken == null) {
-                Log.w(TAG, "Attempted to set group id of non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to set group id of non-existing app token: " + token);
                 return;
             }
             wtoken.groupId = groupId;
@@ -3156,7 +3161,7 @@
         synchronized(mWindowMap) {
             AppWindowToken wtoken = findAppWindowToken(token.asBinder());
             if (wtoken == null) {
-                Log.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to set orientation of non-existing app token: " + token);
                 return;
             }
 
@@ -3184,19 +3189,19 @@
         synchronized(mWindowMap) {
             boolean changed = false;
             if (token == null) {
-                if (DEBUG_FOCUS) Log.v(TAG, "Clearing focused app, was " + mFocusedApp);
+                if (DEBUG_FOCUS) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
                 changed = mFocusedApp != null;
                 mFocusedApp = null;
                 mKeyWaiter.tickle();
             } else {
                 AppWindowToken newFocus = findAppWindowToken(token);
                 if (newFocus == null) {
-                    Log.w(TAG, "Attempted to set focus to non-existing app token: " + token);
+                    Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
                     return;
                 }
                 changed = mFocusedApp != newFocus;
                 mFocusedApp = newFocus;
-                if (DEBUG_FOCUS) Log.v(TAG, "Set focused app to: " + mFocusedApp);
+                if (DEBUG_FOCUS) Slog.v(TAG, "Set focused app to: " + mFocusedApp);
                 mKeyWaiter.tickle();
             }
 
@@ -3215,10 +3220,10 @@
         }
 
         synchronized(mWindowMap) {
-            if (DEBUG_APP_TRANSITIONS) Log.v(
+            if (DEBUG_APP_TRANSITIONS) Slog.v(
                     TAG, "Prepare app transition: transit=" + transit
                     + " mNextAppTransition=" + mNextAppTransition);
-            if (!mDisplayFrozen) {
+            if (!mDisplayFrozen && mPolicy.isScreenOn()) {
                 if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET
                         || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) {
                     mNextAppTransition = transit;
@@ -3265,7 +3270,7 @@
             if (DEBUG_APP_TRANSITIONS) {
                 RuntimeException e = new RuntimeException("here");
                 e.fillInStackTrace();
-                Log.w(TAG, "Execute app transition: mNextAppTransition="
+                Slog.w(TAG, "Execute app transition: mNextAppTransition="
                         + mNextAppTransition, e);
             }
             if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
@@ -3286,13 +3291,13 @@
         }
 
         synchronized(mWindowMap) {
-            if (DEBUG_STARTING_WINDOW) Log.v(
+            if (DEBUG_STARTING_WINDOW) Slog.v(
                     TAG, "setAppStartingIcon: token=" + token + " pkg=" + pkg
                     + " transferFrom=" + transferFrom);
 
             AppWindowToken wtoken = findAppWindowToken(token);
             if (wtoken == null) {
-                Log.w(TAG, "Attempted to set icon of non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to set icon of non-existing app token: " + token);
                 return;
             }
 
@@ -3318,7 +3323,7 @@
                             // shown immediately without any more transitions.
                             mSkipAppTransitionAnimation = true;
                         }
-                        if (DEBUG_STARTING_WINDOW) Log.v(TAG,
+                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
                                 "Moving existing starting from " + ttoken
                                 + " to " + wtoken);
                         final long origId = Binder.clearCallingIdentity();
@@ -3335,7 +3340,7 @@
                         startingWindow.mToken = wtoken;
                         startingWindow.mRootToken = wtoken;
                         startingWindow.mAppToken = wtoken;
-                        if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+                        if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
                                 "Removing starting window: " + startingWindow);
                         mWindows.remove(startingWindow);
                         ttoken.windows.remove(startingWindow);
@@ -3380,7 +3385,7 @@
                     } else if (ttoken.startingData != null) {
                         // The previous app was getting ready to show a
                         // starting window, but hasn't yet done so.  Steal it!
-                        if (DEBUG_STARTING_WINDOW) Log.v(TAG,
+                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
                                 "Moving pending starting from " + ttoken
                                 + " to " + wtoken);
                         wtoken.startingData = ttoken.startingData;
@@ -3446,7 +3451,7 @@
         synchronized(mWindowMap) {
             wtoken = findAppWindowToken(token);
             if (wtoken == null) {
-                Log.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to set will be hidden of non-existing app token: " + token);
                 return;
             }
             wtoken.willBeHidden = true;
@@ -3466,7 +3471,7 @@
         if (wtoken.hidden == visible) {
             final int N = wtoken.allAppWindows.size();
             boolean changed = false;
-            if (DEBUG_APP_TRANSITIONS) Log.v(
+            if (DEBUG_APP_TRANSITIONS) Slog.v(
                 TAG, "Changing app " + wtoken + " hidden=" + wtoken.hidden
                 + " performLayout=" + performLayout);
 
@@ -3493,7 +3498,7 @@
                     delayed = true;
                 }
 
-                //Log.i(TAG, "Window " + win + ": vis=" + win.isVisible());
+                //Slog.i(TAG, "Window " + win + ": vis=" + win.isVisible());
                 //win.dump("  ");
                 if (visible) {
                     if (!win.isVisibleNow()) {
@@ -3528,7 +3533,7 @@
                  }
             }
 
-            if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "setTokenVisibilityLocked: " + wtoken
+            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "setTokenVisibilityLocked: " + wtoken
                       + ": hidden=" + wtoken.hidden + " hiddenRequested="
                       + wtoken.hiddenRequested);
 
@@ -3559,14 +3564,14 @@
         synchronized(mWindowMap) {
             wtoken = findAppWindowToken(token);
             if (wtoken == null) {
-                Log.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to set visibility of non-existing app token: " + token);
                 return;
             }
 
             if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) {
                 RuntimeException e = new RuntimeException();
                 if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                Log.v(TAG, "setAppVisibility(" + token + ", " + visible
+                Slog.v(TAG, "setAppVisibility(" + token + ", " + visible
                         + "): mNextAppTransition=" + mNextAppTransition
                         + " hidden=" + wtoken.hidden
                         + " hiddenRequested=" + wtoken.hiddenRequested, e);
@@ -3574,14 +3579,15 @@
 
             // If we are preparing an app transition, then delay changing
             // the visibility of this token until we execute that transition.
-            if (!mDisplayFrozen && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
+            if (!mDisplayFrozen && mPolicy.isScreenOn()
+                    && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
                 // Already in requested state, don't do anything more.
                 if (wtoken.hiddenRequested != visible) {
                     return;
                 }
                 wtoken.hiddenRequested = !visible;
 
-                if (DEBUG_APP_TRANSITIONS) Log.v(
+                if (DEBUG_APP_TRANSITIONS) Slog.v(
                         TAG, "Setting dummy animation on: " + wtoken);
                 wtoken.setDummyAnimation();
                 mOpeningApps.remove(wtoken);
@@ -3633,7 +3639,7 @@
     void unsetAppFreezingScreenLocked(AppWindowToken wtoken,
             boolean unfreezeSurfaceNow, boolean force) {
         if (wtoken.freezingScreen) {
-            if (DEBUG_ORIENTATION) Log.v(TAG, "Clear freezing of " + wtoken
+            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + wtoken
                     + " force=" + force);
             final int N = wtoken.allAppWindows.size();
             boolean unfrozeWindows = false;
@@ -3648,7 +3654,7 @@
                 }
             }
             if (force || unfrozeWindows) {
-                if (DEBUG_ORIENTATION) Log.v(TAG, "No longer freezing: " + wtoken);
+                if (DEBUG_ORIENTATION) Slog.v(TAG, "No longer freezing: " + wtoken);
                 wtoken.freezingScreen = false;
                 mAppsFreezingScreen--;
             }
@@ -3667,7 +3673,7 @@
         if (DEBUG_ORIENTATION) {
             RuntimeException e = new RuntimeException();
             if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-            Log.i(TAG, "Set freezing of " + wtoken.appToken
+            Slog.i(TAG, "Set freezing of " + wtoken.appToken
                     + ": hidden=" + wtoken.hidden + " freezing="
                     + wtoken.freezingScreen, e);
         }
@@ -3697,14 +3703,14 @@
         }
 
         synchronized(mWindowMap) {
-            if (configChanges == 0 && !mDisplayFrozen) {
-                if (DEBUG_ORIENTATION) Log.v(TAG, "Skipping set freeze of " + token);
+            if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOn()) {
+                if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token);
                 return;
             }
 
             AppWindowToken wtoken = findAppWindowToken(token);
             if (wtoken == null || wtoken.appToken == null) {
-                Log.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
+                Slog.w(TAG, "Attempted to freeze screen with non-existing app token: " + wtoken);
                 return;
             }
             final long origId = Binder.clearCallingIdentity();
@@ -3725,7 +3731,7 @@
                 return;
             }
             final long origId = Binder.clearCallingIdentity();
-            if (DEBUG_ORIENTATION) Log.v(TAG, "Clear freezing of " + token
+            if (DEBUG_ORIENTATION) Slog.v(TAG, "Clear freezing of " + token
                     + ": hidden=" + wtoken.hidden + " freezing=" + wtoken.freezingScreen);
             unsetAppFreezingScreenLocked(wtoken, true, force);
             Binder.restoreCallingIdentity(origId);
@@ -3747,7 +3753,7 @@
             WindowToken basewtoken = mTokenMap.remove(token);
             mTokenList.remove(basewtoken);
             if (basewtoken != null && (wtoken=basewtoken.appWindowToken) != null) {
-                if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "Removing app token: " + wtoken);
+                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Removing app token: " + wtoken);
                 delayed = setTokenVisibilityLocked(wtoken, null, false, WindowManagerPolicy.TRANSIT_UNSET, true);
                 wtoken.inPendingTransaction = false;
                 mOpeningApps.remove(wtoken);
@@ -3759,7 +3765,7 @@
                     wtoken.waitingToHide = true;
                     delayed = true;
                 }
-                if (DEBUG_APP_TRANSITIONS) Log.v(
+                if (DEBUG_APP_TRANSITIONS) Slog.v(
                         TAG, "Removing app " + wtoken + " delayed=" + delayed
                         + " animation=" + wtoken.animation
                         + " animating=" + wtoken.animating);
@@ -3784,13 +3790,13 @@
                 }
                 unsetAppFreezingScreenLocked(wtoken, true, true);
                 if (mFocusedApp == wtoken) {
-                    if (DEBUG_FOCUS) Log.v(TAG, "Removing focused app token:" + wtoken);
+                    if (DEBUG_FOCUS) Slog.v(TAG, "Removing focused app token:" + wtoken);
                     mFocusedApp = null;
                     updateFocusedWindowLocked(UPDATE_FOCUS_NORMAL);
                     mKeyWaiter.tickle();
                 }
             } else {
-                Log.w(TAG, "Attempted to remove non-existing app token: " + token);
+                Slog.w(TAG, "Attempted to remove non-existing app token: " + token);
             }
 
             if (!delayed && wtoken != null) {
@@ -3800,7 +3806,7 @@
         Binder.restoreCallingIdentity(origId);
 
         if (startingToken != null) {
-            if (DEBUG_STARTING_WINDOW) Log.v(TAG, "Schedule remove starting "
+            if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting "
                     + startingToken + ": app token removed");
             Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken);
             mH.sendMessage(m);
@@ -3811,13 +3817,13 @@
         final int NW = token.windows.size();
         for (int i=0; i<NW; i++) {
             WindowState win = token.windows.get(i);
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Tmp removing app window " + win);
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Tmp removing app window " + win);
             mWindows.remove(win);
             int j = win.mChildWindows.size();
             while (j > 0) {
                 j--;
                 WindowState cwin = (WindowState)win.mChildWindows.get(j);
-                if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
                         "Tmp removing child window " + cwin);
                 mWindows.remove(cwin);
             }
@@ -3827,13 +3833,13 @@
 
     void dumpAppTokensLocked() {
         for (int i=mAppTokens.size()-1; i>=0; i--) {
-            Log.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
+            Slog.v(TAG, "  #" + i + ": " + mAppTokens.get(i).token);
         }
     }
 
     void dumpWindowsLocked() {
         for (int i=mWindows.size()-1; i>=0; i--) {
-            Log.v(TAG, "  #" + i + ": " + mWindows.get(i));
+            Slog.v(TAG, "  #" + i + ": " + mWindows.get(i));
         }
     }
 
@@ -3855,10 +3861,10 @@
             // Find the first app token below the new position that has
             // a window displayed.
             final AppWindowToken wtoken = mAppTokens.get(tokenPos-1);
-            if (DEBUG_REORDER) Log.v(TAG, "Looking for lower windows @ "
+            if (DEBUG_REORDER) Slog.v(TAG, "Looking for lower windows @ "
                     + tokenPos + " -- " + wtoken.token);
             if (wtoken.sendingToBottom) {
-                if (DEBUG_REORDER) Log.v(TAG,
+                if (DEBUG_REORDER) Slog.v(TAG,
                         "Skipping token -- currently sending to bottom");
                 tokenPos--;
                 continue;
@@ -3874,7 +3880,7 @@
                     if (cwin.mSubLayer >= 0) {
                         for (int pos=NW-1; pos>=0; pos--) {
                             if (mWindows.get(pos) == cwin) {
-                                if (DEBUG_REORDER) Log.v(TAG,
+                                if (DEBUG_REORDER) Slog.v(TAG,
                                         "Found child win @" + (pos+1));
                                 return pos+1;
                             }
@@ -3883,7 +3889,7 @@
                 }
                 for (int pos=NW-1; pos>=0; pos--) {
                     if (mWindows.get(pos) == win) {
-                        if (DEBUG_REORDER) Log.v(TAG, "Found win @" + (pos+1));
+                        if (DEBUG_REORDER) Slog.v(TAG, "Found win @" + (pos+1));
                         return pos+1;
                     }
                 }
@@ -3900,19 +3906,19 @@
         for (int j=0; j<NCW; j++) {
             WindowState cwin = (WindowState)win.mChildWindows.get(j);
             if (!added && cwin.mSubLayer >= 0) {
-                if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding child window at "
+                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding child window at "
                         + index + ": " + cwin);
                 mWindows.add(index, win);
                 index++;
                 added = true;
             }
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding window at "
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
                     + index + ": " + cwin);
             mWindows.add(index, cwin);
             index++;
         }
         if (!added) {
-            if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG, "Re-adding window at "
+            if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG, "Re-adding window at "
                     + index + ": " + win);
             mWindows.add(index, win);
             index++;
@@ -3935,26 +3941,26 @@
         }
 
         synchronized(mWindowMap) {
-            if (DEBUG_REORDER) Log.v(TAG, "Initial app tokens:");
+            if (DEBUG_REORDER) Slog.v(TAG, "Initial app tokens:");
             if (DEBUG_REORDER) dumpAppTokensLocked();
             final AppWindowToken wtoken = findAppWindowToken(token);
             if (wtoken == null || !mAppTokens.remove(wtoken)) {
-                Log.w(TAG, "Attempting to reorder token that doesn't exist: "
+                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
                       + token + " (" + wtoken + ")");
                 return;
             }
             mAppTokens.add(index, wtoken);
-            if (DEBUG_REORDER) Log.v(TAG, "Moved " + token + " to " + index + ":");
+            if (DEBUG_REORDER) Slog.v(TAG, "Moved " + token + " to " + index + ":");
             if (DEBUG_REORDER) dumpAppTokensLocked();
 
             final long origId = Binder.clearCallingIdentity();
-            if (DEBUG_REORDER) Log.v(TAG, "Removing windows in " + token + ":");
+            if (DEBUG_REORDER) Slog.v(TAG, "Removing windows in " + token + ":");
             if (DEBUG_REORDER) dumpWindowsLocked();
             if (tmpRemoveAppWindowsLocked(wtoken)) {
-                if (DEBUG_REORDER) Log.v(TAG, "Adding windows back in:");
+                if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
                 if (DEBUG_REORDER) dumpWindowsLocked();
                 reAddAppWindowsLocked(findWindowOffsetLocked(index), wtoken);
-                if (DEBUG_REORDER) Log.v(TAG, "Final window list:");
+                if (DEBUG_REORDER) Slog.v(TAG, "Final window list:");
                 if (DEBUG_REORDER) dumpWindowsLocked();
                 updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
                 mLayoutNeeded = true;
@@ -3973,7 +3979,7 @@
             IBinder token = tokens.get(i);
             final AppWindowToken wtoken = findAppWindowToken(token);
             if (!mAppTokens.remove(wtoken)) {
-                Log.w(TAG, "Attempting to reorder token that doesn't exist: "
+                Slog.w(TAG, "Attempting to reorder token that doesn't exist: "
                       + token + " (" + wtoken + ")");
                 i--;
                 N--;
@@ -4355,16 +4361,16 @@
 
             mDisplayEnabled = true;
             if (false) {
-                Log.i(TAG, "ENABLING SCREEN!");
+                Slog.i(TAG, "ENABLING SCREEN!");
                 StringWriter sw = new StringWriter();
                 PrintWriter pw = new PrintWriter(sw);
                 this.dump(null, pw, null);
-                Log.i(TAG, sw.toString());
+                Slog.i(TAG, sw.toString());
             }
             try {
                 IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
                 if (surfaceFlinger != null) {
-                    //Log.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
+                    //Slog.i(TAG, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
                     Parcel data = Parcel.obtain();
                     data.writeInterfaceToken("android.ui.ISurfaceComposer");
                     surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION,
@@ -4372,7 +4378,7 @@
                     data.recycle();
                 }
             } catch (RemoteException ex) {
-                Log.e(TAG, "Boot completed: SurfaceFlinger is dead!");
+                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
             }
         }
 
@@ -4401,7 +4407,7 @@
 
     public void setRotationUnchecked(int rotation,
             boolean alwaysSendConfiguration, int animFlags) {
-        if(DEBUG_ORIENTATION) Log.v(TAG,
+        if(DEBUG_ORIENTATION) Slog.v(TAG,
                 "alwaysSendConfiguration set to "+alwaysSendConfiguration);
 
         long origId = Binder.clearCallingIdentity();
@@ -4433,14 +4439,14 @@
             mRequestedRotation = rotation;
             mLastRotationFlags = animFlags;
         }
-        if (DEBUG_ORIENTATION) Log.v(TAG, "Overwriting rotation value from " + rotation);
+        if (DEBUG_ORIENTATION) Slog.v(TAG, "Overwriting rotation value from " + rotation);
         rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
                 mRotation, mDisplayEnabled);
-        if (DEBUG_ORIENTATION) Log.v(TAG, "new rotation is set to " + rotation);
+        if (DEBUG_ORIENTATION) Slog.v(TAG, "new rotation is set to " + rotation);
         changed = mDisplayEnabled && mRotation != rotation;
 
         if (changed) {
-            if (DEBUG_ORIENTATION) Log.v(TAG,
+            if (DEBUG_ORIENTATION) Slog.v(TAG,
                     "Rotation changed to " + rotation
                     + " from " + mRotation
                     + " (forceApp=" + mForcedAppOrientation
@@ -4453,7 +4459,7 @@
             mWaitingForConfig = true;
             mLayoutNeeded = true;
             startFreezingDisplayLocked();
-            Log.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
+            Slog.i(TAG, "Setting rotation to " + rotation + ", animFlags=" + animFlags);
             mQueue.setOrientation(rotation);
             if (mDisplayEnabled) {
                 Surface.setOrientation(0, rotation, animFlags);
@@ -4537,7 +4543,7 @@
                 try {
                     return mViewServer.start();
                 } catch (IOException e) {
-                    Log.w(TAG, "View server did not start");
+                    Slog.w(TAG, "View server did not start");
                 }
             }
             return false;
@@ -4547,7 +4553,7 @@
             mViewServer = new ViewServer(this, port);
             return mViewServer.start();
         } catch (IOException e) {
-            Log.w(TAG, "View server did not start");
+            Slog.w(TAG, "View server did not start");
         }
         return false;
     }
@@ -4722,7 +4728,7 @@
             reply.readException();
 
         } catch (Exception e) {
-            Log.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
+            Slog.w(TAG, "Could not send command " + command + " with parameters " + parameters, e);
             success = false;
         } finally {
             if (data != null) {
@@ -4920,7 +4926,7 @@
      * @return Returns true if event was dispatched, false if it was dropped for any reason
      */
     private int dispatchPointer(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
-        if (DEBUG_INPUT || WindowManagerPolicy.WATCH_POINTER) Log.v(TAG,
+        if (DEBUG_INPUT || WindowManagerPolicy.WATCH_POINTER) Slog.v(TAG,
                 "dispatchPointer " + ev);
 
         if (MEASURE_LATENCY) {
@@ -4951,7 +4957,7 @@
             // pointer without actually pressing down.  All other cases should
             // be atypical, so let's log them.
             if (action != MotionEvent.ACTION_MOVE) {
-                Log.w(TAG, "No window to dispatch pointer action " + ev.getAction());
+                Slog.w(TAG, "No window to dispatch pointer action " + ev.getAction());
             }
             synchronized (mWindowMap) {
                 dispatchPointerElsewhereLocked(null, null, ev, ev.getEventTime(), true);
@@ -4978,13 +4984,13 @@
         final long eventTime = ev.getEventTime();
         final long eventTimeNano = ev.getEventTimeNano();
 
-        //Log.i(TAG, "Sending " + ev + " to " + target);
+        //Slog.i(TAG, "Sending " + ev + " to " + target);
 
         if (uid != 0 && uid != target.mSession.mUid) {
             if (mContext.checkPermission(
                     android.Manifest.permission.INJECT_EVENTS, pid, uid)
                     != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission denied: injecting pointer event from pid "
+                Slog.w(TAG, "Permission denied: injecting pointer event from pid "
                         + pid + " uid " + uid + " to window " + target
                         + " owned by uid " + target.mSession.mUid);
                 if (qev != null) {
@@ -5033,7 +5039,7 @@
                         //an invalid move have to cancel earlier action
                         ev.setAction(MotionEvent.ACTION_CANCEL);
                         action = MotionEvent.ACTION_CANCEL;
-                        if (DEBUG_INPUT) Log.v(TAG, "Sending cancel for invalid ACTION_MOVE");
+                        if (DEBUG_INPUT) Slog.v(TAG, "Sending cancel for invalid ACTION_MOVE");
                         //note that the subsequent invalid moves will not get here
                         mFatTouch = true;
                     }
@@ -5113,7 +5119,7 @@
                             try {
                                 out.mClient.dispatchPointer(oev, eventTime, false);
                             } catch (android.os.RemoteException e) {
-                                Log.i(TAG, "WINDOW DIED during outside motion dispatch: " + out);
+                                Slog.i(TAG, "WINDOW DIED during outside motion dispatch: " + out);
                             }
                             oev.offsetLocation((float)frame.left, (float)frame.top);
                             out = out.mNextOutsideTouch;
@@ -5134,7 +5140,7 @@
         // dispatch the event.
         try {
             if (DEBUG_INPUT || DEBUG_FOCUS || WindowManagerPolicy.WATCH_POINTER) {
-                Log.v(TAG, "Delivering pointer " + qev + " to " + target);
+                Slog.v(TAG, "Delivering pointer " + qev + " to " + target);
             }
 
             if (MEASURE_LATENCY) {
@@ -5148,7 +5154,7 @@
             }
             return INJECT_SUCCEEDED;
         } catch (android.os.RemoteException e) {
-            Log.i(TAG, "WINDOW DIED during motion dispatch: " + target);
+            Slog.i(TAG, "WINDOW DIED during motion dispatch: " + target);
             mKeyWaiter.mMotionTarget = null;
             try {
                 removeWindow(target.mSession, target.mClient);
@@ -5164,13 +5170,13 @@
      * @return Returns true if event was dispatched, false if it was dropped for any reason
      */
     private int dispatchTrackball(QueuedEvent qev, MotionEvent ev, int pid, int uid) {
-        if (DEBUG_INPUT) Log.v(
+        if (DEBUG_INPUT) Slog.v(
                 TAG, "dispatchTrackball [" + ev.getAction() +"] <" + ev.getX() + ", " + ev.getY() + ">");
 
         Object focusObj = mKeyWaiter.waitForNextEventTarget(null, qev,
                 ev, false, false, pid, uid);
         if (focusObj == null) {
-            Log.w(TAG, "No focus window, dropping trackball: " + ev);
+            Slog.w(TAG, "No focus window, dropping trackball: " + ev);
             if (qev != null) {
                 mQueue.recycleEvent(qev);
             }
@@ -5191,7 +5197,7 @@
             if (mContext.checkPermission(
                     android.Manifest.permission.INJECT_EVENTS, pid, uid)
                     != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission denied: injecting key event from pid "
+                Slog.w(TAG, "Permission denied: injecting key event from pid "
                         + pid + " uid " + uid + " to window " + focus
                         + " owned by uid " + focus.mSession.mUid);
                 if (qev != null) {
@@ -5220,7 +5226,7 @@
             focus.mClient.dispatchTrackball(ev, eventTime, true);
             return INJECT_SUCCEEDED;
         } catch (android.os.RemoteException e) {
-            Log.i(TAG, "WINDOW DIED during key dispatch: " + focus);
+            Slog.i(TAG, "WINDOW DIED during key dispatch: " + focus);
             try {
                 removeWindow(focus.mSession, focus.mClient);
             } catch (java.util.NoSuchElementException ex) {
@@ -5236,12 +5242,12 @@
      * @return Returns true if event was dispatched, false if it was dropped for any reason
      */
     private int dispatchKey(KeyEvent event, int pid, int uid) {
-        if (DEBUG_INPUT) Log.v(TAG, "Dispatch key: " + event);
+        if (DEBUG_INPUT) Slog.v(TAG, "Dispatch key: " + event);
 
         Object focusObj = mKeyWaiter.waitForNextEventTarget(event, null,
                 null, false, false, pid, uid);
         if (focusObj == null) {
-            Log.w(TAG, "No focus window, dropping: " + event);
+            Slog.w(TAG, "No focus window, dropping: " + event);
             return INJECT_FAILED;
         }
         if (focusObj == mKeyWaiter.CONSUMED_EVENT_TOKEN) {
@@ -5260,14 +5266,14 @@
 
         WindowState focus = (WindowState)focusObj;
 
-        if (DEBUG_INPUT) Log.v(
+        if (DEBUG_INPUT) Slog.v(
             TAG, "Dispatching to " + focus + ": " + event);
 
         if (uid != 0 && uid != focus.mSession.mUid) {
             if (mContext.checkPermission(
                     android.Manifest.permission.INJECT_EVENTS, pid, uid)
                     != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission denied: injecting key event from pid "
+                Slog.w(TAG, "Permission denied: injecting key event from pid "
                         + pid + " uid " + uid + " to window " + focus
                         + " owned by uid " + focus.mSession.mUid);
                 return INJECT_NO_PERMISSION;
@@ -5284,13 +5290,13 @@
 
         try {
             if (DEBUG_INPUT || DEBUG_FOCUS) {
-                Log.v(TAG, "Delivering key " + event.getKeyCode()
+                Slog.v(TAG, "Delivering key " + event.getKeyCode()
                         + " to " + focus);
             }
             focus.mClient.dispatchKey(event);
             return INJECT_SUCCEEDED;
         } catch (android.os.RemoteException e) {
-            Log.i(TAG, "WINDOW DIED during key dispatch: " + focus);
+            Slog.i(TAG, "WINDOW DIED during key dispatch: " + focus);
             try {
                 removeWindow(focus.mSession, focus.mClient);
             } catch (java.util.NoSuchElementException ex) {
@@ -5550,7 +5556,7 @@
                 // it may change before we lock.  Thus we must check it again.
                 WindowState targetWin = mLastWin;
                 boolean targetIsNew = targetWin == null;
-                if (DEBUG_INPUT) Log.v(
+                if (DEBUG_INPUT) Slog.v(
                         TAG, "waitForLastKey: mFinished=" + mFinished +
                         ", mLastWin=" + mLastWin);
                 if (targetIsNew) {
@@ -5559,12 +5565,12 @@
                     if (target == SKIP_TARGET_TOKEN) {
                         // The user has pressed a special key, and we are
                         // dropping all pending events before it.
-                        if (DEBUG_INPUT) Log.v(TAG, "Skipping: " + nextKey
+                        if (DEBUG_INPUT) Slog.v(TAG, "Skipping: " + nextKey
                                 + " " + nextMotion);
                         return null;
                     }
                     if (target == CONSUMED_EVENT_TOKEN) {
-                        if (DEBUG_INPUT) Log.v(TAG, "Consumed: " + nextKey
+                        if (DEBUG_INPUT) Slog.v(TAG, "Consumed: " + nextKey
                                 + " " + nextMotion);
                         return target;
                     }
@@ -5588,7 +5594,7 @@
                         // If event dispatching is disabled, then we
                         // just consume the events.
                         if (!mEventDispatching) {
-                            if (DEBUG_INPUT) Log.v(TAG,
+                            if (DEBUG_INPUT) Slog.v(TAG,
                                     "Skipping event; dispatching disabled: "
                                     + nextKey + " " + nextMotion);
                             return null;
@@ -5604,14 +5610,14 @@
                         // If we didn't find a target window, and there is no
                         // focused app window, then just eat the events.
                         } else if (mFocusedApp == null) {
-                            if (DEBUG_INPUT) Log.v(TAG,
+                            if (DEBUG_INPUT) Slog.v(TAG,
                                     "Skipping event; no focused app: "
                                     + nextKey + " " + nextMotion);
                             return null;
                         }
                     }
 
-                    if (DEBUG_INPUT) Log.v(
+                    if (DEBUG_INPUT) Slog.v(
                             TAG, "Waiting for last key in " + mLastBinder
                             + " target=" + targetWin
                             + " mFinished=" + mFinished
@@ -5644,10 +5650,10 @@
                     try {
                         // after that continue
                         // processing keys, so we don't get stuck.
-                        if (DEBUG_INPUT) Log.v(
+                        if (DEBUG_INPUT) Slog.v(
                                 TAG, "Waiting for key dispatch: " + curTimeout);
                         wait(curTimeout);
-                        if (DEBUG_INPUT) Log.v(TAG, "Finished waiting @"
+                        if (DEBUG_INPUT) Slog.v(TAG, "Finished waiting @"
                                 + SystemClock.uptimeMillis() + " startTime="
                                 + startTime + " switchTime=" + mTimeToSwitch
                                 + " target=" + targetWin + " mLW=" + mLastWin
@@ -5670,12 +5676,12 @@
                 if (waitedFor >= keyDispatchingTimeout && mTimeToSwitch == 0) {
                     IApplicationToken at = null;
                     synchronized (this) {
-                        Log.w(TAG, "Key dispatching timed out sending to " +
+                        Slog.w(TAG, "Key dispatching timed out sending to " +
                               (targetWin != null ? targetWin.mAttrs.getTitle()
                               : "<null>: no window ready for key dispatch"));
                         // NOSHIP debugging
-                        Log.w(TAG, "Previous dispatch state: " + mDispatchState);
-                        Log.w(TAG, "Current dispatch state: " +
+                        Slog.w(TAG, "Previous dispatch state: " + mDispatchState);
+                        Slog.w(TAG, "Current dispatch state: " +
                                 new DispatchState(nextKey, targetWin));
                         // END NOSHIP
                         //dump();
@@ -5706,11 +5712,11 @@
                         if (abort && (mLastWin == targetWin || targetWin == null)) {
                             mFinished = true;
                             if (mLastWin != null) {
-                                if (DEBUG_INPUT) Log.v(TAG,
+                                if (DEBUG_INPUT) Slog.v(TAG,
                                         "Window " + mLastWin +
                                         " timed out on key input");
                                 if (mLastWin.mToken.paused) {
-                                    Log.w(TAG, "Un-pausing dispatching to this window");
+                                    Slog.w(TAG, "Un-pausing dispatching to this window");
                                     mLastWin.mToken.paused = false;
                                 }
                             }
@@ -5723,7 +5729,7 @@
                                 return null;
                             }
                         } else {
-                            Log.w(TAG, "Continuing to wait for key to be dispatched");
+                            Slog.w(TAG, "Continuing to wait for key to be dispatched");
                             startTime = SystemClock.uptimeMillis();
                         }
                     }
@@ -5753,7 +5759,7 @@
                                 nextKey.getMetaState(), down, repeatCount,
                                 nextKey.getFlags());
                     }
-                    Log.w(TAG, "Event timeout during app switch: dropping "
+                    Slog.w(TAG, "Event timeout during app switch: dropping "
                             + nextKey);
                     return SKIP_TARGET_TOKEN;
                 }
@@ -5785,7 +5791,7 @@
             } else if (!isPointerEvent) {
                 boolean dispatch = mKeyWaiter.checkShouldDispatchKey(-1);
                 if (!dispatch) {
-                    Log.w(TAG, "Event timeout during app switch: dropping trackball "
+                    Slog.w(TAG, "Event timeout during app switch: dropping trackball "
                             + nextMotion);
                     return SKIP_TARGET_TOKEN;
                 }
@@ -5806,7 +5812,7 @@
             boolean dispatch = mKeyWaiter.checkShouldDispatchKey(
                     KeyEvent.KEYCODE_UNKNOWN);
             if (!dispatch) {
-                Log.w(TAG, "Event timeout during app switch: dropping pointer "
+                Slog.w(TAG, "Event timeout during app switch: dropping pointer "
                         + nextMotion);
                 return SKIP_TARGET_TOKEN;
             }
@@ -5830,7 +5836,7 @@
                             // already down!
                             // XXX: We should probably send an ACTION_UP to the current
                             // target.
-                            Log.w(TAG, "Pointer down received while already down in: "
+                            Slog.w(TAG, "Pointer down received while already down in: "
                                     + mMotionTarget);
                             mMotionTarget = null;
                         }
@@ -5846,7 +5852,7 @@
                         final Rect tmpRect = mTempRect;
                         for (int i=N-1; i>=0; i--) {
                             WindowState child = (WindowState)windows.get(i);
-                            //Log.i(TAG, "Checking dispatch to: " + child);
+                            //Slog.i(TAG, "Checking dispatch to: " + child);
                             final int flags = child.mAttrs.flags;
                             if ((flags & WindowManager.LayoutParams.FLAG_SYSTEM_ERROR) != 0) {
                                 if (topErrWindow == null) {
@@ -5854,11 +5860,11 @@
                                 }
                             }
                             if (!child.isVisibleLw()) {
-                                //Log.i(TAG, "Not visible!");
+                                //Slog.i(TAG, "Not visible!");
                                 continue;
                             }
                             if ((flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0) {
-                                //Log.i(TAG, "Not touchable!");
+                                //Slog.i(TAG, "Not touchable!");
                                 if ((flags & WindowManager.LayoutParams
                                         .FLAG_WATCH_OUTSIDE_TOUCH) != 0) {
                                     child.mNextOutsideTouch = mOutsideTouchTargets;
@@ -5890,12 +5896,12 @@
                                 (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                                 |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
                             if (tmpRect.contains(x, y) || touchFlags == 0) {
-                                //Log.i(TAG, "Using this target!");
+                                //Slog.i(TAG, "Using this target!");
                                 if (!screenWasOff || (flags &
                                         WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING) != 0) {
                                     mMotionTarget = child;
                                 } else {
-                                    //Log.i(TAG, "Waking, skip!");
+                                    //Slog.i(TAG, "Waking, skip!");
                                     mMotionTarget = null;
                                 }
                                 break;
@@ -5905,7 +5911,7 @@
                                     .FLAG_WATCH_OUTSIDE_TOUCH) != 0) {
                                 child.mNextOutsideTouch = mOutsideTouchTargets;
                                 mOutsideTouchTargets = child;
-                                //Log.i(TAG, "Adding to outside target list: " + child);
+                                //Slog.i(TAG, "Adding to outside target list: " + child);
                             }
                         }
 
@@ -5967,7 +5973,7 @@
                     releasePendingPointerLocked(s);
                     s.mPendingPointerMove = pendingMotion;
                     s.mPendingPointerWindow = win;
-                    if (DEBUG_INPUT) Log.v(TAG,
+                    if (DEBUG_INPUT) Slog.v(TAG,
                             "bindTargetToWindow " + s.mPendingPointerMove);
                 } else if (pendingWhat == RETURN_PENDING_TRACKBALL) {
                     releasePendingTrackballLocked(s);
@@ -5978,7 +5984,7 @@
         }
 
         void releasePendingPointerLocked(Session s) {
-            if (DEBUG_INPUT) Log.v(TAG,
+            if (DEBUG_INPUT) Slog.v(TAG,
                     "releasePendingPointer " + s.mPendingPointerMove);
             if (s.mPendingPointerMove != null) {
                 mQueue.recycleEvent(s.mPendingPointerMove);
@@ -5995,7 +6001,7 @@
 
         MotionEvent finishedKey(Session session, IWindow client, boolean force,
                 int returnWhat) {
-            if (DEBUG_INPUT) Log.v(
+            if (DEBUG_INPUT) Slog.v(
                 TAG, "finishedKey: client=" + client + ", force=" + force);
 
             if (client == null) {
@@ -6007,7 +6013,7 @@
             WindowState win = null;
 
             synchronized (this) {
-                if (DEBUG_INPUT) Log.v(
+                if (DEBUG_INPUT) Slog.v(
                     TAG, "finishedKey: client=" + client.asBinder()
                     + ", force=" + force + ", last=" + mLastBinder
                     + " (token=" + (mLastWin != null ? mLastWin.mToken : null) + ")");
@@ -6025,7 +6031,7 @@
                 }
 
                 if (mLastBinder == client.asBinder()) {
-                    if (DEBUG_INPUT) Log.v(
+                    if (DEBUG_INPUT) Slog.v(
                         TAG, "finishedKey: last paused="
                         + ((mLastWin != null) ? mLastWin.mToken.paused : "null"));
                     if (mLastWin != null && (!mLastWin.mToken.paused || force
@@ -6042,7 +6048,7 @@
 
                 if (qev != null) {
                     res = (MotionEvent)qev.event;
-                    if (DEBUG_INPUT) Log.v(TAG,
+                    if (DEBUG_INPUT) Slog.v(TAG,
                             "Returning pending motion: " + res);
                     mQueue.recycleEvent(qev);
                     if (win != null && returnWhat == RETURN_PENDING_POINTER) {
@@ -6071,7 +6077,7 @@
                 return;
             }
             synchronized (this) {
-                if (DEBUG_INPUT) Log.v(
+                if (DEBUG_INPUT) Slog.v(
                     TAG, "New key dispatch window: win="
                     + newWindow.mClient.asBinder()
                     + ", last=" + mLastBinder
@@ -6087,7 +6093,7 @@
                 mGotFirstWindow = true;
 
                 if ((newWindow.mAttrs.flags & FLAG_SYSTEM_ERROR) != 0) {
-                    if (DEBUG_INPUT) Log.v(TAG,
+                    if (DEBUG_INPUT) Slog.v(TAG,
                             "New SYSTEM_ERROR window; resetting state");
                     mLastWin = null;
                     mLastBinder = null;
@@ -6097,7 +6103,7 @@
                     // If the new window is above the window we are
                     // waiting on, then stop waiting and let key dispatching
                     // start on the new guy.
-                    if (DEBUG_INPUT) Log.v(
+                    if (DEBUG_INPUT) Slog.v(
                         TAG, "Last win layer=" + mLastWin.mLayer
                         + ", new win layer=" + newWindow.mLayer);
                     if (newWindow.mLayer >= mLastWin.mLayer) {
@@ -6118,7 +6124,7 @@
         void pauseDispatchingLocked(WindowToken token) {
             synchronized (this)
             {
-                if (DEBUG_INPUT) Log.v(TAG, "Pausing WindowToken " + token);
+                if (DEBUG_INPUT) Slog.v(TAG, "Pausing WindowToken " + token);
                 token.paused = true;
 
                 /*
@@ -6126,11 +6132,11 @@
                     mPaused = true;
                 } else {
                     if (mLastWin == null) {
-                        Log.i(TAG, "Key dispatching not paused: no last window.");
+                        Slog.i(TAG, "Key dispatching not paused: no last window.");
                     } else if (mFinished) {
-                        Log.i(TAG, "Key dispatching not paused: finished last key.");
+                        Slog.i(TAG, "Key dispatching not paused: finished last key.");
                     } else {
-                        Log.i(TAG, "Key dispatching not paused: window in higher layer.");
+                        Slog.i(TAG, "Key dispatching not paused: window in higher layer.");
                     }
                 }
                 */
@@ -6140,7 +6146,7 @@
         void resumeDispatchingLocked(WindowToken token) {
             synchronized (this) {
                 if (token.paused) {
-                    if (DEBUG_INPUT) Log.v(
+                    if (DEBUG_INPUT) Slog.v(
                         TAG, "Resuming WindowToken " + token
                         + ", last=" + mLastBinder
                         + " (token=" + (mLastWin != null ? mLastWin.mToken : null)
@@ -6168,7 +6174,7 @@
                 // Don't wait for more than .5 seconds for app to finish
                 // processing the pending events.
                 long now = SystemClock.uptimeMillis() + 500;
-                if (DEBUG_INPUT) Log.v(TAG, "appSwitchComing: " + now);
+                if (DEBUG_INPUT) Slog.v(TAG, "appSwitchComing: " + now);
                 if (mTimeToSwitch == 0 || now < mTimeToSwitch) {
                     mTimeToSwitch = now;
                 }
@@ -6268,7 +6274,7 @@
                     if (screenIsOff) {
                         if (!mPolicy.isWakeRelMovementTq(event.deviceId,
                                 device.classes, event)) {
-                            //Log.i(TAG, "dropping because screenIsOff and !isWakeKey");
+                            //Slog.i(TAG, "dropping because screenIsOff and !isWakeKey");
                             return false;
                         }
                         event.flags |= WindowManagerPolicy.FLAG_WOKE_HERE;
@@ -6285,7 +6291,7 @@
                     if (screenIsOff) {
                         if (!mPolicy.isWakeAbsMovementTq(event.deviceId,
                                 device.classes, event)) {
-                            //Log.i(TAG, "dropping because screenIsOff and !isWakeKey");
+                            //Slog.i(TAG, "dropping because screenIsOff and !isWakeKey");
                             return false;
                         }
                         event.flags |= WindowManagerPolicy.FLAG_WOKE_HERE;
@@ -6306,7 +6312,7 @@
                 case RawInputEvent.CLASS_KEYBOARD:
                     KeyEvent ke = (KeyEvent)ev.event;
                     if (mPolicy.isMovementKeyTi(ke.getKeyCode())) {
-                        Log.w(TAG, "Dropping movement key during app switch: "
+                        Slog.w(TAG, "Dropping movement key during app switch: "
                                 + ke.getKeyCode() + ", action=" + ke.getAction());
                         return FILTER_REMOVE;
                     }
@@ -6355,7 +6361,7 @@
                 try {
                     process();
                 } catch (Exception e) {
-                    Log.e(TAG, "Exception in input dispatcher", e);
+                    Slog.e(TAG, "Exception in input dispatcher", e);
                 }
             }
         }
@@ -6381,7 +6387,7 @@
             while (true) {
                 long curTime = SystemClock.uptimeMillis();
 
-                if (DEBUG_INPUT) Log.v(
+                if (DEBUG_INPUT) Slog.v(
                     TAG, "Waiting for next key: now=" + curTime
                     + ", repeat @ " + nextKeyTime);
 
@@ -6393,7 +6399,7 @@
                     (int)((!configChanged && curTime < nextKeyTime)
                             ? (nextKeyTime-curTime) : 0));
 
-                if (DEBUG_INPUT && ev != null) Log.v(
+                if (DEBUG_INPUT && ev != null) Slog.v(
                         TAG, "Event: type=" + ev.classType + " data=" + ev.event);
 
                 if (MEASURE_LATENCY) {
@@ -6455,7 +6461,7 @@
                                     lastKeyTime = curTime;
                                     nextKeyTime = lastKeyTime
                                             + ViewConfiguration.getLongPressTimeout();
-                                    if (DEBUG_INPUT) Log.v(
+                                    if (DEBUG_INPUT) Slog.v(
                                         TAG, "Received key down: first repeat @ "
                                         + nextKeyTime);
                                 } else {
@@ -6464,7 +6470,7 @@
                                     // Arbitrary long timeout.
                                     lastKeyTime = curTime;
                                     nextKeyTime = curTime + LONG_WAIT;
-                                    if (DEBUG_INPUT) Log.v(
+                                    if (DEBUG_INPUT) Slog.v(
                                         TAG, "Received key up: ignore repeat @ "
                                         + nextKeyTime);
                                 }
@@ -6472,7 +6478,7 @@
                                 mQueue.recycleEvent(ev);
                                 break;
                             case RawInputEvent.CLASS_TOUCHSCREEN:
-                                //Log.i(TAG, "Read next event " + ev);
+                                //Slog.i(TAG, "Read next event " + ev);
                                 dispatchPointer(ev, (MotionEvent)ev.event, 0, 0);
                                 break;
                             case RawInputEvent.CLASS_TRACKBALL:
@@ -6495,7 +6501,7 @@
 
                         // Timeout occurred while key was down.  If it is at or
                         // past the key repeat time, dispatch the repeat.
-                        if (DEBUG_INPUT) Log.v(
+                        if (DEBUG_INPUT) Slog.v(
                             TAG, "Key timeout: repeat=" + nextKeyTime
                             + ", now=" + curTime);
                         if (curTime < nextKeyTime) {
@@ -6505,7 +6511,7 @@
                         lastKeyTime = nextKeyTime;
                         nextKeyTime = nextKeyTime + KEY_REPEAT_DELAY;
                         keyRepeatCount++;
-                        if (DEBUG_INPUT) Log.v(
+                        if (DEBUG_INPUT) Slog.v(
                             TAG, "Key repeat: count=" + keyRepeatCount
                             + ", next @ " + nextKeyTime);
                         KeyEvent newEvent;
@@ -6530,7 +6536,7 @@
                     }
 
                 } catch (Exception e) {
-                    Log.e(TAG,
+                    Slog.e(TAG,
                         "Input thread received uncaught exception: " + e, e);
                 }
             }
@@ -6618,7 +6624,7 @@
             } catch (RuntimeException e) {
                 // Log all 'real' exceptions thrown to the caller
                 if (!(e instanceof SecurityException)) {
-                    Log.e(TAG, "Window Session Crash", e);
+                    Slog.e(TAG, "Window Session Crash", e);
                 }
                 throw e;
             }
@@ -6673,27 +6679,27 @@
         }
 
         public void finishDrawing(IWindow window) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "IWindow finishDrawing called for " + window);
             finishDrawingWindow(this, window);
         }
 
         public void finishKey(IWindow window) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "IWindow finishKey called for " + window);
             mKeyWaiter.finishedKey(this, window, false,
                     KeyWaiter.RETURN_NOTHING);
         }
 
         public MotionEvent getPendingPointerMove(IWindow window) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                     TAG, "IWindow getPendingMotionEvent called for " + window);
             return mKeyWaiter.finishedKey(this, window, false,
                     KeyWaiter.RETURN_PENDING_POINTER);
         }
 
         public MotionEvent getPendingTrackballMove(IWindow window) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                     TAG, "IWindow getPendingMotionEvent called for " + window);
             return mKeyWaiter.finishedKey(this, window, false,
                     KeyWaiter.RETURN_PENDING_TRACKBALL);
@@ -6762,10 +6768,10 @@
 
         void windowAddedLocked() {
             if (mSurfaceSession == null) {
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                     TAG, "First window added to " + this + ", creating SurfaceSession");
                 mSurfaceSession = new SurfaceSession();
-                if (SHOW_TRANSACTIONS) Log.i(
+                if (SHOW_TRANSACTIONS) Slog.i(
                         TAG, "  NEW SURFACE SESSION " + mSurfaceSession);
                 mSessions.add(this);
             }
@@ -6781,15 +6787,15 @@
             if (mNumWindow <= 0 && mClientDead) {
                 mSessions.remove(this);
                 if (mSurfaceSession != null) {
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                         TAG, "Last window removed from " + this
                         + ", destroying " + mSurfaceSession);
-                    if (SHOW_TRANSACTIONS) Log.i(
+                    if (SHOW_TRANSACTIONS) Slog.i(
                             TAG, "  KILL SURFACE SESSION " + mSurfaceSession);
                     try {
                         mSurfaceSession.kill();
                     } catch (Exception e) {
-                        Log.w(TAG, "Exception thrown when killing surface session "
+                        Slog.w(TAG, "Exception thrown when killing surface session "
                             + mSurfaceSession + " in session " + this
                             + ": " + e.toString());
                     }
@@ -7009,7 +7015,7 @@
             mViewVisibility = viewVisibility;
             DeathRecipient deathRecipient = new DeathRecipient();
             mAlpha = a.alpha;
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Window " + this + " client=" + c.asBinder()
                 + " token=" + token + " (" + mAttrs.token + ")");
             try {
@@ -7086,7 +7092,7 @@
         }
 
         void attach() {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Attaching " + this + " token=" + mToken
                 + ", list=" + mToken.windows);
             mSession.windowAddedLocked();
@@ -7173,7 +7179,7 @@
             if (localLOGV) {
                 //if ("com.google.android.youtube".equals(mAttrs.packageName)
                 //        && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
-                    Log.v(TAG, "Resolving (mRequestedWidth="
+                    Slog.v(TAG, "Resolving (mRequestedWidth="
                             + mRequestedWidth + ", mRequestedheight="
                             + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
                             + "): frame=" + mFrame.toShortString()
@@ -7232,7 +7238,7 @@
         }
 
         public void setAnimation(Animation anim) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Setting animation in " + this + ": " + anim);
             mAnimating = false;
             mLocalAnimating = false;
@@ -7268,7 +7274,7 @@
                 if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) {
                     flags |= Surface.SECURE;
                 }
-                if (DEBUG_VISIBILITY) Log.v(
+                if (DEBUG_VISIBILITY) Slog.v(
                     TAG, "Creating surface in session "
                     + mSession.mSurfaceSession + " window " + this
                     + " w=" + mFrame.width()
@@ -7292,29 +7298,30 @@
                 try {
                     mSurface = new Surface(
                             mSession.mSurfaceSession, mSession.mPid,
+                            mAttrs.getTitle().toString(),
                             0, w, h, mAttrs.format, flags);
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  CREATE SURFACE "
+                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  CREATE SURFACE "
                             + mSurface + " IN SESSION "
                             + mSession.mSurfaceSession
                             + ": pid=" + mSession.mPid + " format="
                             + mAttrs.format + " flags=0x"
                             + Integer.toHexString(flags));
                 } catch (Surface.OutOfResourcesException e) {
-                    Log.w(TAG, "OutOfResourcesException creating surface");
+                    Slog.w(TAG, "OutOfResourcesException creating surface");
                     reclaimSomeSurfaceMemoryLocked(this, "create");
                     return null;
                 } catch (Exception e) {
-                    Log.e(TAG, "Exception creating surface", e);
+                    Slog.e(TAG, "Exception creating surface", e);
                     return null;
                 }
 
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                     TAG, "Got surface: " + mSurface
                     + ", set left=" + mFrame.left + " top=" + mFrame.top
                     + ", animLayer=" + mAnimLayer);
                 if (SHOW_TRANSACTIONS) {
-                    Log.i(TAG, ">>> OPEN TRANSACTION");
-                    Log.i(TAG, "  SURFACE " + mSurface + ": CREATE ("
+                    Slog.i(TAG, ">>> OPEN TRANSACTION");
+                    Slog.i(TAG, "  SURFACE " + mSurface + ": CREATE ("
                             + mAttrs.getTitle() + ") pos=(" +
                           mFrame.left + "," + mFrame.top + ") (" +
                           mFrame.width() + "x" + mFrame.height() + "), layer=" +
@@ -7328,21 +7335,21 @@
                         mSurface.setLayer(mAnimLayer);
                         mSurface.hide();
                         if ((mAttrs.flags&WindowManager.LayoutParams.FLAG_DITHER) != 0) {
-                            if (SHOW_TRANSACTIONS) Log.i(TAG, "  SURFACE "
+                            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  SURFACE "
                                     + mSurface + ": DITHER");
                             mSurface.setFlags(Surface.SURFACE_DITHER,
                                     Surface.SURFACE_DITHER);
                         }
                     } catch (RuntimeException e) {
-                        Log.w(TAG, "Error creating surface in " + w, e);
+                        Slog.w(TAG, "Error creating surface in " + w, e);
                         reclaimSomeSurfaceMemoryLocked(this, "create-init");
                     }
                     mLastHidden = true;
                 } finally {
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "<<< CLOSE TRANSACTION");
+                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION");
                     Surface.closeTransaction();
                 }
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                         TAG, "Created surface " + this);
             }
             return mSurface;
@@ -7388,18 +7395,18 @@
                     if (DEBUG_VISIBILITY) {
                         RuntimeException e = new RuntimeException();
                         if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                        Log.w(TAG, "Window " + this + " destroying surface "
+                        Slog.w(TAG, "Window " + this + " destroying surface "
                                 + mSurface + ", session " + mSession, e);
                     }
                     if (SHOW_TRANSACTIONS) {
                         RuntimeException ex = new RuntimeException();
                         if (!HIDE_STACK_CRAWLS) ex.fillInStackTrace();
-                        Log.i(TAG, "  SURFACE " + mSurface + ": DESTROY ("
+                        Slog.i(TAG, "  SURFACE " + mSurface + ": DESTROY ("
                                 + mAttrs.getTitle() + ")", ex);
                     }
                     mSurface.destroy();
                 } catch (RuntimeException e) {
-                    Log.w(TAG, "Exception thrown when destroying Window " + this
+                    Slog.w(TAG, "Exception thrown when destroying Window " + this
                         + " surface " + mSurface + " session " + mSession
                         + ": " + e.toString());
                 }
@@ -7410,7 +7417,7 @@
 
         boolean finishDrawingLocked() {
             if (mDrawPending) {
-                if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Log.v(
+                if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v(
                     TAG, "finishDrawingLocked: " + mSurface);
                 mCommitDrawPending = true;
                 mDrawPending = false;
@@ -7421,7 +7428,7 @@
 
         // This must be called while inside a transaction.
         boolean commitFinishDrawingLocked(long currentTime) {
-            //Log.i(TAG, "commitFinishDrawingLocked: " + mSurface);
+            //Slog.i(TAG, "commitFinishDrawingLocked: " + mSurface);
             if (!mCommitDrawPending) {
                 return false;
             }
@@ -7440,14 +7447,14 @@
             if (DEBUG_VISIBILITY) {
                 RuntimeException e = new RuntimeException();
                 if (!HIDE_STACK_CRAWLS) e.fillInStackTrace();
-                Log.v(TAG, "performShow on " + this
+                Slog.v(TAG, "performShow on " + this
                         + ": readyToShow=" + mReadyToShow + " readyForDisplay=" + isReadyForDisplay()
                         + " starting=" + (mAttrs.type == TYPE_APPLICATION_STARTING), e);
             }
             if (mReadyToShow && isReadyForDisplay()) {
-                if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Log.i(
+                if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.i(
                         TAG, "  SURFACE " + mSurface + ": SHOW (performShowLocked)");
-                if (DEBUG_VISIBILITY) Log.v(TAG, "Showing " + this
+                if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this
                         + " during animation: policyVis=" + mPolicyVisibility
                         + " attHidden=" + mAttachedHidden
                         + " tok.hiddenRequested="
@@ -7489,7 +7496,7 @@
                     mAppToken.firstWindowDrawn = true;
 
                     if (mAppToken.startingData != null) {
-                        if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Log.v(TAG,
+                        if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Slog.v(TAG,
                                 "Finish starting " + mToken
                                 + ": first real window is shown, no animation");
                         // If this initial window is animating, stop it -- we
@@ -7520,7 +7527,7 @@
                     mHasTransformation = true;
                     mHasLocalTransformation = true;
                     if (!mLocalAnimating) {
-                        if (DEBUG_ANIM) Log.v(
+                        if (DEBUG_ANIM) Slog.v(
                             TAG, "Starting animation in " + this +
                             " @ " + currentTime + ": ww=" + mFrame.width() + " wh=" + mFrame.height() +
                             " dw=" + dw + " dh=" + dh + " scale=" + mWindowAnimationScale);
@@ -7532,14 +7539,14 @@
                     mTransformation.clear();
                     final boolean more = mAnimation.getTransformation(
                         currentTime, mTransformation);
-                    if (DEBUG_ANIM) Log.v(
+                    if (DEBUG_ANIM) Slog.v(
                         TAG, "Stepped animation in " + this +
                         ": more=" + more + ", xform=" + mTransformation);
                     if (more) {
                         // we're not done!
                         return true;
                     }
-                    if (DEBUG_ANIM) Log.v(
+                    if (DEBUG_ANIM) Slog.v(
                         TAG, "Finished animation in " + this +
                         " @ " + currentTime);
                     mAnimation = null;
@@ -7578,7 +7585,7 @@
                 return false;
             }
 
-            if (DEBUG_ANIM) Log.v(
+            if (DEBUG_ANIM) Slog.v(
                 TAG, "Animation done in " + this + ": exiting=" + mExiting
                 + ", reportedVisible="
                 + (mAppToken != null ? mAppToken.reportedVisible : false));
@@ -7592,16 +7599,25 @@
             } else if (mIsWallpaper) {
                 mAnimLayer += mWallpaperAnimLayerAdjustment;
             }
-            if (DEBUG_LAYERS) Log.v(TAG, "Stepping win " + this
+            if (DEBUG_LAYERS) Slog.v(TAG, "Stepping win " + this
                     + " anim layer: " + mAnimLayer);
             mHasTransformation = false;
             mHasLocalTransformation = false;
-            mPolicyVisibility = mPolicyVisibilityAfterAnim;
-            if (!mPolicyVisibility) {
-                // Window is no longer visible -- make sure if we were waiting
-                // for it to be displayed before enabling the display, that
-                // we allow the display to be enabled now.
-                enableScreenIfNeededLocked();
+            if (mPolicyVisibility != mPolicyVisibilityAfterAnim) {
+                if (DEBUG_VISIBILITY) {
+                    Slog.v(TAG, "Policy visibility changing after anim in " + this + ": "
+                            + mPolicyVisibilityAfterAnim);
+                }
+                mPolicyVisibility = mPolicyVisibilityAfterAnim;
+                if (!mPolicyVisibility) {
+                    if (mCurrentFocus == this) {
+                        mFocusMayChange = true;
+                    }
+                    // Window is no longer visible -- make sure if we were waiting
+                    // for it to be displayed before enabling the display, that
+                    // we allow the display to be enabled now.
+                    enableScreenIfNeededLocked();
+                }
             }
             mTransformation.clear();
             if (mHasDrawn
@@ -7609,7 +7625,7 @@
                     && mAppToken != null
                     && mAppToken.firstWindowDrawn
                     && mAppToken.startingData != null) {
-                if (DEBUG_STARTING_WINDOW) Log.v(TAG, "Finish starting "
+                if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Finish starting "
                         + mToken + ": first real window done animating");
                 mFinishedStarting.add(mAppToken);
                 mH.sendEmptyMessage(H.FINISHED_STARTING);
@@ -7625,7 +7641,7 @@
         }
 
         void finishExit() {
-            if (DEBUG_ANIM) Log.v(
+            if (DEBUG_ANIM) Slog.v(
                     TAG, "finishExit in " + this
                     + ": exiting=" + mExiting
                     + " remove=" + mRemoveOnExit
@@ -7644,18 +7660,18 @@
                 return;
             }
 
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                     TAG, "Exit animation finished in " + this
                     + ": remove=" + mRemoveOnExit);
             if (mSurface != null) {
                 mDestroySurface.add(this);
                 mDestroying = true;
-                if (SHOW_TRANSACTIONS) Log.i(
+                if (SHOW_TRANSACTIONS) Slog.i(
                         TAG, "  SURFACE " + mSurface + ": HIDE (finishExit)");
                 try {
                     mSurface.hide();
                 } catch (RuntimeException e) {
-                    Log.w(TAG, "Error hiding surface in " + this, e);
+                    Slog.w(TAG, "Error hiding surface in " + this, e);
                 }
                 mLastHidden = true;
                 mKeyWaiter.releasePendingPointerLocked(mSession);
@@ -7693,7 +7709,7 @@
                         !mWallpaperTarget.mAnimation.getDetachWallpaper()) {
                     attachedTransformation = mWallpaperTarget.mTransformation;
                     if (DEBUG_WALLPAPER && attachedTransformation != null) {
-                        Log.v(TAG, "WP target attached xform: " + attachedTransformation);
+                        Slog.v(TAG, "WP target attached xform: " + attachedTransformation);
                     }
                 }
                 if (mWallpaperTarget.mAppToken != null &&
@@ -7702,7 +7718,7 @@
                         !mWallpaperTarget.mAppToken.animation.getDetachWallpaper()) {
                     appTransformation = mWallpaperTarget.mAppToken.transformation;
                     if (DEBUG_WALLPAPER && appTransformation != null) {
-                        Log.v(TAG, "WP target app xform: " + appTransformation);
+                        Slog.v(TAG, "WP target app xform: " + appTransformation);
                     }
                 }
             }
@@ -7731,7 +7747,7 @@
                 // (a 2x2 matrix + an offset)
                 // Here we must not transform the position of the surface
                 // since it is already included in the transformation.
-                //Log.i(TAG, "Transform: " + matrix);
+                //Slog.i(TAG, "Transform: " + matrix);
 
                 tmpMatrix.getValues(tmpFloats);
                 mDsDx = tmpFloats[Matrix.MSCALE_X];
@@ -7754,7 +7770,7 @@
                         || (!PixelFormat.formatHasAlpha(mAttrs.format)
                         || (isIdentityMatrix(mDsDx, mDtDx, mDsDy, mDtDy)
                                 && x == frame.left && y == frame.top))) {
-                    //Log.i(TAG, "Applying alpha transform");
+                    //Slog.i(TAG, "Applying alpha transform");
                     if (selfTransformation) {
                         mShownAlpha *= mTransformation.getAlpha();
                     }
@@ -7765,10 +7781,10 @@
                         mShownAlpha *= appTransformation.getAlpha();
                     }
                 } else {
-                    //Log.i(TAG, "Not applying alpha transform");
+                    //Slog.i(TAG, "Not applying alpha transform");
                 }
 
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                     TAG, "Continuing animation in " + this +
                     ": " + mShownFrame +
                     ", alpha=" + mTransformation.getAlpha());
@@ -7997,7 +8013,7 @@
                 try {
                     synchronized(mWindowMap) {
                         WindowState win = windowForClientLocked(mSession, mClient, false);
-                        Log.i(TAG, "WIN DEATH: " + win);
+                        Slog.i(TAG, "WIN DEATH: " + win);
                         if (win != null) {
                             removeWindowLocked(mSession, win);
                         }
@@ -8028,6 +8044,7 @@
             if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
                 return false;
             }
+            if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this);
             mPolicyVisibility = true;
             mPolicyVisibilityAfterAnim = true;
             if (doAnimation) {
@@ -8058,6 +8075,7 @@
             if (doAnimation) {
                 mPolicyVisibilityAfterAnim = false;
             } else {
+                if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility false: " + this);
                 mPolicyVisibilityAfterAnim = false;
                 mPolicyVisibility = false;
                 // Window is no longer visible -- make sure if we were waiting
@@ -8362,7 +8380,7 @@
         }
 
         public void setAnimation(Animation anim) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Setting animation in " + this + ": " + anim);
             animation = anim;
             animating = false;
@@ -8384,7 +8402,7 @@
 
         public void setDummyAnimation() {
             if (animation == null) {
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                     TAG, "Setting dummy animation in " + this);
                 animation = sDummyAnimation;
             }
@@ -8403,7 +8421,7 @@
             for (int i=0; i<N; i++) {
                 WindowState w = allAppWindows.get(i);
                 w.mAnimLayer = w.mLayer + adj;
-                if (DEBUG_LAYERS) Log.v(TAG, "Updating layer " + w + ": "
+                if (DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": "
                         + w.mAnimLayer);
                 if (w == mInputMethodTarget) {
                     setInputMethodAnimLayerAdjustment(adj);
@@ -8423,7 +8441,7 @@
                     continue;
                 }
                 try {
-                    if (DEBUG_VISIBILITY) Log.v(TAG,
+                    if (DEBUG_VISIBILITY) Slog.v(TAG,
                             "Setting visibility of " + win + ": " + (!clientHidden));
                     win.mClient.dispatchAppVisibility(!clientHidden);
                 } catch (RemoteException e) {
@@ -8435,7 +8453,7 @@
             final int NW = allAppWindows.size();
             for (int i=0; i<NW; i++) {
                 WindowState w = allAppWindows.get(i);
-                if (DEBUG_VISIBILITY) Log.v(TAG,
+                if (DEBUG_VISIBILITY) Slog.v(TAG,
                         "performing show on: " + w);
                 w.performShowLocked();
             }
@@ -8456,7 +8474,7 @@
 
                 if ((allDrawn || animating || startingDisplayed) && animation != null) {
                     if (!animating) {
-                        if (DEBUG_ANIM) Log.v(
+                        if (DEBUG_ANIM) Slog.v(
                             TAG, "Starting animation in " + this +
                             " @ " + currentTime + ": dw=" + dw + " dh=" + dh
                             + " scale=" + mTransitionAnimationScale
@@ -8468,7 +8486,7 @@
                     transformation.clear();
                     final boolean more = animation.getTransformation(
                         currentTime, transformation);
-                    if (DEBUG_ANIM) Log.v(
+                    if (DEBUG_ANIM) Slog.v(
                         TAG, "Stepped animation in " + this +
                         ": more=" + more + ", xform=" + transformation);
                     if (more) {
@@ -8476,7 +8494,7 @@
                         hasTransformation = true;
                         return true;
                     }
-                    if (DEBUG_ANIM) Log.v(
+                    if (DEBUG_ANIM) Slog.v(
                         TAG, "Finished animation in " + this +
                         " @ " + currentTime);
                     animation = null;
@@ -8500,7 +8518,7 @@
                 moveInputMethodWindowsIfNeededLocked(true);
             }
 
-            if (DEBUG_ANIM) Log.v(
+            if (DEBUG_ANIM) Slog.v(
                     TAG, "Animation done in " + this
                     + ": reportedVisible=" + reportedVisible);
 
@@ -8528,7 +8546,7 @@
             int numVisible = 0;
             boolean nowGone = true;
 
-            if (DEBUG_VISIBILITY) Log.v(TAG, "Update reported visibility: " + this);
+            if (DEBUG_VISIBILITY) Slog.v(TAG, "Update reported visibility: " + this);
             final int N = allAppWindows.size();
             for (int i=0; i<N; i++) {
                 WindowState win = allAppWindows.get(i);
@@ -8537,11 +8555,11 @@
                     continue;
                 }
                 if (DEBUG_VISIBILITY) {
-                    Log.v(TAG, "Win " + win + ": isDrawn="
+                    Slog.v(TAG, "Win " + win + ": isDrawn="
                             + win.isDrawnLw()
                             + ", isAnimating=" + win.isAnimating());
                     if (!win.isDrawnLw()) {
-                        Log.v(TAG, "Not displayed: s=" + win.mSurface
+                        Slog.v(TAG, "Not displayed: s=" + win.mSurface
                                 + " pv=" + win.mPolicyVisibility
                                 + " dp=" + win.mDrawPending
                                 + " cdp=" + win.mCommitDrawPending
@@ -8564,10 +8582,10 @@
             }
 
             boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting;
-            if (DEBUG_VISIBILITY) Log.v(TAG, "VIS " + this + ": interesting="
+            if (DEBUG_VISIBILITY) Slog.v(TAG, "VIS " + this + ": interesting="
                     + numInteresting + " visible=" + numVisible);
             if (nowVisible != reportedVisible) {
-                if (DEBUG_VISIBILITY) Log.v(
+                if (DEBUG_VISIBILITY) Slog.v(
                         TAG, "Visibility changed in " + this
                         + ": vis=" + nowVisible);
                 reportedVisible = nowVisible;
@@ -8731,11 +8749,11 @@
                             return;
                         }
                         mLastFocus = newFocus;
-                        //Log.i(TAG, "Focus moving from " + lastFocus
+                        //Slog.i(TAG, "Focus moving from " + lastFocus
                         //        + " to " + newFocus);
                         if (newFocus != null && lastFocus != null
                                 && !newFocus.isDisplayedLw()) {
-                            //Log.i(TAG, "Delaying loss of focus...");
+                            //Slog.i(TAG, "Delaying loss of focus...");
                             mLosingFocus.add(lastFocus);
                             lastFocus = null;
                         }
@@ -8746,7 +8764,7 @@
                         //                   + " to " + newFocus);
                         if (newFocus != null) {
                             try {
-                                //Log.i(TAG, "Gaining focus: " + newFocus);
+                                //Slog.i(TAG, "Gaining focus: " + newFocus);
                                 newFocus.mClient.windowFocusChanged(true, mInTouchMode);
                             } catch (RemoteException e) {
                                 // Ignore if process has died.
@@ -8755,7 +8773,7 @@
 
                         if (lastFocus != null) {
                             try {
-                                //Log.i(TAG, "Losing focus: " + lastFocus);
+                                //Slog.i(TAG, "Losing focus: " + lastFocus);
                                 lastFocus.mClient.windowFocusChanged(false, mInTouchMode);
                             } catch (RemoteException e) {
                                 // Ignore if process has died.
@@ -8775,7 +8793,7 @@
                     final int N = losers.size();
                     for (int i=0; i<N; i++) {
                         try {
-                            //Log.i(TAG, "Losing delayed focus: " + losers.get(i));
+                            //Slog.i(TAG, "Losing delayed focus: " + losers.get(i));
                             losers.get(i).mClient.windowFocusChanged(false, mInTouchMode);
                         } catch (RemoteException e) {
                              // Ignore if process has died.
@@ -8799,7 +8817,7 @@
                         return;
                     }
 
-                    if (DEBUG_STARTING_WINDOW) Log.v(TAG, "Add starting "
+                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Add starting "
                             + wtoken + ": pkg=" + sd.pkg);
 
                     View view = null;
@@ -8809,7 +8827,7 @@
                             sd.theme, sd.nonLocalizedLabel, sd.labelRes,
                             sd.icon);
                     } catch (Exception e) {
-                        Log.w(TAG, "Exception when adding starting window", e);
+                        Slog.w(TAG, "Exception when adding starting window", e);
                     }
 
                     if (view != null) {
@@ -8820,7 +8838,7 @@
                                 // If the window was successfully added, then
                                 // we need to remove it.
                                 if (wtoken.startingWindow != null) {
-                                    if (DEBUG_STARTING_WINDOW) Log.v(TAG,
+                                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
                                             "Aborted starting " + wtoken
                                             + ": removed=" + wtoken.removed
                                             + " startingData=" + wtoken.startingData);
@@ -8831,7 +8849,7 @@
                             } else {
                                 wtoken.startingView = view;
                             }
-                            if (DEBUG_STARTING_WINDOW && !abort) Log.v(TAG,
+                            if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG,
                                     "Added starting " + wtoken
                                     + ": startingWindow="
                                     + wtoken.startingWindow + " startingView="
@@ -8842,7 +8860,7 @@
                             try {
                                 mPolicy.removeStartingWindow(wtoken.token, view);
                             } catch (Exception e) {
-                                Log.w(TAG, "Exception when removing starting window", e);
+                                Slog.w(TAG, "Exception when removing starting window", e);
                             }
                         }
                     }
@@ -8853,7 +8871,7 @@
                     IBinder token = null;
                     View view = null;
                     synchronized (mWindowMap) {
-                        if (DEBUG_STARTING_WINDOW) Log.v(TAG, "Remove starting "
+                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Remove starting "
                                 + wtoken + ": startingWindow="
                                 + wtoken.startingWindow + " startingView="
                                 + wtoken.startingView);
@@ -8869,7 +8887,7 @@
                         try {
                             mPolicy.removeStartingWindow(token, view);
                         } catch (Exception e) {
-                            Log.w(TAG, "Exception when removing starting window", e);
+                            Slog.w(TAG, "Exception when removing starting window", e);
                         }
                     }
                 } break;
@@ -8885,7 +8903,7 @@
                             }
                             AppWindowToken wtoken = mFinishedStarting.remove(N-1);
 
-                            if (DEBUG_STARTING_WINDOW) Log.v(TAG,
+                            if (DEBUG_STARTING_WINDOW) Slog.v(TAG,
                                     "Finished starting " + wtoken
                                     + ": startingWindow=" + wtoken.startingWindow
                                     + " startingView=" + wtoken.startingView);
@@ -8904,7 +8922,7 @@
                         try {
                             mPolicy.removeStartingWindow(token, view);
                         } catch (Exception e) {
-                            Log.w(TAG, "Exception when removing starting window", e);
+                            Slog.w(TAG, "Exception when removing starting window", e);
                         }
                     }
                 } break;
@@ -8916,7 +8934,7 @@
                     boolean nowGone = msg.arg2 != 0;
 
                     try {
-                        if (DEBUG_VISIBILITY) Log.v(
+                        if (DEBUG_VISIBILITY) Slog.v(
                                 TAG, "Reporting visible in " + wtoken
                                 + " visible=" + nowVisible
                                 + " gone=" + nowGone);
@@ -8931,14 +8949,14 @@
 
                 case WINDOW_FREEZE_TIMEOUT: {
                     synchronized (mWindowMap) {
-                        Log.w(TAG, "Window freeze timeout expired.");
+                        Slog.w(TAG, "Window freeze timeout expired.");
                         int i = mWindows.size();
                         while (i > 0) {
                             i--;
                             WindowState w = (WindowState)mWindows.get(i);
                             if (w.mOrientationChanging) {
                                 w.mOrientationChanging = false;
-                                Log.w(TAG, "Force clearing orientation change: " + w);
+                                Slog.w(TAG, "Force clearing orientation change: " + w);
                             }
                         }
                         performLayoutAndPlaceSurfacesLocked();
@@ -8976,7 +8994,7 @@
                 case APP_TRANSITION_TIMEOUT: {
                     synchronized (mWindowMap) {
                         if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "*** APP TRANSITION TIMEOUT");
                             mAppTransitionReady = true;
                             mAppTransitionTimeout = true;
@@ -9021,13 +9039,13 @@
 
                 case APP_FREEZE_TIMEOUT: {
                     synchronized (mWindowMap) {
-                        Log.w(TAG, "App freeze timeout expired.");
+                        Slog.w(TAG, "App freeze timeout expired.");
                         int i = mAppTokens.size();
                         while (i > 0) {
                             i--;
                             AppWindowToken tok = mAppTokens.get(i);
                             if (tok.freezingScreen) {
-                                Log.w(TAG, "Force clearing freeze: " + tok);
+                                Slog.w(TAG, "Force clearing freeze: " + tok);
                                 unsetAppFreezingScreenLocked(tok, true, true);
                             }
                         }
@@ -9087,7 +9105,7 @@
     final WindowState windowForClientLocked(Session session, IBinder client,
             boolean throwOnError) {
         WindowState win = mWindowMap.get(client);
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
             TAG, "Looking up client " + client + ": " + win);
         if (win == null) {
             RuntimeException ex = new IllegalArgumentException(
@@ -9095,7 +9113,7 @@
             if (throwOnError) {
                 throw ex;
             }
-            Log.w(TAG, "Failed looking up window", ex);
+            Slog.w(TAG, "Failed looking up window", ex);
             return null;
         }
         if (session != null && win.mSession != session) {
@@ -9105,7 +9123,7 @@
             if (throwOnError) {
                 throw ex;
             }
-            Log.w(TAG, "Failed looking up window", ex);
+            Slog.w(TAG, "Failed looking up window", ex);
             return null;
         }
 
@@ -9124,7 +9142,7 @@
             WindowState w = (WindowState)mWindows.get(i);
             if (w.mAppToken != null) {
                 WindowState win = (WindowState)mWindows.remove(i);
-                if (DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
+                if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG,
                         "Rebuild removing window: " + win);
                 NW--;
                 numRemoved++;
@@ -9158,7 +9176,7 @@
 
         i -= lastWallpaper;
         if (i != numRemoved) {
-            Log.w(TAG, "Rebuild removed " + numRemoved
+            Slog.w(TAG, "Rebuild removed " + numRemoved
                     + " windows but added " + i);
         }
     }
@@ -9191,7 +9209,7 @@
             } else if (w.mIsWallpaper) {
                 w.mAnimLayer += mWallpaperAnimLayerAdjustment;
             }
-            if (DEBUG_LAYERS) Log.v(TAG, "Assign layer " + w + ": "
+            if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
                     + w.mAnimLayer);
             //System.out.println(
             //    "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
@@ -9204,7 +9222,7 @@
             if (DEBUG) {
                 throw new RuntimeException("Recursive call!");
             }
-            Log.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
+            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout");
             return;
         }
 
@@ -9221,11 +9239,11 @@
             // Wait a little it for things to settle down, and off we go.
             for (int i=0; i<mForceRemoves.size(); i++) {
                 WindowState ws = mForceRemoves.get(i);
-                Log.i(TAG, "Force removing: " + ws);
+                Slog.i(TAG, "Force removing: " + ws);
                 removeWindowInnerLocked(ws.mSession, ws);
             }
             mForceRemoves = null;
-            Log.w(TAG, "Due to memory failure, waiting a bit for next layout");
+            Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
             Object tmp = new Object();
             synchronized (tmp) {
                 try {
@@ -9261,7 +9279,7 @@
             }
         } catch (RuntimeException e) {
             mInLayout = false;
-            Log.e(TAG, "Unhandled exception while layout out windows", e);
+            Slog.e(TAG, "Unhandled exception while layout out windows", e);
         }
     }
 
@@ -9273,7 +9291,7 @@
         int repeats = 0;
         int i;
 
-        if (DEBUG_LAYOUT) Log.v(TAG, "performLayout: needed="
+        if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
                 + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
         
         // FIRST LOOP: Perform a layout, if needed.
@@ -9303,10 +9321,10 @@
                         || win.mExiting || win.mDestroying;
 
                 if (!win.mLayoutAttached) {
-                    if (DEBUG_LAYOUT) Log.v(TAG, "First pass " + win
+                    if (DEBUG_LAYOUT) Slog.v(TAG, "First pass " + win
                             + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
                             + " mLayoutAttached=" + win.mLayoutAttached);
-                    if (DEBUG_LAYOUT && gone) Log.v(TAG, "  (mViewVisibility="
+                    if (DEBUG_LAYOUT && gone) Slog.v(TAG, "  (mViewVisibility="
                             + win.mViewVisibility + " mRelayoutCalled="
                             + win.mRelayoutCalled + " hidden="
                             + win.mRootToken.hidden + " hiddenRequested="
@@ -9323,7 +9341,7 @@
                     if (!win.mLayoutAttached) {
                         mPolicy.layoutWindowLw(win, win.mAttrs, null);
                         win.mLayoutSeq = seq;
-                        if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+                        if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
                                 + win.mFrame + " mContainingFrame="
                                 + win.mContainingFrame + " mDisplayFrame="
                                 + win.mDisplayFrame);
@@ -9346,7 +9364,7 @@
                 // windows, since that means "perform layout as normal,
                 // just don't display").
                 if (win.mLayoutAttached) {
-                    if (DEBUG_LAYOUT) Log.v(TAG, "Second pass " + win
+                    if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win
                             + " mHaveFrame=" + win.mHaveFrame
                             + " mViewVisibility=" + win.mViewVisibility
                             + " mRelayoutCalled=" + win.mRelayoutCalled);
@@ -9354,7 +9372,7 @@
                             || !win.mHaveFrame) {
                         mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);
                         win.mLayoutSeq = seq;
-                        if (DEBUG_LAYOUT) Log.v(TAG, "-> mFrame="
+                        if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
                                 + win.mFrame + " mContainingFrame="
                                 + win.mContainingFrame + " mDisplayFrame="
                                 + win.mDisplayFrame);
@@ -9371,7 +9389,7 @@
             if (changes == 0) {
                 mLayoutNeeded = false;
             } else if (repeats > 2) {
-                Log.w(TAG, "Layout repeat aborted after too many iterations");
+                Slog.w(TAG, "Layout repeat aborted after too many iterations");
                 mLayoutNeeded = false;
                 if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
                     if (updateOrientationFromAppTokensLocked()) {
@@ -9379,11 +9397,11 @@
                     }
                 }
             } else {
-                if (DEBUG_LAYOUT) Log.v(TAG, "Repeating layout because changes=0x"
+                if (DEBUG_LAYOUT) Slog.v(TAG, "Repeating layout because changes=0x"
                         + Integer.toHexString(changes));
                 repeats++;
                 if ((changes&WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG) != 0) {
-                    if (DEBUG_LAYOUT) Log.v(TAG, "Computing new config from layout");
+                    if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
                     if (updateOrientationFromAppTokensLocked()) {
                         mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION);
                     }
@@ -9400,6 +9418,11 @@
 
         int i;
 
+        if (mFocusMayChange) {
+            mFocusMayChange = false;
+            updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES);
+        }
+        
         // FIRST LOOP: Perform a layout, if needed.
         performLayoutLockedInner();
 
@@ -9407,7 +9430,7 @@
             mFxSession = new SurfaceSession();
         }
 
-        if (SHOW_TRANSACTIONS) Log.i(TAG, ">>> OPEN TRANSACTION");
+        if (SHOW_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION");
 
         // Initialize state of exiting tokens.
         for (i=mExitingTokens.size()-1; i>=0; i--) {
@@ -9452,7 +9475,7 @@
                     }
                 }
 
-                if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "*** ANIM STEP: seq="
+                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
                         + transactionSequence + " tokensAnimating="
                         + tokensAnimating);
                         
@@ -9461,7 +9484,6 @@
 
                 boolean tokenMayBeDrawn = false;
                 boolean wallpaperMayChange = false;
-                boolean focusMayChange = false;
 
                 mPolicy.beginAnimationLw(dw, dh);
 
@@ -9477,7 +9499,7 @@
                         if (w.commitFinishDrawingLocked(currentTime)) {
                             if ((w.mAttrs.flags
                                     & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
-                                if (DEBUG_WALLPAPER) Log.v(TAG,
+                                if (DEBUG_WALLPAPER) Slog.v(TAG,
                                         "First draw done in potential wallpaper target " + w);
                                 wallpaperMayChange = true;
                             }
@@ -9495,7 +9517,7 @@
                         if (mPolicy.doesForceHide(w, attrs)) {
                             if (!wasAnimating && animating) {
                                 wallpaperForceHidingChanged = true;
-                                focusMayChange = true;
+                                mFocusMayChange = true;
                             } else if (w.isReadyForDisplay() && w.mAnimation == null) {
                                 forceHiding = true;
                             }
@@ -9515,6 +9537,7 @@
                                     if (a != null) {
                                         w.setAnimation(a);
                                     }
+                                    mFocusMayChange = true;
                                 }
                             }
                             if (changed && (attrs.flags
@@ -9537,11 +9560,11 @@
                                 == WindowManager.LayoutParams.TYPE_BASE_APPLICATION)
                                 && !w.mExiting && !w.mDestroying) {
                             if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
-                                Log.v(TAG, "Eval win " + w + ": isDrawn="
+                                Slog.v(TAG, "Eval win " + w + ": isDrawn="
                                         + w.isDrawnLw()
                                         + ", isAnimating=" + w.isAnimating());
                                 if (!w.isDrawnLw()) {
-                                    Log.v(TAG, "Not displayed: s=" + w.mSurface
+                                    Slog.v(TAG, "Not displayed: s=" + w.mSurface
                                             + " pv=" + w.mPolicyVisibility
                                             + " dp=" + w.mDrawPending
                                             + " cdp=" + w.mCommitDrawPending
@@ -9555,7 +9578,7 @@
                                     atoken.numInterestingWindows++;
                                     if (w.isDrawnLw()) {
                                         atoken.numDrawnWindows++;
-                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Log.v(TAG,
+                                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) Slog.v(TAG,
                                                 "tokenMayBeDrawn: " + atoken
                                                 + " freezingScreen=" + atoken.freezingScreen
                                                 + " mAppFreezing=" + w.mAppFreezing);
@@ -9587,7 +9610,7 @@
                         if (wtoken.freezingScreen) {
                             int numInteresting = wtoken.numInterestingWindows;
                             if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
-                                if (DEBUG_VISIBILITY) Log.v(TAG,
+                                if (DEBUG_VISIBILITY) Slog.v(TAG,
                                         "allDrawn: " + wtoken
                                         + " interesting=" + numInteresting
                                         + " drawn=" + wtoken.numDrawnWindows);
@@ -9598,7 +9621,7 @@
                         } else if (!wtoken.allDrawn) {
                             int numInteresting = wtoken.numInterestingWindows;
                             if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
-                                if (DEBUG_VISIBILITY) Log.v(TAG,
+                                if (DEBUG_VISIBILITY) Slog.v(TAG,
                                         "allDrawn: " + wtoken
                                         + " interesting=" + numInteresting
                                         + " drawn=" + wtoken.numDrawnWindows);
@@ -9620,7 +9643,7 @@
                 if (mAppTransitionReady) {
                     int NN = mOpeningApps.size();
                     boolean goodToGo = true;
-                    if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                    if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                             "Checking " + NN + " opening apps (frozen="
                             + mDisplayFrozen + " timeout="
                             + mAppTransitionTimeout + ")...");
@@ -9630,7 +9653,7 @@
                         // we'll unfreeze the display when everyone is ready.
                         for (i=0; i<NN && goodToGo; i++) {
                             AppWindowToken wtoken = mOpeningApps.get(i);
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "Check opening app" + wtoken + ": allDrawn="
                                     + wtoken.allDrawn + " startingDisplayed="
                                     + wtoken.startingDisplayed);
@@ -9641,7 +9664,7 @@
                         }
                     }
                     if (goodToGo) {
-                        if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "**** GOOD TO GO");
+                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
                         int transit = mNextAppTransition;
                         if (mSkipAppTransitionAnimation) {
                             transit = WindowManagerPolicy.TRANSIT_UNSET;
@@ -9683,7 +9706,7 @@
                         AppWindowToken animToken = null;
                         int bestAnimLayer = -1;
 
-                        if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                 "New wallpaper target=" + mWallpaperTarget
                                 + ", lower target=" + mLowerWallpaperTarget
                                 + ", upper target=" + mUpperWallpaperTarget);
@@ -9735,7 +9758,7 @@
                         }
 
                         if (foundWallpapers == 3) {
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "Wallpaper animation!");
                             switch (transit) {
                                 case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
@@ -9749,19 +9772,19 @@
                                     transit = WindowManagerPolicy.TRANSIT_WALLPAPER_INTRA_CLOSE;
                                     break;
                             }
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "New transit: " + transit);
                         } else if (oldWallpaper != null) {
                             // We are transitioning from an activity with
                             // a wallpaper to one without.
                             transit = WindowManagerPolicy.TRANSIT_WALLPAPER_CLOSE;
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "New transit away from wallpaper: " + transit);
                         } else if (mWallpaperTarget != null) {
                             // We are transitioning from an activity without
                             // a wallpaper to now showing the wallpaper
                             transit = WindowManagerPolicy.TRANSIT_WALLPAPER_OPEN;
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "New transit into wallpaper: " + transit);
                         }
 
@@ -9785,7 +9808,7 @@
                         NN = mOpeningApps.size();
                         for (i=0; i<NN; i++) {
                             AppWindowToken wtoken = mOpeningApps.get(i);
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "Now opening app" + wtoken);
                             wtoken.reportedVisible = false;
                             wtoken.inPendingTransaction = false;
@@ -9798,7 +9821,7 @@
                         NN = mClosingApps.size();
                         for (i=0; i<NN; i++) {
                             AppWindowToken wtoken = mClosingApps.get(i);
-                            if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
+                            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
                                     "Now closing app" + wtoken);
                             wtoken.inPendingTransaction = false;
                             wtoken.animation = null;
@@ -9824,7 +9847,7 @@
                         }
                         performLayoutLockedInner();
                         updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES);
-                        focusMayChange = false;
+                        mFocusMayChange = false;
 
                         restart = true;
                     }
@@ -9849,7 +9872,7 @@
                     // Since the window list has been rebuilt, focus might
                     // have to be recomputed since the actual order of windows
                     // might have changed again.
-                    focusMayChange = true;
+                    mFocusMayChange = true;
                 }
 
                 int adjResult = 0;
@@ -9864,10 +9887,10 @@
                     WindowState oldWallpaper = mWallpaperTarget;
                     if (mLowerWallpaperTarget != null
                             && mLowerWallpaperTarget.mAppToken != null) {
-                        if (DEBUG_WALLPAPER) Log.v(TAG,
+                        if (DEBUG_WALLPAPER) Slog.v(TAG,
                                 "wallpaperForceHiding changed with lower="
                                 + mLowerWallpaperTarget);
-                        if (DEBUG_WALLPAPER) Log.v(TAG,
+                        if (DEBUG_WALLPAPER) Slog.v(TAG,
                                 "hidden=" + mLowerWallpaperTarget.mAppToken.hidden +
                                 " hiddenRequested=" + mLowerWallpaperTarget.mAppToken.hiddenRequested);
                         if (mLowerWallpaperTarget.mAppToken.hidden) {
@@ -9881,7 +9904,7 @@
                     adjResult = adjustWallpaperWindowsLocked();
                     wallpaperMayChange = false;
                     wallpaperForceHidingChanged = false;
-                    if (DEBUG_WALLPAPER) Log.v(TAG, "****** OLD: " + oldWallpaper
+                    if (DEBUG_WALLPAPER) Slog.v(TAG, "****** OLD: " + oldWallpaper
                             + " NEW: " + mWallpaperTarget
                             + " LOWER: " + mLowerWallpaperTarget);
                     if (mLowerWallpaperTarget == null) {
@@ -9893,7 +9916,7 @@
                             if (w.mSurface != null) {
                                 final WindowManager.LayoutParams attrs = w.mAttrs;
                                 if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
-                                    if (DEBUG_FOCUS) Log.i(TAG, "win=" + w + " force hides other windows");
+                                    if (DEBUG_FOCUS) Slog.i(TAG, "win=" + w + " force hides other windows");
                                     forceHiding = true;
                                 } else if (mPolicy.canBeForceHidden(w, attrs)) {
                                     if (!w.mAnimating) {
@@ -9908,25 +9931,26 @@
                 }
 
                 if (wallpaperMayChange) {
-                    if (DEBUG_WALLPAPER) Log.v(TAG,
+                    if (DEBUG_WALLPAPER) Slog.v(TAG,
                             "Wallpaper may change!  Adjusting");
                     adjResult = adjustWallpaperWindowsLocked();
                 }
 
                 if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
-                    if (DEBUG_WALLPAPER) Log.v(TAG,
+                    if (DEBUG_WALLPAPER) Slog.v(TAG,
                             "Wallpaper layer changed: assigning layers + relayout");
                     restart = true;
                     mLayoutNeeded = true;
                     assignLayersLocked();
                 } else if ((adjResult&ADJUST_WALLPAPER_VISIBILITY_CHANGED) != 0) {
-                    if (DEBUG_WALLPAPER) Log.v(TAG,
+                    if (DEBUG_WALLPAPER) Slog.v(TAG,
                             "Wallpaper visibility changed: relayout");
                     restart = true;
                     mLayoutNeeded = true;
                 }
 
-                if (focusMayChange) {
+                if (mFocusMayChange) {
+                    mFocusMayChange = false;
                     if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES)) {
                         restart = true;
                         adjResult = 0;
@@ -9938,7 +9962,7 @@
                     performLayoutLockedInner();
                 }
 
-                if (DEBUG_APP_TRANSITIONS) Log.v(TAG, "*** ANIM STEP: restart="
+                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: restart="
                         + restart);
                 
             } while (restart);
@@ -9965,7 +9989,7 @@
 
                 if (w.mSurface != null) {
                     w.computeShownFrameLocked();
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                             TAG, "Placing surface #" + i + " " + w.mSurface
                             + ": new=" + w.mShownFrame + ", old="
                             + w.mLastShownFrame);
@@ -9983,13 +10007,13 @@
                         w.mLastRequestedHeight = height;
                         w.mLastShownFrame.set(w.mShownFrame);
                         try {
-                            if (SHOW_TRANSACTIONS) Log.i(
+                            if (SHOW_TRANSACTIONS) Slog.i(
                                     TAG, "  SURFACE " + w.mSurface
                                     + ": POS " + w.mShownFrame.left
                                     + ", " + w.mShownFrame.top);
                             w.mSurface.setPosition(w.mShownFrame.left, w.mShownFrame.top);
                         } catch (RuntimeException e) {
-                            Log.w(TAG, "Error positioning surface in " + w, e);
+                            Slog.w(TAG, "Error positioning surface in " + w, e);
                             if (!recoveringMemory) {
                                 reclaimSomeSurfaceMemoryLocked(w, "position");
                             }
@@ -10006,7 +10030,7 @@
                         if (height < 1) height = 1;
                         if (w.mSurface != null) {
                             try {
-                                if (SHOW_TRANSACTIONS) Log.i(
+                                if (SHOW_TRANSACTIONS) Slog.i(
                                         TAG, "  SURFACE " + w.mSurface + ": POS "
                                         + w.mShownFrame.left + ","
                                         + w.mShownFrame.top + " SIZE "
@@ -10019,7 +10043,7 @@
                                 // If something goes wrong with the surface (such
                                 // as running out of memory), don't take down the
                                 // entire system.
-                                Log.e(TAG, "Failure updating surface of " + w
+                                Slog.e(TAG, "Failure updating surface of " + w
                                         + "size=(" + width + "x" + height
                                         + "), pos=(" + w.mShownFrame.left
                                         + "," + w.mShownFrame.top + ")", e);
@@ -10038,7 +10062,7 @@
                             w.mConfiguration != mCurConfiguration
                             && (w.mConfiguration == null
                                     || mCurConfiguration.diff(w.mConfiguration) != 0);
-                        if (localLOGV) Log.v(TAG, "Resizing " + w
+                        if (localLOGV) Slog.v(TAG, "Resizing " + w
                                 + ": configChanged=" + configChanged
                                 + " last=" + w.mLastFrame + " frame=" + w.mFrame);
                         if (!w.mLastFrame.equals(w.mFrame)
@@ -10052,7 +10076,7 @@
                             // it frozen until this window draws at its new
                             // orientation.
                             if (mDisplayFrozen) {
-                                if (DEBUG_ORIENTATION) Log.v(TAG,
+                                if (DEBUG_ORIENTATION) Slog.v(TAG,
                                         "Resizing while display frozen: " + w);
                                 w.mOrientationChanging = true;
                                 if (!mWindowsFreezingScreen) {
@@ -10070,7 +10094,7 @@
                             // to go through the process of getting informed
                             // by the application when it has finished drawing.
                             if (w.mOrientationChanging) {
-                                if (DEBUG_ORIENTATION) Log.v(TAG,
+                                if (DEBUG_ORIENTATION) Slog.v(TAG,
                                         "Orientation start waiting for draw in "
                                         + w + ", surface " + w.mSurface);
                                 w.mDrawPending = true;
@@ -10080,12 +10104,12 @@
                                     w.mAppToken.allDrawn = false;
                                 }
                             }
-                            if (DEBUG_ORIENTATION) Log.v(TAG,
+                            if (DEBUG_ORIENTATION) Slog.v(TAG,
                                     "Resizing window " + w + " to " + w.mFrame);
                             mResizingWindows.add(w);
                         } else if (w.mOrientationChanging) {
                             if (!w.mDrawPending && !w.mCommitDrawPending) {
-                                if (DEBUG_ORIENTATION) Log.v(TAG,
+                                if (DEBUG_ORIENTATION) Slog.v(TAG,
                                         "Orientation not waiting for draw in "
                                         + w + ", surface " + w.mSurface);
                                 w.mOrientationChanging = false;
@@ -10097,13 +10121,13 @@
                         if (!w.mLastHidden) {
                             //dump();
                             w.mLastHidden = true;
-                            if (SHOW_TRANSACTIONS) Log.i(
+                            if (SHOW_TRANSACTIONS) Slog.i(
                                     TAG, "  SURFACE " + w.mSurface + ": HIDE (performLayout)");
                             if (w.mSurface != null) {
                                 try {
                                     w.mSurface.hide();
                                 } catch (RuntimeException e) {
-                                    Log.w(TAG, "Exception hiding surface in " + w);
+                                    Slog.w(TAG, "Exception hiding surface in " + w);
                                 }
                             }
                             mKeyWaiter.releasePendingPointerLocked(w.mSession);
@@ -10116,7 +10140,7 @@
                         // new orientation.
                         if (w.mOrientationChanging) {
                             w.mOrientationChanging = false;
-                            if (DEBUG_ORIENTATION) Log.v(TAG,
+                            if (DEBUG_ORIENTATION) Slog.v(TAG,
                                     "Orientation change skips hidden " + w);
                         }
                     } else if (w.mLastLayer != w.mAnimLayer
@@ -10137,7 +10161,7 @@
                         w.mLastDtDy = w.mDtDy;
                         w.mLastHScale = w.mHScale;
                         w.mLastVScale = w.mVScale;
-                        if (SHOW_TRANSACTIONS) Log.i(
+                        if (SHOW_TRANSACTIONS) Slog.i(
                                 TAG, "  SURFACE " + w.mSurface + ": alpha="
                                 + w.mShownAlpha + " layer=" + w.mAnimLayer
                                 + " matrix=[" + (w.mDsDx*w.mHScale)
@@ -10152,7 +10176,7 @@
                                         w.mDsDx*w.mHScale, w.mDtDx*w.mVScale,
                                         w.mDsDy*w.mHScale, w.mDtDy*w.mVScale);
                             } catch (RuntimeException e) {
-                                Log.w(TAG, "Error updating surface in " + w, e);
+                                Slog.w(TAG, "Error updating surface in " + w, e);
                                 if (!recoveringMemory) {
                                     reclaimSomeSurfaceMemoryLocked(w, "update");
                                 }
@@ -10162,9 +10186,9 @@
                         if (w.mLastHidden && !w.mDrawPending
                                 && !w.mCommitDrawPending
                                 && !w.mReadyToShow) {
-                            if (SHOW_TRANSACTIONS) Log.i(
+                            if (SHOW_TRANSACTIONS) Slog.i(
                                     TAG, "  SURFACE " + w.mSurface + ": SHOW (performLayout)");
-                            if (DEBUG_VISIBILITY) Log.v(TAG, "Showing " + w
+                            if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w
                                     + " during relayout");
                             if (showSurfaceRobustlyLocked(w)) {
                                 w.mHasDrawn = true;
@@ -10190,18 +10214,18 @@
                         if (w.mOrientationChanging) {
                             if (w.mDrawPending || w.mCommitDrawPending) {
                                 orientationChangeComplete = false;
-                                if (DEBUG_ORIENTATION) Log.v(TAG,
+                                if (DEBUG_ORIENTATION) Slog.v(TAG,
                                         "Orientation continue waiting for draw in " + w);
                             } else {
                                 w.mOrientationChanging = false;
-                                if (DEBUG_ORIENTATION) Log.v(TAG,
+                                if (DEBUG_ORIENTATION) Slog.v(TAG,
                                         "Orientation change complete in " + w);
                             }
                         }
                         w.mToken.hasVisible = true;
                     }
                 } else if (w.mOrientationChanging) {
-                    if (DEBUG_ORIENTATION) Log.v(TAG,
+                    if (DEBUG_ORIENTATION) Slog.v(TAG,
                             "Orientation change skips hidden " + w);
                     w.mOrientationChanging = false;
                 }
@@ -10242,17 +10266,18 @@
                         // performance reasons).
                         obscured = true;
                     } else if (opaqueDrawn && w.needsBackgroundFiller(dw, dh)) {
-                        if (SHOW_TRANSACTIONS) Log.d(TAG, "showing background filler");
+                        if (SHOW_TRANSACTIONS) Slog.d(TAG, "showing background filler");
                         // This window is in compatibility mode, and needs background filler.
                         obscured = true;
                         if (mBackgroundFillerSurface == null) {
                             try {
                                 mBackgroundFillerSurface = new Surface(mFxSession, 0,
+                                        "BackGroundFiller",
                                         0, dw, dh,
                                         PixelFormat.OPAQUE,
                                         Surface.FX_SURFACE_NORMAL);
                             } catch (Exception e) {
-                                Log.e(TAG, "Exception creating filler surface", e);
+                                Slog.e(TAG, "Exception creating filler surface", e);
                             }
                         }
                         try {
@@ -10263,19 +10288,19 @@
                             mBackgroundFillerSurface.setLayer(w.mAnimLayer - 1);
                             mBackgroundFillerSurface.show();
                         } catch (RuntimeException e) {
-                            Log.e(TAG, "Exception showing filler surface");
+                            Slog.e(TAG, "Exception showing filler surface");
                         }
                         backgroundFillerShown = true;
                         mBackgroundFillerShown = true;
                     } else if (canBeSeen && !obscured &&
                             (attrFlags&FLAG_BLUR_BEHIND|FLAG_DIM_BEHIND) != 0) {
-                        if (localLOGV) Log.v(TAG, "Win " + w
+                        if (localLOGV) Slog.v(TAG, "Win " + w
                                 + ": blurring=" + blurring
                                 + " obscured=" + obscured
                                 + " displayed=" + displayed);
                         if ((attrFlags&FLAG_DIM_BEHIND) != 0) {
                             if (!dimming) {
-                                //Log.i(TAG, "DIM BEHIND: " + w);
+                                //Slog.i(TAG, "DIM BEHIND: " + w);
                                 dimming = true;
                                 if (mDimAnimator == null) {
                                     mDimAnimator = new DimAnimator(mFxSession);
@@ -10286,22 +10311,23 @@
                         }
                         if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
                             if (!blurring) {
-                                //Log.i(TAG, "BLUR BEHIND: " + w);
+                                //Slog.i(TAG, "BLUR BEHIND: " + w);
                                 blurring = true;
                                 mBlurShown = true;
                                 if (mBlurSurface == null) {
-                                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  BLUR "
+                                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
                                             + mBlurSurface + ": CREATE");
                                     try {
                                         mBlurSurface = new Surface(mFxSession, 0,
+                                                "BlurSurface",
                                                 -1, 16, 16,
                                                 PixelFormat.OPAQUE,
                                                 Surface.FX_SURFACE_BLUR);
                                     } catch (Exception e) {
-                                        Log.e(TAG, "Exception creating Blur surface", e);
+                                        Slog.e(TAG, "Exception creating Blur surface", e);
                                     }
                                 }
-                                if (SHOW_TRANSACTIONS) Log.i(TAG, "  BLUR "
+                                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR "
                                         + mBlurSurface + ": SHOW pos=(0,0) (" +
                                         dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
                                 if (mBlurSurface != null) {
@@ -10310,7 +10336,7 @@
                                     try {
                                         mBlurSurface.show();
                                     } catch (RuntimeException e) {
-                                        Log.w(TAG, "Failure showing blur surface", e);
+                                        Slog.w(TAG, "Failure showing blur surface", e);
                                     }
                                 }
                             }
@@ -10329,11 +10355,11 @@
 
             if (backgroundFillerShown == false && mBackgroundFillerShown) {
                 mBackgroundFillerShown = false;
-                if (SHOW_TRANSACTIONS) Log.d(TAG, "hiding background filler");
+                if (SHOW_TRANSACTIONS) Slog.d(TAG, "hiding background filler");
                 try {
                     mBackgroundFillerSurface.hide();
                 } catch (RuntimeException e) {
-                    Log.e(TAG, "Exception hiding filler surface", e);
+                    Slog.e(TAG, "Exception hiding filler surface", e);
                 }
             }
 
@@ -10343,24 +10369,24 @@
             }
 
             if (!blurring && mBlurShown) {
-                if (SHOW_TRANSACTIONS) Log.i(TAG, "  BLUR " + mBlurSurface
+                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  BLUR " + mBlurSurface
                         + ": HIDE");
                 try {
                     mBlurSurface.hide();
                 } catch (IllegalArgumentException e) {
-                    Log.w(TAG, "Illegal argument exception hiding blur surface");
+                    Slog.w(TAG, "Illegal argument exception hiding blur surface");
                 }
                 mBlurShown = false;
             }
 
-            if (SHOW_TRANSACTIONS) Log.i(TAG, "<<< CLOSE TRANSACTION");
+            if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION");
         } catch (RuntimeException e) {
-            Log.e(TAG, "Unhandled exception in Window Manager", e);
+            Slog.e(TAG, "Unhandled exception in Window Manager", e);
         }
 
         Surface.closeTransaction();
 
-        if (DEBUG_ORIENTATION && mDisplayFrozen) Log.v(TAG,
+        if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG,
                 "With display frozen, orientationChangeComplete="
                 + orientationChangeComplete);
         if (orientationChangeComplete) {
@@ -10377,7 +10403,7 @@
                 i--;
                 WindowState win = mResizingWindows.get(i);
                 try {
-                    if (DEBUG_ORIENTATION) Log.v(TAG, "Reporting new frame to "
+                    if (DEBUG_ORIENTATION) Slog.v(TAG, "Reporting new frame to "
                             + win + ": " + win.mFrame);
                     boolean configChanged =
                         win.mConfiguration != mCurConfiguration
@@ -10385,7 +10411,7 @@
                                 || mCurConfiguration.diff(win.mConfiguration) != 0);
                     win.mConfiguration = mCurConfiguration;
                     if (DEBUG_ORIENTATION && configChanged) {
-                        Log.i(TAG, "Sending new config to window " + win + ": "
+                        Slog.i(TAG, "Sending new config to window " + win + ": "
                                 + win.mFrame.width() + "x" + win.mFrame.height()
                                 + " / " + win.mConfiguration);
                     }
@@ -10497,6 +10523,7 @@
         }
 
         if (mTurnOnScreen) {
+            if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
             mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
                     LocalPowerManager.BUTTON_EVENT, true);
             mTurnOnScreen = false;
@@ -10527,13 +10554,15 @@
             if (win.mSurface != null) {
                 win.mSurface.show();
                 if (win.mTurnOnScreen) {
+                    if (DEBUG_VISIBILITY) Slog.v(TAG,
+                            "Show surface turning screen on: " + win);
                     win.mTurnOnScreen = false;
                     mTurnOnScreen = true;
                 }
             }
             return true;
         } catch (RuntimeException e) {
-            Log.w(TAG, "Failure showing surface " + win.mSurface + " in " + win);
+            Slog.w(TAG, "Failure showing surface " + win.mSurface + " in " + win);
         }
 
         reclaimSomeSurfaceMemoryLocked(win, "show");
@@ -10558,12 +10587,12 @@
             // around.
             int N = mWindows.size();
             boolean leakedSurface = false;
-            Log.i(TAG, "Out of memory for surface!  Looking for leaks...");
+            Slog.i(TAG, "Out of memory for surface!  Looking for leaks...");
             for (int i=0; i<N; i++) {
                 WindowState ws = (WindowState)mWindows.get(i);
                 if (ws.mSurface != null) {
                     if (!mSessions.contains(ws.mSession)) {
-                        Log.w(TAG, "LEAKED SURFACE (session doesn't exist): "
+                        Slog.w(TAG, "LEAKED SURFACE (session doesn't exist): "
                                 + ws + " surface=" + ws.mSurface
                                 + " token=" + win.mToken
                                 + " pid=" + ws.mSession.mPid
@@ -10575,7 +10604,7 @@
                         N--;
                         leakedSurface = true;
                     } else if (win.mAppToken != null && win.mAppToken.clientHidden) {
-                        Log.w(TAG, "LEAKED SURFACE (app token hidden): "
+                        Slog.w(TAG, "LEAKED SURFACE (app token hidden): "
                                 + ws + " surface=" + ws.mSurface
                                 + " token=" + win.mAppToken);
                         ws.mSurface.destroy();
@@ -10587,7 +10616,7 @@
 
             boolean killedApps = false;
             if (!leakedSurface) {
-                Log.w(TAG, "No leaked surfaces; killing applicatons!");
+                Slog.w(TAG, "No leaked surfaces; killing applicatons!");
                 SparseIntArray pidCandidates = new SparseIntArray();
                 for (int i=0; i<N; i++) {
                     WindowState ws = (WindowState)mWindows.get(i);
@@ -10612,7 +10641,7 @@
             if (leakedSurface || killedApps) {
                 // We managed to reclaim some memory, so get rid of the trouble
                 // surface and ask the app to request another one.
-                Log.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
+                Slog.w(TAG, "Looks like we have reclaimed some memory, clearing surface for retry.");
                 if (surface != null) {
                     surface.destroy();
                     win.mSurface = null;
@@ -10635,7 +10664,7 @@
             // change message pending.
             mH.removeMessages(H.REPORT_FOCUS_CHANGE);
             mH.sendEmptyMessage(H.REPORT_FOCUS_CHANGE);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Changing focus from " + mCurrentFocus + " to " + newFocus);
             final WindowState oldFocus = mCurrentFocus;
             mCurrentFocus = newFocus;
@@ -10677,7 +10706,7 @@
         while (i >= 0) {
             win = (WindowState)mWindows.get(i);
 
-            if (localLOGV || DEBUG_FOCUS) Log.v(
+            if (localLOGV || DEBUG_FOCUS) Slog.v(
                 TAG, "Looking for focus: " + i
                 + " = " + win
                 + ", flags=" + win.mAttrs.flags
@@ -10701,7 +10730,7 @@
                     if (nextApp == mFocusedApp) {
                         // Whoops, we are below the focused app...  no focus
                         // for you!
-                        if (localLOGV || DEBUG_FOCUS) Log.v(
+                        if (localLOGV || DEBUG_FOCUS) Slog.v(
                             TAG, "Reached focused app: " + mFocusedApp);
                         return null;
                     }
@@ -10722,7 +10751,7 @@
 
             // Dispatch to this window if it is wants key events.
             if (win.canReceiveKeys()) {
-                if (DEBUG_FOCUS) Log.v(
+                if (DEBUG_FOCUS) Slog.v(
                         TAG, "Found focus @ " + i + " = " + win);
                 result = win;
                 break;
@@ -10751,10 +10780,10 @@
         mScreenFrozenLock.acquire();
 
         long now = SystemClock.uptimeMillis();
-        //Log.i(TAG, "Freezing, gc pending: " + mFreezeGcPending + ", now " + now);
+        //Slog.i(TAG, "Freezing, gc pending: " + mFreezeGcPending + ", now " + now);
         if (mFreezeGcPending != 0) {
             if (now > (mFreezeGcPending+1000)) {
-                //Log.i(TAG, "Gc!  " + now + " > " + (mFreezeGcPending+1000));
+                //Slog.i(TAG, "Gc!  " + now + " > " + (mFreezeGcPending+1000));
                 mH.removeMessages(H.FORCE_GC);
                 Runtime.getRuntime().gc();
                 mFreezeGcPending = now;
@@ -10822,6 +10851,10 @@
             return;
         }
 
+        pw.println("Input State:");
+        mQueue.dump(pw, "  ");
+        pw.println(" ");
+        
         synchronized(mWindowMap) {
             pw.println("Current Window Manager state:");
             for (int i=mWindows.size()-1; i>=0; i--) {
@@ -10985,7 +11018,7 @@
             if (mDimAnimator != null) {
                 mDimAnimator.printTo(pw);
             } else {
-                pw.print( "  no DimAnimator ");
+                pw.println( "  no DimAnimator ");
             }
             pw.print("  mInputMethodAnimLayerAdjustment=");
                     pw.print(mInputMethodAnimLayerAdjustment);
@@ -11070,13 +11103,15 @@
 
         DimAnimator (SurfaceSession session) {
             if (mDimSurface == null) {
-                if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM "
                         + mDimSurface + ": CREATE");
                 try {
-                    mDimSurface = new Surface(session, 0, -1, 16, 16, PixelFormat.OPAQUE,
+                    mDimSurface = new Surface(session, 0,
+                            "DimSurface",
+                            -1, 16, 16, PixelFormat.OPAQUE,
                             Surface.FX_SURFACE_DIM);
                 } catch (Exception e) {
-                    Log.e(TAG, "Exception creating Dim surface", e);
+                    Slog.e(TAG, "Exception creating Dim surface", e);
                 }
             }
         }
@@ -11085,7 +11120,7 @@
          * Show the dim surface.
          */
         void show(int dw, int dh) {
-            if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface + ": SHOW pos=(0,0) (" +
+            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM " + mDimSurface + ": SHOW pos=(0,0) (" +
                     dw + "x" + dh + ")");
             mDimShown = true;
             try {
@@ -11093,7 +11128,7 @@
                 mDimSurface.setSize(dw, dh);
                 mDimSurface.show();
             } catch (RuntimeException e) {
-                Log.w(TAG, "Failure showing dim surface", e);
+                Slog.w(TAG, "Failure showing dim surface", e);
             }
         }
 
@@ -11105,7 +11140,7 @@
             mDimSurface.setLayer(w.mAnimLayer-1);
 
             final float target = w.mExiting ? 0 : w.mAttrs.dimAmount;
-            if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface
+            if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM " + mDimSurface
                     + ": layer=" + (w.mAnimLayer-1) + " target=" + target);
             if (mDimTargetAlpha != target) {
                 // If the desired dim level has changed, then
@@ -11165,7 +11200,7 @@
 
                 // Do we need to continue animating?
                 if (more) {
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM "
                             + mDimSurface + ": alpha=" + mDimCurrentAlpha);
                     mLastDimAnimTime = currentTime;
                     mDimSurface.setAlpha(mDimCurrentAlpha);
@@ -11173,16 +11208,16 @@
                 } else {
                     mDimCurrentAlpha = mDimTargetAlpha;
                     mLastDimAnimTime = 0;
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                    if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM "
                             + mDimSurface + ": final alpha=" + mDimCurrentAlpha);
                     mDimSurface.setAlpha(mDimCurrentAlpha);
                     if (!dimming) {
-                        if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface
+                        if (SHOW_TRANSACTIONS) Slog.i(TAG, "  DIM " + mDimSurface
                                 + ": HIDE");
                         try {
                             mDimSurface.hide();
                         } catch (RuntimeException e) {
-                            Log.w(TAG, "Illegal argument exception hiding dim surface");
+                            Slog.w(TAG, "Illegal argument exception hiding dim surface");
                         }
                         mDimShown = false;
                     }
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 7b64704..2c82d9c 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -35,6 +35,7 @@
 import android.app.ApplicationErrorReport;
 import android.app.Dialog;
 import android.app.IActivityController;
+import android.app.IActivityManager;
 import android.app.IActivityWatcher;
 import android.app.IApplicationThread;
 import android.app.IInstrumentationWatcher;
@@ -96,6 +97,7 @@
 import android.provider.Settings;
 import android.util.Config;
 import android.util.EventLog;
+import android.util.Slog;
 import android.util.Log;
 import android.util.PrintWriterPrinter;
 import android.util.SparseArray;
@@ -388,6 +390,18 @@
             = new ArrayList<PendingActivityLaunch>();
     
     /**
+     * List of people waiting to find out about the next launched activity.
+     */
+    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched
+            = new ArrayList<IActivityManager.WaitResult>();
+    
+    /**
+     * List of people waiting to find out about the next visible activity.
+     */
+    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible
+            = new ArrayList<IActivityManager.WaitResult>();
+    
+    /**
      * List of all active broadcasts that are to be executed immediately
      * (without waiting for another broadcast to finish).  Currently this only
      * contains broadcasts to registered receivers, to avoid spinning up
@@ -929,7 +943,7 @@
 
         AppDeathRecipient(ProcessRecord app, int pid,
                 IApplicationThread thread) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "New death recipient " + this
                 + " for thread " + thread.asBinder());
             mApp = app;
@@ -938,7 +952,7 @@
         }
 
         public void binderDied() {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Death received in " + this
                 + " for thread " + mAppThread.asBinder());
             removeRequestedPss(mApp);
@@ -975,7 +989,7 @@
 
     final Handler mHandler = new Handler() {
         //public Handler() {
-        //    if (localLOGV) Log.v(TAG, "Handler started!");
+        //    if (localLOGV) Slog.v(TAG, "Handler started!");
         //}
 
         public void handleMessage(Message msg) {
@@ -985,7 +999,7 @@
                 synchronized (ActivityManagerService.this) {
                     ProcessRecord proc = (ProcessRecord)data.get("app");
                     if (proc != null && proc.crashDialog != null) {
-                        Log.e(TAG, "App already has crash dialog: " + proc);
+                        Slog.e(TAG, "App already has crash dialog: " + proc);
                         return;
                     }
                     AppErrorResult res = (AppErrorResult) data.get("result");
@@ -1007,7 +1021,7 @@
                     HashMap data = (HashMap) msg.obj;
                     ProcessRecord proc = (ProcessRecord)data.get("app");
                     if (proc != null && proc.anrDialog != null) {
-                        Log.e(TAG, "App already has anr dialog: " + proc);
+                        Slog.e(TAG, "App already has anr dialog: " + proc);
                         return;
                     }
                     
@@ -1059,7 +1073,7 @@
                 }
             } break;
             case BROADCAST_INTENT_MSG: {
-                if (DEBUG_BROADCAST) Log.v(
+                if (DEBUG_BROADCAST) Slog.v(
                         TAG, "Received BROADCAST_INTENT_MSG");
                 processNextBroadcast(true);
             } break;
@@ -1076,7 +1090,7 @@
                 IBinder token = (IBinder)msg.obj;
                 // We don't at this point know if the activity is fullscreen,
                 // so we need to be conservative and assume it isn't.
-                Log.w(TAG, "Activity pause timeout for " + token);
+                Slog.w(TAG, "Activity pause timeout for " + token);
                 activityPaused(token, null, true);
             } break;
             case IDLE_TIMEOUT_MSG: {
@@ -1090,14 +1104,14 @@
                 // We don't at this point know if the activity is fullscreen,
                 // so we need to be conservative and assume it isn't.
                 IBinder token = (IBinder)msg.obj;
-                Log.w(TAG, "Activity idle timeout for " + token);
+                Slog.w(TAG, "Activity idle timeout for " + token);
                 activityIdleInternal(token, true, null);
             } break;
             case DESTROY_TIMEOUT_MSG: {
                 IBinder token = (IBinder)msg.obj;
                 // We don't at this point know if the activity is fullscreen,
                 // so we need to be conservative and assume it isn't.
-                Log.w(TAG, "Activity destroy timeout for " + token);
+                Slog.w(TAG, "Activity destroy timeout for " + token);
                 activityDestroyed(token);
             } break;
             case IDLE_NOW_MSG: {
@@ -1122,7 +1136,7 @@
                             try {
                                 r.thread.updateTimeZone();
                             } catch (RemoteException ex) {
-                                Log.w(TAG, "Failed to update time zone for: " + r.info.processName);
+                                Slog.w(TAG, "Failed to update time zone for: " + r.info.processName);
                             }
                         }
                     }
@@ -1155,7 +1169,7 @@
                 }
                 synchronized (ActivityManagerService.this) {
                     if (mLaunchingActivity.isHeld()) {
-                        Log.w(TAG, "Launch timeout has expired, giving up wake lock!");
+                        Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
                         mLaunchingActivity.release();
                     }
                 }
@@ -1378,7 +1392,7 @@
             mSimpleProcessManagement = true;
         }
 
-        Log.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
+        Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass());
         
         File dataDir = Environment.getDataDirectory();
         File systemDir = new File(dataDir, "system");
@@ -1410,7 +1424,7 @@
                                 final long now = SystemClock.uptimeMillis();
                                 long nextCpuDelay = (mLastCpuTime+MONITOR_CPU_MAX_TIME)-now;
                                 long nextWriteDelay = (mLastWriteTime+BATTERY_STATS_TIME)-now;
-                                //Log.i(TAG, "Cpu delay=" + nextCpuDelay
+                                //Slog.i(TAG, "Cpu delay=" + nextCpuDelay
                                 //        + ", write delay=" + nextWriteDelay);
                                 if (nextWriteDelay < nextCpuDelay) {
                                     nextCpuDelay = nextWriteDelay;
@@ -1424,7 +1438,7 @@
                         
                         updateCpuStatsNow();
                     } catch (Exception e) {
-                        Log.e(TAG, "Unexpected exception collecting process stats", e);
+                        Slog.e(TAG, "Unexpected exception collecting process stats", e);
                     }
                 }
             }
@@ -1441,7 +1455,7 @@
             // The activity manager only throws security exceptions, so let's
             // log all others.
             if (!(e instanceof SecurityException)) {
-                Log.e(TAG, "Activity Manager Crash", e);
+                Slog.e(TAG, "Activity Manager Crash", e);
             }
             throw e;
         }
@@ -1466,11 +1480,11 @@
                 mLastCpuTime = now;
                 haveNewCpuStats = true;
                 mProcessStats.update();
-                //Log.i(TAG, mProcessStats.printCurrentState());
-                //Log.i(TAG, "Total CPU usage: "
+                //Slog.i(TAG, mProcessStats.printCurrentState());
+                //Slog.i(TAG, "Total CPU usage: "
                 //        + mProcessStats.getTotalCpuPercent() + "%");
 
-                // Log the cpu usage if the property is set.
+                // Slog the cpu usage if the property is set.
                 if ("true".equals(SystemProperties.get("events.cpu"))) {
                     int user = mProcessStats.getLastUserTime();
                     int system = mProcessStats.getLastSystemTime();
@@ -1601,7 +1615,7 @@
             mLruProcesses.add(0, app);
         }
         
-        //Log.i(TAG, "Putting proc to front: " + app.processName);
+        //Slog.i(TAG, "Putting proc to front: " + app.processName);
         if (oomAdj) {
             updateOomAdjLocked();
         }
@@ -1712,7 +1726,7 @@
 
         r.app = app;
 
-        if (localLOGV) Log.v(TAG, "Launching: " + r);
+        if (localLOGV) Slog.v(TAG, "Launching: " + r);
 
         int idx = app.activities.indexOf(r);
         if (idx < 0) {
@@ -1730,7 +1744,7 @@
                 results = r.results;
                 newIntents = r.newIntents;
             }
-            if (DEBUG_SWITCH) Log.v(TAG, "Launching: " + r
+            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
                     + " icicle=" + r.icicle
                     + " with results=" + results + " newIntents=" + newIntents
                     + " andResume=" + andResume);
@@ -1751,7 +1765,7 @@
             if (r.launchFailed) {
                 // This is the second time we failed -- finish activity
                 // and give up.
-                Log.e(TAG, "Second failure launching "
+                Slog.e(TAG, "Second failure launching "
                       + r.intent.getComponent().flattenToShortString()
                       + ", giving up", e);
                 appDiedLocked(app, app.pid, app.thread);
@@ -1768,7 +1782,7 @@
 
         r.launchFailed = false;
         if (updateLRUListLocked(r)) {
-            Log.w(TAG, "Activity " + r
+            Slog.w(TAG, "Activity " + r
                   + " being launched, but already in LRU list");
         }
 
@@ -1821,7 +1835,7 @@
                 realStartActivityLocked(r, app, andResume, checkConfig);
                 return;
             } catch (RemoteException e) {
-                Log.w(TAG, "Exception when starting activity "
+                Slog.w(TAG, "Exception when starting activity "
                         + r.intent.getComponent().flattenToShortString(), e);
             }
 
@@ -1843,15 +1857,20 @@
         //     object attached to it so we know it couldn't have crashed; and
         // (3) There is a pid assigned to it, so it is either starting or
         //     already running.
-        if (DEBUG_PROCESSES) Log.v(TAG, "startProcess: name=" + processName
+        if (DEBUG_PROCESSES) Slog.v(TAG, "startProcess: name=" + processName
                 + " app=" + app + " knownToBeDead=" + knownToBeDead
                 + " thread=" + (app != null ? app.thread : null)
                 + " pid=" + (app != null ? app.pid : -1));
-        if (app != null &&
-                (!knownToBeDead || app.thread == null) && app.pid > 0) {
-            return app;
+        if (app != null && app.pid > 0) {
+            if (!knownToBeDead || app.thread == null) {
+                return app;
+            } else {
+                // An application record is attached to a previous process,
+                // clean it up now.
+                handleAppDiedLocked(app, true);
+            }
         }
-        
+
         String hostingNameStr = hostingName != null
                 ? hostingName.flattenToShortString() : null;
         
@@ -1928,7 +1947,7 @@
                 gids = mContext.getPackageManager().getPackageGids(
                         app.info.packageName);
             } catch (PackageManager.NameNotFoundException e) {
-                Log.w(TAG, "Unable to retrieve gids", e);
+                Slog.w(TAG, "Unable to retrieve gids", e);
             }
             if (mFactoryTest != SystemServer.FACTORY_TEST_OFF) {
                 if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL
@@ -1998,7 +2017,7 @@
                 }
             }
             buf.append("}");
-            Log.i(TAG, buf.toString());
+            Slog.i(TAG, buf.toString());
             if (pid == 0 || pid == MY_PID) {
                 // Processes are being emulated with threads.
                 app.pid = MY_PID;
@@ -2018,29 +2037,29 @@
                 RuntimeException e = new RuntimeException(
                         "Failure starting process " + app.processName
                         + ": returned pid=" + pid);
-                Log.e(TAG, e.getMessage(), e);
+                Slog.e(TAG, e.getMessage(), e);
             }
         } catch (RuntimeException e) {
             // XXX do better error recovery.
             app.pid = 0;
-            Log.e(TAG, "Failure starting process " + app.processName, e);
+            Slog.e(TAG, "Failure starting process " + app.processName, e);
         }
     }
 
     private final void startPausingLocked(boolean userLeaving, boolean uiSleeping) {
         if (mPausingActivity != null) {
             RuntimeException e = new RuntimeException();
-            Log.e(TAG, "Trying to pause when pause is already pending for "
+            Slog.e(TAG, "Trying to pause when pause is already pending for "
                   + mPausingActivity, e);
         }
         HistoryRecord prev = mResumedActivity;
         if (prev == null) {
             RuntimeException e = new RuntimeException();
-            Log.e(TAG, "Trying to pause when nothing is resumed", e);
+            Slog.e(TAG, "Trying to pause when nothing is resumed", e);
             resumeTopActivityLocked(null);
             return;
         }
-        if (DEBUG_PAUSE) Log.v(TAG, "Start pausing: " + prev);
+        if (DEBUG_PAUSE) Slog.v(TAG, "Start pausing: " + prev);
         mResumedActivity = null;
         mPausingActivity = prev;
         mLastPausedActivity = prev;
@@ -2050,7 +2069,7 @@
         updateCpuStats();
         
         if (prev.app != null && prev.app.thread != null) {
-            if (DEBUG_PAUSE) Log.v(TAG, "Enqueueing pending pause: " + prev);
+            if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending pause: " + prev);
             try {
                 EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
                         System.identityHashCode(prev),
@@ -2060,7 +2079,7 @@
                 updateUsageStats(prev, false);
             } catch (Exception e) {
                 // Ignore exception, if process died other code will cleanup.
-                Log.w(TAG, "Exception thrown during pause", e);
+                Slog.w(TAG, "Exception thrown during pause", e);
                 mPausingActivity = null;
                 mLastPausedActivity = null;
             }
@@ -2089,7 +2108,7 @@
             if (!uiSleeping) {
                 prev.pauseKeyDispatchingLocked();
             } else {
-                if (DEBUG_PAUSE) Log.v(TAG, "Key dispatch not paused for screen off");
+                if (DEBUG_PAUSE) Slog.v(TAG, "Key dispatch not paused for screen off");
             }
 
             // Schedule a pause timeout in case the app doesn't respond.
@@ -2098,29 +2117,29 @@
             Message msg = mHandler.obtainMessage(PAUSE_TIMEOUT_MSG);
             msg.obj = prev;
             mHandler.sendMessageDelayed(msg, PAUSE_TIMEOUT);
-            if (DEBUG_PAUSE) Log.v(TAG, "Waiting for pause to complete...");
+            if (DEBUG_PAUSE) Slog.v(TAG, "Waiting for pause to complete...");
         } else {
             // This activity failed to schedule the
             // pause, so just treat it as being paused now.
-            if (DEBUG_PAUSE) Log.v(TAG, "Activity not running, resuming next.");
+            if (DEBUG_PAUSE) Slog.v(TAG, "Activity not running, resuming next.");
             resumeTopActivityLocked(null);
         }
     }
 
     private final void completePauseLocked() {
         HistoryRecord prev = mPausingActivity;
-        if (DEBUG_PAUSE) Log.v(TAG, "Complete pause: " + prev);
+        if (DEBUG_PAUSE) Slog.v(TAG, "Complete pause: " + prev);
         
         if (prev != null) {
             if (prev.finishing) {
-                if (DEBUG_PAUSE) Log.v(TAG, "Executing finish of activity: " + prev);
+                if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of activity: " + prev);
                 prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE);
             } else if (prev.app != null) {
-                if (DEBUG_PAUSE) Log.v(TAG, "Enqueueing pending stop: " + prev);
+                if (DEBUG_PAUSE) Slog.v(TAG, "Enqueueing pending stop: " + prev);
                 if (prev.waitingVisible) {
                     prev.waitingVisible = false;
                     mWaitingVisibleActivities.remove(prev);
-                    if (DEBUG_SWITCH || DEBUG_PAUSE) Log.v(
+                    if (DEBUG_SWITCH || DEBUG_PAUSE) Slog.v(
                             TAG, "Complete pause, no longer waiting: " + prev);
                 }
                 if (prev.configDestroy) {
@@ -2129,7 +2148,7 @@
                     // To juggle the fact that we are also starting a new
                     // instance right now, we need to first completely stop
                     // the current instance before starting the new one.
-                    if (DEBUG_PAUSE) Log.v(TAG, "Destroying after pause: " + prev);
+                    if (DEBUG_PAUSE) Slog.v(TAG, "Destroying after pause: " + prev);
                     destroyActivityLocked(prev, true);
                 } else {
                     mStoppingActivities.add(prev);
@@ -2137,14 +2156,14 @@
                         // If we already have a few activities waiting to stop,
                         // then give up on things going idle and start clearing
                         // them out.
-                        if (DEBUG_PAUSE) Log.v(TAG, "To many pending stops, forcing idle");
+                        if (DEBUG_PAUSE) Slog.v(TAG, "To many pending stops, forcing idle");
                         Message msg = Message.obtain();
                         msg.what = ActivityManagerService.IDLE_NOW_MSG;
                         mHandler.sendMessage(msg);
                     }
                 }
             } else {
-                if (DEBUG_PAUSE) Log.v(TAG, "App died during pause, not stopping: " + prev);
+                if (DEBUG_PAUSE) Slog.v(TAG, "App died during pause, not stopping: " + prev);
                 prev = null;
             }
             mPausingActivity = null;
@@ -2237,7 +2256,7 @@
      */
     private final void ensureActivitiesVisibleLocked(HistoryRecord top,
             HistoryRecord starting, String onlyThisProcess, int configChanges) {
-        if (DEBUG_VISBILITY) Log.v(
+        if (DEBUG_VISBILITY) Slog.v(
                 TAG, "ensureActivitiesVisible behind " + top
                 + " configChanges=0x" + Integer.toHexString(configChanges));
 
@@ -2252,7 +2271,7 @@
         boolean behindFullscreen = false;
         for (; i>=0; i--) {
             r = (HistoryRecord)mHistory.get(i);
-            if (DEBUG_VISBILITY) Log.v(
+            if (DEBUG_VISBILITY) Slog.v(
                     TAG, "Make visible? " + r + " finishing=" + r.finishing
                     + " state=" + r.state);
             if (r.finishing) {
@@ -2274,13 +2293,13 @@
                     // This activity needs to be visible, but isn't even
                     // running...  get it started, but don't resume it
                     // at this point.
-                    if (DEBUG_VISBILITY) Log.v(
+                    if (DEBUG_VISBILITY) Slog.v(
                             TAG, "Start and freeze screen for " + r);
                     if (r != starting) {
                         r.startFreezingScreenLocked(r.app, configChanges);
                     }
                     if (!r.visible) {
-                        if (DEBUG_VISBILITY) Log.v(
+                        if (DEBUG_VISBILITY) Slog.v(
                                 TAG, "Starting and making visible: " + r);
                         mWindowManager.setAppVisibility(r, true);
                     }
@@ -2292,7 +2311,7 @@
             } else if (r.visible) {
                 // If this activity is already visible, then there is nothing
                 // else to do here.
-                if (DEBUG_VISBILITY) Log.v(
+                if (DEBUG_VISBILITY) Slog.v(
                         TAG, "Skipping: already visible at " + r);
                 r.stopFreezingScreenLocked(false);
 
@@ -2303,7 +2322,7 @@
                 if (r.state != ActivityState.RESUMED && r != starting) {
                     // If this activity is paused, tell it
                     // to now show its window.
-                    if (DEBUG_VISBILITY) Log.v(
+                    if (DEBUG_VISBILITY) Slog.v(
                             TAG, "Making visible and scheduling visibility: " + r);
                     try {
                         mWindowManager.setAppVisibility(r, true);
@@ -2312,7 +2331,7 @@
                     } catch (Exception e) {
                         // Just skip on any failure; we'll make it
                         // visible when it next restarts.
-                        Log.w(TAG, "Exception thrown making visibile: "
+                        Slog.w(TAG, "Exception thrown making visibile: "
                                 + r.intent.getComponent(), e);
                     }
                 }
@@ -2323,7 +2342,7 @@
 
             if (r.fullscreen) {
                 // At this point, nothing else needs to be shown
-                if (DEBUG_VISBILITY) Log.v(
+                if (DEBUG_VISBILITY) Slog.v(
                         TAG, "Stopping: fullscreen at " + r);
                 behindFullscreen = true;
                 i--;
@@ -2335,14 +2354,14 @@
         // sure they no longer are keeping the screen frozen.
         while (i >= 0) {
             r = (HistoryRecord)mHistory.get(i);
-            if (DEBUG_VISBILITY) Log.v(
+            if (DEBUG_VISBILITY) Slog.v(
                     TAG, "Make invisible? " + r + " finishing=" + r.finishing
                     + " state=" + r.state
                     + " behindFullscreen=" + behindFullscreen);
             if (!r.finishing) {
                 if (behindFullscreen) {
                     if (r.visible) {
-                        if (DEBUG_VISBILITY) Log.v(
+                        if (DEBUG_VISBILITY) Slog.v(
                                 TAG, "Making invisible: " + r);
                         r.visible = false;
                         try {
@@ -2350,22 +2369,22 @@
                             if ((r.state == ActivityState.STOPPING
                                     || r.state == ActivityState.STOPPED)
                                     && r.app != null && r.app.thread != null) {
-                                if (DEBUG_VISBILITY) Log.v(
+                                if (DEBUG_VISBILITY) Slog.v(
                                         TAG, "Scheduling invisibility: " + r);
                                 r.app.thread.scheduleWindowVisibility(r, false);
                             }
                         } catch (Exception e) {
                             // Just skip on any failure; we'll make it
                             // visible when it next restarts.
-                            Log.w(TAG, "Exception thrown making hidden: "
+                            Slog.w(TAG, "Exception thrown making hidden: "
                                     + r.intent.getComponent(), e);
                         }
                     } else {
-                        if (DEBUG_VISBILITY) Log.v(
+                        if (DEBUG_VISBILITY) Slog.v(
                                 TAG, "Already invisible: " + r);
                     }
                 } else if (r.fullscreen) {
-                    if (DEBUG_VISBILITY) Log.v(
+                    if (DEBUG_VISBILITY) Slog.v(
                             TAG, "Now behindFullscreen: " + r);
                     behindFullscreen = true;
                 }
@@ -2484,7 +2503,7 @@
     }
     
     private void reportResumedActivityLocked(HistoryRecord r) {
-        //Log.i(TAG, "**** REPORT RESUME: " + r);
+        //Slog.i(TAG, "**** REPORT RESUME: " + r);
         
         final int identHash = System.identityHashCode(r);
         updateUsageStats(r, true);
@@ -2554,19 +2573,19 @@
         mStoppingActivities.remove(next);
         mWaitingVisibleActivities.remove(next);
 
-        if (DEBUG_SWITCH) Log.v(TAG, "Resuming " + next);
+        if (DEBUG_SWITCH) Slog.v(TAG, "Resuming " + next);
 
         // If we are currently pausing an activity, then don't do anything
         // until that is done.
         if (mPausingActivity != null) {
-            if (DEBUG_SWITCH) Log.v(TAG, "Skip resume: pausing=" + mPausingActivity);
+            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: pausing=" + mPausingActivity);
             return false;
         }
 
         // We need to start pausing the current activity so the top one
         // can be resumed...
         if (mResumedActivity != null) {
-            if (DEBUG_SWITCH) Log.v(TAG, "Skip resume: need to start pausing");
+            if (DEBUG_SWITCH) Slog.v(TAG, "Skip resume: need to start pausing");
             startPausingLocked(userLeaving, false);
             return true;
         }
@@ -2575,7 +2594,7 @@
             if (!prev.waitingVisible && next != null && !next.nowVisible) {
                 prev.waitingVisible = true;
                 mWaitingVisibleActivities.add(prev);
-                if (DEBUG_SWITCH) Log.v(
+                if (DEBUG_SWITCH) Slog.v(
                         TAG, "Resuming top, waiting visible to hide: " + prev);
             } else {
                 // The next activity is already visible, so hide the previous
@@ -2588,12 +2607,12 @@
                 // new one is found to be full-screen or not.
                 if (prev.finishing) {
                     mWindowManager.setAppVisibility(prev, false);
-                    if (DEBUG_SWITCH) Log.v(TAG, "Not waiting for visible to hide: "
+                    if (DEBUG_SWITCH) Slog.v(TAG, "Not waiting for visible to hide: "
                             + prev + ", waitingVisible="
                             + (prev != null ? prev.waitingVisible : null)
                             + ", nowVisible=" + next.nowVisible);
                 } else {
-                    if (DEBUG_SWITCH) Log.v(TAG, "Previous already visible but still waiting to hide: "
+                    if (DEBUG_SWITCH) Slog.v(TAG, "Previous already visible but still waiting to hide: "
                         + prev + ", waitingVisible="
                         + (prev != null ? prev.waitingVisible : null)
                         + ", nowVisible=" + next.nowVisible);
@@ -2606,7 +2625,7 @@
         // to ignore it when computing the desired screen orientation.
         if (prev != null) {
             if (prev.finishing) {
-                if (DEBUG_TRANSITION) Log.v(TAG,
+                if (DEBUG_TRANSITION) Slog.v(TAG,
                         "Prepare close transition: prev=" + prev);
                 if (mNoAnimActivities.contains(prev)) {
                     mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE);
@@ -2618,7 +2637,7 @@
                 mWindowManager.setAppWillBeHidden(prev);
                 mWindowManager.setAppVisibility(prev, false);
             } else {
-                if (DEBUG_TRANSITION) Log.v(TAG,
+                if (DEBUG_TRANSITION) Slog.v(TAG,
                         "Prepare open transition: prev=" + prev);
                 if (mNoAnimActivities.contains(next)) {
                     mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE);
@@ -2633,7 +2652,7 @@
                 mWindowManager.setAppVisibility(prev, false);
             }
         } else if (mHistory.size() > 1) {
-            if (DEBUG_TRANSITION) Log.v(TAG,
+            if (DEBUG_TRANSITION) Slog.v(TAG,
                     "Prepare open transition: no previous");
             if (mNoAnimActivities.contains(next)) {
                 mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE);
@@ -2643,7 +2662,7 @@
         }
 
         if (next.app != null && next.app.thread != null) {
-            if (DEBUG_SWITCH) Log.v(TAG, "Resume running: " + next);
+            if (DEBUG_SWITCH) Slog.v(TAG, "Resume running: " + next);
 
             // This activity is now becoming visible.
             mWindowManager.setAppVisibility(next, true);
@@ -2678,7 +2697,7 @@
                 // is still at the top and schedule another run if something
                 // weird happened.
                 HistoryRecord nextNext = topRunningActivityLocked(null);
-                if (DEBUG_SWITCH) Log.i(TAG,
+                if (DEBUG_SWITCH) Slog.i(TAG,
                         "Activity config changed during resume: " + next
                         + ", new next: " + nextNext);
                 if (nextNext != next) {
@@ -2698,7 +2717,7 @@
                 if (a != null) {
                     final int N = a.size();
                     if (!next.finishing && N > 0) {
-                        if (DEBUG_RESULTS) Log.v(
+                        if (DEBUG_RESULTS) Slog.v(
                                 TAG, "Delivering results to " + next
                                 + ": " + a);
                         next.app.thread.scheduleSendResult(next, a);
@@ -2722,7 +2741,7 @@
                 // Whoops, need to restart this activity!
                 next.state = lastState;
                 mResumedActivity = lastResumedActivity;
-                Log.i(TAG, "Restarting because process died: " + next);
+                Slog.i(TAG, "Restarting because process died: " + next);
                 if (!next.hasBeenLaunched) {
                     next.hasBeenLaunched = true;
                 } else {
@@ -2745,7 +2764,7 @@
             } catch (Exception e) {
                 // If any exception gets thrown, toss away this
                 // activity and try the next one.
-                Log.w(TAG, "Exception thrown during resume of " + next, e);
+                Slog.w(TAG, "Exception thrown during resume of " + next, e);
                 requestFinishActivityLocked(next, Activity.RESULT_CANCELED, null,
                         "resume-exception");
                 return true;
@@ -2767,7 +2786,7 @@
                             next.nonLocalizedLabel,
                             next.labelRes, next.icon, null, true);
                 }
-                if (DEBUG_SWITCH) Log.v(TAG, "Restarting: " + next);
+                if (DEBUG_SWITCH) Slog.v(TAG, "Restarting: " + next);
             }
             startSpecificActivityLocked(next, true, true);
         }
@@ -2826,7 +2845,7 @@
         // activity
         if (addPos < NH) {
             mUserLeaving = false;
-            if (DEBUG_USER_LEAVING) Log.v(TAG, "startActivity() behind front, mUserLeaving=false");
+            if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() behind front, mUserLeaving=false");
         }
         
         // Slot the activity into the history stack and proceed
@@ -2846,7 +2865,7 @@
             if (proc == null || proc.thread == null) {
                 showStartingIcon = true;
             }
-            if (DEBUG_TRANSITION) Log.v(TAG,
+            if (DEBUG_TRANSITION) Slog.v(TAG,
                     "Prepare open transition: starting " + r);
             if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
                 mWindowManager.prepareAppTransition(WindowManagerPolicy.TRANSIT_NONE);
@@ -3029,7 +3048,7 @@
                 r.app.thread.scheduleNewIntent(ar, r);
                 sent = true;
             } catch (Exception e) {
-                Log.w(TAG, "Exception thrown sending new intent to " + r, e);
+                Slog.w(TAG, "Exception thrown sending new intent to " + r, e);
             }
         }
         if (!sent) {
@@ -3053,13 +3072,13 @@
             String resultWho, int requestCode,
             int callingPid, int callingUid, boolean onlyIfNeeded,
             boolean componentSpecified) {
-        Log.i(TAG, "Starting activity: " + intent);
+        Slog.i(TAG, "Starting activity: " + intent);
 
         HistoryRecord sourceRecord = null;
         HistoryRecord resultRecord = null;
         if (resultTo != null) {
             int index = indexOfTokenLocked(resultTo);
-            if (DEBUG_RESULTS) Log.v(
+            if (DEBUG_RESULTS) Slog.v(
                 TAG, "Sending result to " + resultTo + " (index " + index + ")");
             if (index >= 0) {
                 sourceRecord = (HistoryRecord)mHistory.get(index);
@@ -3109,7 +3128,7 @@
                 callingPid = callerApp.pid;
                 callingUid = callerApp.info.uid;
             } else {
-                Log.w(TAG, "Unable to find app for caller " + caller
+                Slog.w(TAG, "Unable to find app for caller " + caller
                       + " (pid=" + callingPid + ") when starting: "
                       + intent.toString());
                 err = START_PERMISSION_DENIED;
@@ -3137,7 +3156,7 @@
                     + " from " + callerApp + " (pid=" + callingPid
                     + ", uid=" + callingUid + ")"
                     + " requires " + aInfo.permission;
-            Log.w(TAG, msg);
+            Slog.w(TAG, msg);
             throw new SecurityException(msg);
         }
 
@@ -3225,7 +3244,7 @@
         // We'll invoke onUserLeaving before onPause only if the launching
         // activity did not explicitly state that this is an automated launch.
         mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
-        if (DEBUG_USER_LEAVING) Log.v(TAG,
+        if (DEBUG_USER_LEAVING) Slog.v(TAG,
                 "startActivity() => mUserLeaving=" + mUserLeaving);
         
         // If the caller has asked not to resume at this point, we make note
@@ -3267,7 +3286,7 @@
             // This activity is not being started from another...  in this
             // case we -always- start a new task.
             if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
-                Log.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
+                Slog.w(TAG, "startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: "
                       + intent);
                 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
             }
@@ -3289,7 +3308,7 @@
             // is pretty messed up, so instead immediately send back a cancel
             // and let the new task continue launched as normal without a
             // dependency on its originator.
-            Log.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
+            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
             sendActivityResultLocked(-1,
                     r.resultTo, r.resultWho, r.requestCode,
                 Activity.RESULT_CANCELED, null);
@@ -3436,9 +3455,9 @@
 
         //String uri = r.intent.toURI();
         //Intent intent2 = new Intent(uri);
-        //Log.i(TAG, "Given intent: " + r.intent);
-        //Log.i(TAG, "URI is: " + uri);
-        //Log.i(TAG, "To intent: " + intent2);
+        //Slog.i(TAG, "Given intent: " + r.intent);
+        //Slog.i(TAG, "URI is: " + uri);
+        //Slog.i(TAG, "To intent: " + intent2);
 
         if (r.packageName != null) {
             // If the activity being launched is the same as the one currently
@@ -3491,7 +3510,7 @@
             }
             r.task = new TaskRecord(mCurTask, r.info, intent,
                     (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0);
-            if (DEBUG_TASKS) Log.v(TAG, "Starting new activity " + r
+            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
                     + " in new task " + r.task);
             newTask = true;
             addRecentTask(r.task);
@@ -3534,7 +3553,7 @@
             // to keep the new one in the same task as the one that is starting
             // it.
             r.task = sourceRecord.task;
-            if (DEBUG_TASKS) Log.v(TAG, "Starting new activity " + r
+            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
                     + " in existing task " + r.task);
 
         } else {
@@ -3548,7 +3567,7 @@
                 ? prev.task
                 : new TaskRecord(mCurTask, r.info, intent,
                         (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0);
-            if (DEBUG_TASKS) Log.v(TAG, "Starting new activity " + r
+            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
                     + " in new guessed " + r.task);
         }
         if (newTask) {
@@ -3559,11 +3578,38 @@
         return START_SUCCESS;
     }
 
-    public final int startActivity(IApplicationThread caller,
+    void reportActivityLaunchedLocked(boolean timeout, HistoryRecord r,
+            long thisTime, long totalTime) {
+        for (int i=mWaitingActivityLaunched.size()-1; i>=0; i--) {
+            WaitResult w = mWaitingActivityLaunched.get(i);
+            w.timeout = timeout;
+            if (r != null) {
+                w.who = new ComponentName(r.info.packageName, r.info.name);
+            }
+            w.thisTime = thisTime;
+            w.totalTime = totalTime;
+        }
+        notify();
+    }
+    
+    void reportActivityVisibleLocked(HistoryRecord r) {
+        for (int i=mWaitingActivityVisible.size()-1; i>=0; i--) {
+            WaitResult w = mWaitingActivityVisible.get(i);
+            w.timeout = false;
+            if (r != null) {
+                w.who = new ComponentName(r.info.packageName, r.info.name);
+            }
+            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
+            w.thisTime = w.totalTime;
+        }
+        notify();
+    }
+    
+    private final int startActivityMayWait(IApplicationThread caller,
             Intent intent, String resolvedType, Uri[] grantedUriPermissions,
             int grantedMode, IBinder resultTo,
             String resultWho, int requestCode, boolean onlyIfNeeded,
-            boolean debug) {
+            boolean debug, WaitResult outResult) {
         // Refuse possible leaked file descriptors
         if (intent != null && intent.hasFileDescriptors()) {
             throw new IllegalArgumentException("File descriptors passed in Intent");
@@ -3603,7 +3649,7 @@
             }
         }
 
-        synchronized(this) {
+        synchronized (this) {
             int callingPid;
             int callingUid;
             if (caller == null) {
@@ -3618,11 +3664,62 @@
                     resultTo, resultWho, requestCode, callingPid, callingUid,
                     onlyIfNeeded, componentSpecified);
             Binder.restoreCallingIdentity(origId);
+            
+            if (outResult != null) {
+                outResult.result = res;
+                if (res == IActivityManager.START_SUCCESS) {
+                    mWaitingActivityLaunched.add(outResult);
+                    do {
+                        try {
+                            wait();
+                        } catch (InterruptedException e) {
+                        }
+                    } while (!outResult.timeout && outResult.who == null);
+                } else if (res == IActivityManager.START_TASK_TO_FRONT) {
+                    HistoryRecord r = this.topRunningActivityLocked(null);
+                    if (r.nowVisible) {
+                        outResult.timeout = false;
+                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
+                        outResult.totalTime = 0;
+                        outResult.thisTime = 0;
+                    } else {
+                        outResult.thisTime = SystemClock.uptimeMillis();
+                        mWaitingActivityVisible.add(outResult);
+                        do {
+                            try {
+                                wait();
+                            } catch (InterruptedException e) {
+                            }
+                        } while (!outResult.timeout && outResult.who == null);
+                    }
+                }
+            }
+            
             return res;
         }
     }
 
-    public int startActivityIntentSender(IApplicationThread caller,
+    public final int startActivity(IApplicationThread caller,
+            Intent intent, String resolvedType, Uri[] grantedUriPermissions,
+            int grantedMode, IBinder resultTo,
+            String resultWho, int requestCode, boolean onlyIfNeeded,
+            boolean debug) {
+        return startActivityMayWait(caller, intent, resolvedType, grantedUriPermissions,
+                grantedMode, resultTo, resultWho, requestCode, onlyIfNeeded, debug, null);
+    }
+
+    public final WaitResult startActivityAndWait(IApplicationThread caller,
+            Intent intent, String resolvedType, Uri[] grantedUriPermissions,
+            int grantedMode, IBinder resultTo,
+            String resultWho, int requestCode, boolean onlyIfNeeded,
+            boolean debug) {
+        WaitResult res = new WaitResult();
+        startActivityMayWait(caller, intent, resolvedType, grantedUriPermissions,
+                grantedMode, resultTo, resultWho, requestCode, onlyIfNeeded, debug, res);
+        return res;
+    }
+    
+     public int startActivityIntentSender(IApplicationThread caller,
             IntentSender intent, Intent fillInIntent, String resolvedType,
             IBinder resultTo, String resultWho, int requestCode,
             int flagsMask, int flagsValues) {
@@ -3849,7 +3946,7 @@
     }
 
     private final void stopActivityLocked(HistoryRecord r) {
-        if (DEBUG_SWITCH) Log.d(TAG, "Stopping: " + r);
+        if (DEBUG_SWITCH) Slog.d(TAG, "Stopping: " + r);
         if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
                 || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) {
             if (!r.finishing) {
@@ -3864,7 +3961,7 @@
             try {
                 r.stopped = false;
                 r.state = ActivityState.STOPPING;
-                if (DEBUG_VISBILITY) Log.v(
+                if (DEBUG_VISBILITY) Slog.v(
                         TAG, "Stopping visible=" + r.visible + " for " + r);
                 if (!r.visible) {
                     mWindowManager.setAppVisibility(r, false);
@@ -3874,7 +3971,7 @@
                 // Maybe just ignore exceptions here...  if the process
                 // has crashed, our death notification will clean things
                 // up.
-                Log.w(TAG, "Exception thrown during pause", e);
+                Slog.w(TAG, "Exception thrown during pause", e);
                 // Just in case, assume it to be stopped.
                 r.stopped = true;
                 r.state = ActivityState.STOPPED;
@@ -3891,7 +3988,7 @@
      */
     private final boolean requestFinishActivityLocked(IBinder token, int resultCode,
             Intent resultData, String reason) {
-        if (DEBUG_RESULTS) Log.v(
+        if (DEBUG_RESULTS) Slog.v(
             TAG, "Finishing activity: token=" + token
             + ", result=" + resultCode + ", data=" + resultData);
 
@@ -3930,7 +4027,7 @@
     private final boolean finishActivityLocked(HistoryRecord r, int index,
             int resultCode, Intent resultData, String reason) {
         if (r.finishing) {
-            Log.w(TAG, "Duplicate finish request for " + r);
+            Slog.w(TAG, "Duplicate finish request for " + r);
             return false;
         }
 
@@ -3954,7 +4051,7 @@
         // send the result
         HistoryRecord resultTo = r.resultTo;
         if (resultTo != null) {
-            if (DEBUG_RESULTS) Log.v(TAG, "Adding result to " + resultTo
+            if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo
                     + " who=" + r.resultWho + " req=" + r.requestCode
                     + " res=" + resultCode + " data=" + resultData);
             if (r.info.applicationInfo.uid > 0) {
@@ -3965,7 +4062,7 @@
                                      resultData);
             r.resultTo = null;
         }
-        else if (DEBUG_RESULTS) Log.v(TAG, "No result destination from " + r);
+        else if (DEBUG_RESULTS) Slog.v(TAG, "No result destination from " + r);
 
         // Make sure this HistoryRecord is not holding on to other resources,
         // because clients have remote IPC references to this object so we
@@ -3985,7 +4082,7 @@
         if (mResumedActivity == r) {
             boolean endTask = index <= 0
                     || ((HistoryRecord)mHistory.get(index-1)).task != r.task;
-            if (DEBUG_TRANSITION) Log.v(TAG,
+            if (DEBUG_TRANSITION) Slog.v(TAG,
                     "Prepare close transition: finishing " + r);
             mWindowManager.prepareAppTransition(endTask
                     ? WindowManagerPolicy.TRANSIT_TASK_CLOSE
@@ -3995,19 +4092,19 @@
             mWindowManager.setAppVisibility(r, false);
                 
             if (mPausingActivity == null) {
-                if (DEBUG_PAUSE) Log.v(TAG, "Finish needs to pause: " + r);
-                if (DEBUG_USER_LEAVING) Log.v(TAG, "finish() => pause with userLeaving=false");
+                if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);
+                if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");
                 startPausingLocked(false, false);
             }
 
         } else if (r.state != ActivityState.PAUSING) {
             // If the activity is PAUSING, we will complete the finish once
             // it is done pausing; else we can just directly finish it here.
-            if (DEBUG_PAUSE) Log.v(TAG, "Finish not pausing: " + r);
+            if (DEBUG_PAUSE) Slog.v(TAG, "Finish not pausing: " + r);
             return finishCurrentActivityLocked(r, index,
                     FINISH_AFTER_PAUSE) == null;
         } else {
-            if (DEBUG_PAUSE) Log.v(TAG, "Finish waiting for pause of: " + r);
+            if (DEBUG_PAUSE) Slog.v(TAG, "Finish waiting for pause of: " + r);
         }
 
         return false;
@@ -4067,7 +4164,7 @@
         } else {
             // Need to go through the full pause cycle to get this
             // activity into the stopped state and then finish it.
-            if (localLOGV) Log.v(TAG, "Enqueueing pending finish: " + r);
+            if (localLOGV) Slog.v(TAG, "Enqueueing pending finish: " + r);
             mFinishingActivities.add(r);
             resumeTopActivityLocked(null);
         }
@@ -4123,7 +4220,7 @@
                     data, r);
         }
 
-        if (DEBUG_RESULTS) Log.v(TAG, "Send activity result to " + r
+        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
                 + " : who=" + resultWho + " req=" + requestCode
                 + " res=" + resultCode + " data=" + data);
         if (mResumedActivity == r && r.app != null && r.app.thread != null) {
@@ -4134,7 +4231,7 @@
                 r.app.thread.scheduleSendResult(r, list);
                 return;
             } catch (Exception e) {
-                Log.w(TAG, "Exception thrown sending result to " + r, e);
+                Slog.w(TAG, "Exception thrown sending result to " + r, e);
             }
         }
 
@@ -4277,7 +4374,7 @@
      */
     private final boolean destroyActivityLocked(HistoryRecord r,
             boolean removeFromApp) {
-        if (DEBUG_SWITCH) Log.v(
+        if (DEBUG_SWITCH) Slog.v(
             TAG, "Removing activity: token=" + r
               + ", app=" + (r.app != null ? r.app.processName : "(null)"));
         EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
@@ -4309,14 +4406,14 @@
             boolean skipDestroy = false;
             
             try {
-                if (DEBUG_SWITCH) Log.i(TAG, "Destroying: " + r);
+                if (DEBUG_SWITCH) Slog.i(TAG, "Destroying: " + r);
                 r.app.thread.scheduleDestroyActivity(r, r.finishing,
                         r.configChangeFlags);
             } catch (Exception e) {
                 // We can just ignore exceptions here...  if the process
                 // has crashed, our death notification will clean things
                 // up.
-                //Log.w(TAG, "Exception thrown during finish", e);
+                //Slog.w(TAG, "Exception thrown during finish", e);
                 if (r.finishing) {
                     removeActivityFromHistoryLocked(r);
                     removedFromHistory = true;
@@ -4348,7 +4445,7 @@
         r.configChangeFlags = 0;
         
         if (!mLRUActivities.remove(r) && hadApp) {
-            Log.w(TAG, "Activity " + r + " being finished, but not in LRU list");
+            Slog.w(TAG, "Activity " + r + " being finished, but not in LRU list");
         }
         
         return removedFromHistory;
@@ -4356,16 +4453,16 @@
 
     private static void removeHistoryRecordsForAppLocked(ArrayList list, ProcessRecord app) {
         int i = list.size();
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
             TAG, "Removing app " + app + " from list " + list
             + " with " + i + " entries");
         while (i > 0) {
             i--;
             HistoryRecord r = (HistoryRecord)list.get(i);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Record #" + i + " " + r + ": app=" + r.app);
             if (r.app == app) {
-                if (localLOGV) Log.v(TAG, "Removing this entry!");
+                if (localLOGV) Slog.v(TAG, "Removing this entry!");
                 list.remove(i);
             }
         }
@@ -4385,7 +4482,7 @@
 
         // Just in case...
         if (mPausingActivity != null && mPausingActivity.app == app) {
-            if (DEBUG_PAUSE) Log.v(TAG, "App died while pausing: " + mPausingActivity);
+            if (DEBUG_PAUSE) Slog.v(TAG, "App died while pausing: " + mPausingActivity);
             mPausingActivity = null;
         }
         if (mLastPausedActivity != null && mLastPausedActivity.app == app) {
@@ -4403,16 +4500,16 @@
 
         // Clean out the history list.
         int i = mHistory.size();
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
             TAG, "Removing app " + app + " from history with " + i + " entries");
         while (i > 0) {
             i--;
             HistoryRecord r = (HistoryRecord)mHistory.get(i);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Record #" + i + " " + r + ": app=" + r.app);
             if (r.app == app) {
                 if ((!r.haveState && !r.stateNotNeeded) || r.finishing) {
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                         TAG, "Removing this entry!  frozen=" + r.haveState
                         + " finishing=" + r.finishing);
                     mHistory.remove(i);
@@ -4427,7 +4524,7 @@
                 } else {
                     // We have the current state for this activity, so
                     // it can be restarted later when needed.
-                    if (localLOGV) Log.v(
+                    if (localLOGV) Slog.v(
                         TAG, "Keeping entry, setting app to null");
                     if (r.visible) {
                         hasVisibleActivities = true;
@@ -4448,7 +4545,7 @@
         app.activities.clear();
         
         if (app.instrumentationClass != null) {
-            Log.w(TAG, "Crash of app " + app.processName
+            Slog.w(TAG, "Crash of app " + app.processName
                   + " running instrumentation " + app.instrumentationClass);
             Bundle info = new Bundle();
             info.putString("shortMsg", "Process crashed.");
@@ -4497,11 +4594,13 @@
 
         mProcDeaths[0]++;
         
-        if (app.thread != null && app.thread.asBinder() == thread.asBinder()) {
-            Log.i(TAG, "Process " + app.processName + " (pid " + pid
+        // Clean up already done if the process has been re-started.
+        if (app.pid == pid && app.thread != null &&
+                app.thread.asBinder() == thread.asBinder()) {
+            Slog.i(TAG, "Process " + app.processName + " (pid " + pid
                     + ") has died.");
             EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.pid, app.processName);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Dying app: " + app + ", pid: " + pid
                 + ", thread: " + thread.asBinder());
             boolean doLowMem = app.instrumentationClass == null;
@@ -4521,7 +4620,7 @@
                 }
                 
                 if (!haveBg) {
-                    Log.i(TAG, "Low Memory: No more background processes.");
+                    Slog.i(TAG, "Low Memory: No more background processes.");
                     EventLog.writeEvent(EventLogTags.AM_LOW_MEMORY, mLruProcesses.size());
                     long now = SystemClock.uptimeMillis();
                     for (int i=mLruProcesses.size()-1; i>=0; i--) {
@@ -4545,8 +4644,13 @@
                     scheduleAppGcsLocked();
                 }
             }
+        } else if (app.pid != pid) {
+            // A new process has already been started.
+            Slog.i(TAG, "Process " + app.processName + " (pid " + pid
+                    + ") has died and restarted (pid " + app.pid + ").");
+            EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.pid, app.processName);
         } else if (DEBUG_PROCESSES) {
-            Log.d(TAG, "Received spurious death notification for thread "
+            Slog.d(TAG, "Received spurious death notification for thread "
                     + thread.asBinder());
         }
     }
@@ -4572,7 +4676,7 @@
             tracesFile.createNewFile();
             FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
         } catch (IOException e) {
-            Log.w(TAG, "Unable to prepare ANR traces file: " + tracesPath, e);
+            Slog.w(TAG, "Unable to prepare ANR traces file: " + tracesPath, e);
             return null;
         }
 
@@ -4652,7 +4756,7 @@
             info.append(cpuInfo);
         }
 
-        Log.e(TAG, info.toString());
+        Slog.e(TAG, info.toString());
         if (tracesFile == null) {
             // There is no trace file, so dump (only) the alleged culprit's threads to the log
             Process.sendSignal(app.pid, Process.SIGNAL_QUIT);
@@ -4725,7 +4829,7 @@
                     + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid()
                     + " requires " + android.Manifest.permission.PERSISTENT_ACTIVITY;
-            Log.w(TAG, msg);
+            Slog.w(TAG, msg);
             throw new SecurityException(msg);
         }
 
@@ -4737,26 +4841,26 @@
             HistoryRecord r = (HistoryRecord)mHistory.get(index);
             ProcessRecord app = r.app;
 
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "Setting persistence " + isPersistent + ": " + r);
 
             if (isPersistent) {
                 if (r.persistent) {
                     // Okay okay, I heard you already!
-                    if (localLOGV) Log.v(TAG, "Already persistent!");
+                    if (localLOGV) Slog.v(TAG, "Already persistent!");
                     return;
                 }
                 r.persistent = true;
                 app.persistentActivities++;
-                if (localLOGV) Log.v(TAG, "Num persistent now: " + app.persistentActivities);
+                if (localLOGV) Slog.v(TAG, "Num persistent now: " + app.persistentActivities);
                 if (app.persistentActivities > 1) {
                     // We aren't the first...
-                    if (localLOGV) Log.v(TAG, "Not the first!");
+                    if (localLOGV) Slog.v(TAG, "Not the first!");
                     return;
                 }
                 if (app.persistent) {
                     // This would be redundant.
-                    if (localLOGV) Log.v(TAG, "App is persistent!");
+                    if (localLOGV) Slog.v(TAG, "App is persistent!");
                     return;
                 }
 
@@ -4794,7 +4898,7 @@
                 } catch (RemoteException e) {
                 }
                 if (pkgUid == -1) {
-                    Log.w(TAG, "Invalid packageName:" + packageName);
+                    Slog.w(TAG, "Invalid packageName:" + packageName);
                     return false;
                 }
                 if (uid == pkgUid || checkComponentPermission(
@@ -4835,7 +4939,7 @@
                     + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid()
                     + " requires " + android.Manifest.permission.KILL_BACKGROUND_PROCESSES;
-            Log.w(TAG, msg);
+            Slog.w(TAG, msg);
             throw new SecurityException(msg);
         }
         
@@ -4849,7 +4953,7 @@
                 } catch (RemoteException e) {
                 }
                 if (pkgUid == -1) {
-                    Log.w(TAG, "Invalid packageName: " + packageName);
+                    Slog.w(TAG, "Invalid packageName: " + packageName);
                     return;
                 }
                 killPackageProcessesLocked(packageName, pkgUid,
@@ -4867,7 +4971,7 @@
                     + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid()
                     + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
-            Log.w(TAG, msg);
+            Slog.w(TAG, msg);
             throw new SecurityException(msg);
         }
         
@@ -4881,7 +4985,7 @@
                 } catch (RemoteException e) {
                 }
                 if (pkgUid == -1) {
-                    Log.w(TAG, "Invalid packageName: " + packageName);
+                    Slog.w(TAG, "Invalid packageName: " + packageName);
                     return;
                 }
                 forceStopPackageLocked(packageName, pkgUid);
@@ -4901,7 +5005,7 @@
         }
         // Make sure the uid is valid.
         if (uid < 0) {
-            Log.w(TAG, "Invalid uid specified for pkg : " + pkg);
+            Slog.w(TAG, "Invalid uid specified for pkg : " + pkg);
             return;
         }
         int callerUid = Binder.getCallingUid();
@@ -4984,7 +5088,7 @@
                         // If the other end already died, then our work here is done.
                     }
                 } else {
-                    Log.w(TAG, "Process/uid not found attempting kill of "
+                    Slog.w(TAG, "Process/uid not found attempting kill of "
                             + processName + " / " + uid);
                 }
             }
@@ -5053,7 +5157,7 @@
         }
 
         if (doit) {
-            Log.i(TAG, "Force stopping package " + name + " uid=" + uid);
+            Slog.i(TAG, "Force stopping package " + name + " uid=" + uid);
 
             Iterator<SparseArray<Long>> badApps = mProcessCrashTimes.getMap().values().iterator();
             while (badApps.hasNext()) {
@@ -5074,7 +5178,7 @@
                     return true;
                 }
                 didSomething = true;
-                Log.i(TAG, "  Force finishing activity " + r);
+                Slog.i(TAG, "  Force finishing activity " + r);
                 if (r.app != null) {
                     r.app.removed = true;
                 }
@@ -5090,7 +5194,7 @@
                     return true;
                 }
                 didSomething = true;
-                Log.i(TAG, "  Force stopping service " + service);
+                Slog.i(TAG, "  Force stopping service " + service);
                 if (service.app != null) {
                     service.app.removed = true;
                 }
@@ -5120,7 +5224,7 @@
     private final boolean removeProcessLocked(ProcessRecord app, boolean callerWillRestart) {
         final String name = app.processName;
         final int uid = app.info.uid;
-        if (DEBUG_PROCESSES) Log.d(
+        if (DEBUG_PROCESSES) Slog.d(
             TAG, "Force removing process " + app + " (" + name
             + "/" + uid + ")");
 
@@ -5162,7 +5266,7 @@
         }
         
         if (gone) {
-            Log.w(TAG, "Process " + app + " failed to attach");
+            Slog.w(TAG, "Process " + app + " failed to attach");
             EventLog.writeEvent(EventLogTags.AM_PROCESS_START_TIMEOUT, pid, app.info.uid,
                     app.processName);
             mProcessNames.remove(app.processName, app.info.uid);
@@ -5173,7 +5277,7 @@
                 ServiceRecord sr = mPendingServices.get(i);
                 if (app.info.uid == sr.appInfo.uid
                         && app.processName.equals(sr.processName)) {
-                    Log.w(TAG, "Forcing bringing down service: " + sr);
+                    Slog.w(TAG, "Forcing bringing down service: " + sr);
                     mPendingServices.remove(i);
                     i--;
                     bringDownServiceLocked(sr, true);
@@ -5181,7 +5285,7 @@
             }
             Process.killProcess(pid);
             if (mBackupTarget != null && mBackupTarget.app.pid == pid) {
-                Log.w(TAG, "Unattached app died before backup, skipping");
+                Slog.w(TAG, "Unattached app died before backup, skipping");
                 try {
                     IBackupManager bm = IBackupManager.Stub.asInterface(
                             ServiceManager.getService(Context.BACKUP_SERVICE));
@@ -5191,12 +5295,12 @@
                 }
             }
             if (mPendingBroadcast != null && mPendingBroadcast.curApp.pid == pid) {
-                Log.w(TAG, "Unattached app died before broadcast acknowledged, skipping");
+                Slog.w(TAG, "Unattached app died before broadcast acknowledged, skipping");
                 mPendingBroadcast = null;
                 scheduleBroadcastsLocked();
             }
         } else {
-            Log.w(TAG, "Spurious process start timeout - pid not known for " + app);
+            Slog.w(TAG, "Spurious process start timeout - pid not known for " + app);
         }
     }
 
@@ -5219,7 +5323,7 @@
         }
 
         if (app == null) {
-            Log.w(TAG, "No pending application record for pid " + pid
+            Slog.w(TAG, "No pending application record for pid " + pid
                     + " (IApplicationThread " + thread + "); dropping process");
             EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);
             if (pid > 0 && pid != MY_PID) {
@@ -5242,7 +5346,7 @@
 
         // Tell the process all about itself.
 
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
                 TAG, "Binding process pid " + pid + " to record " + app);
 
         String processName = app.processName;
@@ -5271,10 +5375,10 @@
         List providers = normalMode ? generateApplicationProvidersLocked(app) : null;
 
         if (!normalMode) {
-            Log.i(TAG, "Launching preboot mode app: " + app);
+            Slog.i(TAG, "Launching preboot mode app: " + app);
         }
         
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
             TAG, "New app record " + app
             + " thread=" + thread.asBinder() + " pid=" + pid);
         try {
@@ -5303,7 +5407,7 @@
             if (app.instrumentationClass != null) {
                 ensurePackageDexOpt(app.instrumentationClass.getPackageName());
             }
-            if (DEBUG_CONFIGURATION) Log.v(TAG, "Binding proc "
+            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Binding proc "
                     + processName + " with config " + mConfiguration);
             thread.bindApplication(processName, app.instrumentationInfo != null
                     ? app.instrumentationInfo : app.info, providers,
@@ -5317,7 +5421,7 @@
             // todo: Yikes!  What should we do?  For now we will try to
             // start another process, but that could easily get us in
             // an infinite loop of restarting processes...
-            Log.w(TAG, "Exception thrown during bind!", e);
+            Slog.w(TAG, "Exception thrown during bind!", e);
 
             app.resetPackageList();
             startProcessLocked(app, "bind fail", processName);
@@ -5341,7 +5445,7 @@
                         didSomething = true;
                     }
                 } catch (Exception e) {
-                    Log.w(TAG, "Exception in new application when starting activity "
+                    Slog.w(TAG, "Exception in new application when starting activity "
                           + hr.intent.getComponent().flattenToShortString(), e);
                     badApp = true;
                 }
@@ -5367,7 +5471,7 @@
                     didSomething = true;
                 }
             } catch (Exception e) {
-                Log.w(TAG, "Exception in new application when starting service "
+                Slog.w(TAG, "Exception in new application when starting service "
                       + sr.shortName, e);
                 badApp = true;
             }
@@ -5381,24 +5485,26 @@
                 processCurBroadcastLocked(br, app);
                 didSomething = true;
             } catch (Exception e) {
-                Log.w(TAG, "Exception in new application when starting receiver "
+                Slog.w(TAG, "Exception in new application when starting receiver "
                       + br.curComponent.flattenToShortString(), e);
                 badApp = true;
                 logBroadcastReceiverDiscard(br);
                 finishReceiverLocked(br.receiver, br.resultCode, br.resultData,
                         br.resultExtras, br.resultAbort, true);
                 scheduleBroadcastsLocked();
+                // We need to reset the state if we fails to start the receiver.
+                br.state = BroadcastRecord.IDLE;
             }
         }
 
         // Check whether the next backup agent is in this process...
         if (!badApp && mBackupTarget != null && mBackupTarget.appInfo.uid == app.info.uid) {
-            if (DEBUG_BACKUP) Log.v(TAG, "New app is backup target, launching agent for " + app);
+            if (DEBUG_BACKUP) Slog.v(TAG, "New app is backup target, launching agent for " + app);
             ensurePackageDexOpt(mBackupTarget.appInfo.packageName);
             try {
                 thread.scheduleCreateBackupAgent(mBackupTarget.appInfo, mBackupTarget.backupMode);
             } catch (Exception e) {
-                Log.w(TAG, "Exception scheduling backup agent creation: ");
+                Slog.w(TAG, "Exception scheduling backup agent creation: ");
                 e.printStackTrace();
             }
         }
@@ -5444,7 +5550,7 @@
                 && !mResumedActivity.waitingVisible;
         for (int i=0; i<N; i++) {
             HistoryRecord s = mStoppingActivities.get(i);
-            if (localLOGV) Log.v(TAG, "Stopping " + s + ": nowVisible="
+            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
                     + nowVisible + " waitingVisible=" + s.waitingVisible
                     + " finishing=" + s.finishing);
             if (s.waitingVisible && nowVisible) {
@@ -5456,12 +5562,12 @@
                     // so get rid of it.  Otherwise, we need to go through the
                     // normal flow and hide it once we determine that it is
                     // hidden by the activities in front of it.
-                    if (localLOGV) Log.v(TAG, "Before stopping, can hide: " + s);
+                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
                     mWindowManager.setAppVisibility(s, false);
                 }
             }
             if (!s.waitingVisible && remove) {
-                if (localLOGV) Log.v(TAG, "Ready to stop: " + s);
+                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
                 if (stops == null) {
                     stops = new ArrayList<HistoryRecord>();
                 }
@@ -5483,7 +5589,7 @@
 
     final void activityIdleInternal(IBinder token, boolean fromTimeout,
             Configuration config) {
-        if (localLOGV) Log.v(TAG, "Activity idle: " + token);
+        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
 
         ArrayList<HistoryRecord> stops = null;
         ArrayList<HistoryRecord> finishes = null;
@@ -5505,6 +5611,10 @@
             if (index >= 0) {
                 HistoryRecord r = (HistoryRecord)mHistory.get(index);
 
+                if (fromTimeout) {
+                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
+                }
+                
                 // This is a hack to semi-deal with a race condition
                 // in the client where it can be constructed with a
                 // newer configuration from when we asked it to launch.
@@ -5531,14 +5641,17 @@
 
                 // If this activity is fullscreen, set up to hide those under it.
 
-                if (DEBUG_VISBILITY) Log.v(TAG, "Idle activity for " + r);
+                if (DEBUG_VISBILITY) Slog.v(TAG, "Idle activity for " + r);
                 ensureActivitiesVisibleLocked(null, 0);
 
-                //Log.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
+                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
                 if (!mBooted && !fromTimeout) {
                     mBooted = true;
                     enableScreen = true;
                 }
+                
+            } else if (fromTimeout) {
+                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
             }
 
             // Atomically retrieve all of the other things to do.
@@ -5564,7 +5677,7 @@
             try {
                 sendThumbnail.requestThumbnail(token);
             } catch (Exception e) {
-                Log.w(TAG, "Exception thrown when requesting thumbnail", e);
+                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
                 sendPendingThumbnail(null, token, null, null, true);
             }
         }
@@ -5683,7 +5796,7 @@
     }
 
     final void activityPaused(IBinder token, Bundle icicle, boolean timeout) {
-        if (DEBUG_PAUSE) Log.v(
+        if (DEBUG_PAUSE) Slog.v(
             TAG, "Activity paused: token=" + token + ", icicle=" + icicle
             + ", timeout=" + timeout);
 
@@ -5713,7 +5826,7 @@
 
     public final void activityStopped(IBinder token, Bitmap thumbnail,
             CharSequence description) {
-        if (localLOGV) Log.v(
+        if (localLOGV) Slog.v(
             TAG, "Activity stopped: token=" + token);
 
         HistoryRecord r = null;
@@ -5747,7 +5860,7 @@
     }
 
     public final void activityDestroyed(IBinder token) {
-        if (DEBUG_SWITCH) Log.v(TAG, "ACTIVITY DESTROYED: " + token);
+        if (DEBUG_SWITCH) Slog.v(TAG, "ACTIVITY DESTROYED: " + token);
         synchronized (this) {
             mHandler.removeMessages(DESTROY_TIMEOUT_MSG, token);
             
@@ -5838,7 +5951,7 @@
                             + ", uid=" + Binder.getCallingUid()
                             + ", (need uid=" + uid + ")"
                             + " is not allowed to send as package " + packageName;
-                        Log.w(TAG, msg);
+                        Slog.w(TAG, msg);
                         throw new SecurityException(msg);
                     }
                 }
@@ -5910,7 +6023,7 @@
                         + ", uid=" + Binder.getCallingUid()
                         + " is not allowed to cancel packges "
                         + rec.key.packageName;
-                    Log.w(TAG, msg);
+                    Slog.w(TAG, msg);
                     throw new SecurityException(msg);
                 }
             } catch (RemoteException e) {
@@ -5981,7 +6094,7 @@
             synchronized (mPidsSelfLocked) {
                 ProcessRecord pr = mPidsSelfLocked.get(pid);
                 if (pr == null) {
-                    Log.w(TAG, "setProcessForeground called on unknown pid: " + pid);
+                    Slog.w(TAG, "setProcessForeground called on unknown pid: " + pid);
                     return;
                 }
                 ForegroundToken oldToken = mForegroundProcesses.get(pid);
@@ -6043,7 +6156,7 @@
         // client identity accordingly before proceeding.
         Identity tlsIdentity = sCallerIdentity.get();
         if (tlsIdentity != null) {
-            Log.d(TAG, "checkComponentPermission() adjusting {pid,uid} to {"
+            Slog.d(TAG, "checkComponentPermission() adjusting {pid,uid} to {"
                     + tlsIdentity.pid + "," + tlsIdentity.uid + "}");
             uid = tlsIdentity.uid;
             pid = tlsIdentity.pid;
@@ -6056,7 +6169,7 @@
         }
         // If the target requires a specific UID, always fail for others.
         if (reqUid >= 0 && uid != reqUid) {
-            Log.w(TAG, "Permission denied: checkComponentPermission() reqUid=" + reqUid);
+            Slog.w(TAG, "Permission denied: checkComponentPermission() reqUid=" + reqUid);
             return PackageManager.PERMISSION_DENIED;
         }
         if (permission == null) {
@@ -6067,7 +6180,7 @@
                     .checkUidPermission(permission, uid);
         } catch (RemoteException e) {
             // Should never happen, but if it does... deny!
-            Log.e(TAG, "PackageManager is dead?!?", e);
+            Slog.e(TAG, "PackageManager is dead?!?", e);
         }
         return PackageManager.PERMISSION_DENIED;
     }
@@ -6111,7 +6224,7 @@
                 + Binder.getCallingPid()
                 + ", uid=" + Binder.getCallingUid()
                 + " requires " + permission;
-        Log.w(TAG, msg);
+        Slog.w(TAG, msg);
         throw new SecurityException(msg);
     }
 
@@ -6179,14 +6292,14 @@
             return;
         }
 
-        if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+        if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                 "Requested grant " + targetPkg + " permission to " + uri);
         
         final IPackageManager pm = ActivityThread.getPackageManager();
 
         // If this is not a content: uri, we can't do anything with it.
         if (!ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
-            if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+            if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                     "Can't grant URI permission for non-content URI: " + uri);
             return;
         }
@@ -6205,7 +6318,7 @@
             }
         }
         if (pi == null) {
-            Log.w(TAG, "No content provider found for: " + name);
+            Slog.w(TAG, "No content provider found for: " + name);
             return;
         }
 
@@ -6213,7 +6326,7 @@
         try {
             targetUid = pm.getPackageUid(targetPkg);
             if (targetUid < 0) {
-                if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+                if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                         "Can't grant URI permission no uid for: " + targetPkg);
                 return;
             }
@@ -6224,7 +6337,7 @@
         // First...  does the target actually need this permission?
         if (checkHoldingPermissionsLocked(pm, pi, targetUid, modeFlags)) {
             // No need to grant the target this permission.
-            if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+            if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                     "Target " + targetPkg + " already has full permission to " + uri);
             return;
         }
@@ -6267,7 +6380,7 @@
         // to the uri, and the target doesn't.  Let's now give this to
         // the target.
 
-        if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+        if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                 "Granting " + targetPkg + " permission to " + uri);
         
         HashMap<Uri, UriPermission> targetUris
@@ -6324,11 +6437,11 @@
                         + " when granting permission to uri " + uri);
             }
             if (targetPkg == null) {
-                Log.w(TAG, "grantUriPermission: null target");
+                Slog.w(TAG, "grantUriPermission: null target");
                 return;
             }
             if (uri == null) {
-                Log.w(TAG, "grantUriPermission: null uri");
+                Slog.w(TAG, "grantUriPermission: null uri");
                 return;
             }
 
@@ -6343,7 +6456,7 @@
             HashMap<Uri, UriPermission> perms
                     = mGrantedUriPermissions.get(perm.uid);
             if (perms != null) {
-                if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+                if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                         "Removing " + perm.uid + " permission to " + perm.uri);
                 perms.remove(perm.uri);
                 if (perms.size() == 0) {
@@ -6384,7 +6497,7 @@
             return;
         }
 
-        if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+        if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                 "Revoking all granted permissions to " + uri);
         
         final IPackageManager pm = ActivityThread.getPackageManager();
@@ -6403,7 +6516,7 @@
             }
         }
         if (pi == null) {
-            Log.w(TAG, "No content provider found for: " + authority);
+            Slog.w(TAG, "No content provider found for: " + authority);
             return;
         }
 
@@ -6445,7 +6558,7 @@
                             continue toploop;
                         }
                     }
-                    if (DEBUG_URI_PERMISSION) Log.v(TAG, 
+                    if (DEBUG_URI_PERMISSION) Slog.v(TAG, 
                             "Revoking " + perm.uid + " permission to " + perm.uri);
                     perm.clearModes(modeFlags);
                     if (perm.modeFlags == 0) {
@@ -6472,7 +6585,7 @@
                         + " when revoking permission to uri " + uri);
             }
             if (uri == null) {
-                Log.w(TAG, "revokeUriPermission: null uri");
+                Slog.w(TAG, "revokeUriPermission: null uri");
                 return;
             }
 
@@ -6498,7 +6611,7 @@
                 }
             }
             if (pi == null) {
-                Log.w(TAG, "No content provider found for: " + authority);
+                Slog.w(TAG, "No content provider found for: " + authority);
                 return;
             }
 
@@ -6540,7 +6653,7 @@
         HistoryRecord topRecord = null;
 
         synchronized(this) {
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "getTasks: max=" + maxNum + ", flags=" + flags
                 + ", receiver=" + receiver);
 
@@ -6558,7 +6671,7 @@
                         + Binder.getCallingPid()
                         + ", uid=" + Binder.getCallingUid()
                         + " requires " + android.Manifest.permission.GET_TASKS;
-                Log.w(TAG, msg);
+                Slog.w(TAG, msg);
                 throw new SecurityException(msg);
             }
 
@@ -6594,7 +6707,7 @@
                     topDescription = r.description;
                 }
 
-                if (localLOGV) Log.v(
+                if (localLOGV) Slog.v(
                     TAG, r.intent.getComponent().flattenToShortString()
                     + ": task=" + r.task);
 
@@ -6613,7 +6726,7 @@
                     //System.out.println(
                     //    "#" + maxNum + ": " + " descr=" + ci.description);
                     if (ci.thumbnail == null && receiver != null) {
-                        if (localLOGV) Log.v(
+                        if (localLOGV) Slog.v(
                             TAG, "State=" + top.state + "Idle=" + top.idle
                             + " app=" + top.app
                             + " thr=" + (top.app != null ? top.app.thread : null));
@@ -6643,14 +6756,14 @@
             }
         }
 
-        if (localLOGV) Log.v(TAG, "We have pending thumbnails: " + pending);
+        if (localLOGV) Slog.v(TAG, "We have pending thumbnails: " + pending);
 
         if (topThumbnail != null) {
-            if (localLOGV) Log.v(TAG, "Requesting top thumbnail");
+            if (localLOGV) Slog.v(TAG, "Requesting top thumbnail");
             try {
                 topThumbnail.requestThumbnail(topRecord);
             } catch (Exception e) {
-                Log.w(TAG, "Exception thrown when requesting thumbnail", e);
+                Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
                 sendPendingThumbnail(null, topRecord, null, null, true);
             }
         }
@@ -6823,7 +6936,7 @@
                             // same task affinity as the one we are moving,
                             // then merge it into the same task.
                             target.task = p.task;
-                            if (DEBUG_TASKS) Log.v(TAG, "Start pushing activity " + target
+                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
                                     + " out to bottom task " + p.task);
                         } else {
                             mCurTask++;
@@ -6833,7 +6946,7 @@
                             target.task = new TaskRecord(mCurTask, target.info, null,
                                     (target.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0);
                             target.task.affinityIntent = target.intent;
-                            if (DEBUG_TASKS) Log.v(TAG, "Start pushing activity " + target
+                            if (DEBUG_TASKS) Slog.v(TAG, "Start pushing activity " + target
                                     + " out to new task " + target.task);
                         }
                         mWindowManager.setAppGroupId(target, task.taskId);
@@ -6846,7 +6959,7 @@
                             if (p.finishing) {
                                 continue;
                             }
-                            if (DEBUG_TASKS) Log.v(TAG, "Pushing next activity " + p
+                            if (DEBUG_TASKS) Slog.v(TAG, "Pushing next activity " + p
                                     + " out to target's task " + target.task);
                             task.numActivities--;
                             p.task = target.task;
@@ -6983,7 +7096,7 @@
                         p.task.numActivities--;
                         p.task = task;
                         mHistory.add(lastReparentPos, p);
-                        if (DEBUG_TASKS) Log.v(TAG, "Pulling activity " + p
+                        if (DEBUG_TASKS) Slog.v(TAG, "Pulling activity " + p
                                 + " in to resetting task " + task);
                         task.numActivities++;
                         mWindowManager.moveAppToken(lastReparentPos, p);
@@ -7059,7 +7172,7 @@
     }
 
     private final void moveTaskToFrontLocked(TaskRecord tr, HistoryRecord reason) {
-        if (DEBUG_SWITCH) Log.v(TAG, "moveTaskToFront: " + tr);
+        if (DEBUG_SWITCH) Slog.v(TAG, "moveTaskToFront: " + tr);
 
         final int task = tr.taskId;
         int top = mHistory.size()-1;
@@ -7080,11 +7193,11 @@
         // of the stack, keeping them in the same internal order.
         while (pos >= 0) {
             HistoryRecord r = (HistoryRecord)mHistory.get(pos);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "At " + pos + " ckp " + r.task + ": " + r);
             boolean first = true;
             if (r.task.taskId == task) {
-                if (localLOGV) Log.v(TAG, "Removing and adding at " + top);
+                if (localLOGV) Slog.v(TAG, "Removing and adding at " + top);
                 mHistory.remove(pos);
                 mHistory.add(top, r);
                 moved.add(0, r);
@@ -7097,7 +7210,7 @@
             pos--;
         }
 
-        if (DEBUG_TRANSITION) Log.v(TAG,
+        if (DEBUG_TRANSITION) Slog.v(TAG,
                 "Prepare to front transition: task=" + tr);
         if (reason != null &&
                 (reason.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0) {
@@ -7173,7 +7286,7 @@
      * @return Returns true if the move completed, false if not.
      */
     private final boolean moveTaskToBackLocked(int task, HistoryRecord reason) {
-        Log.i(TAG, "moveTaskToBack: " + task);
+        Slog.i(TAG, "moveTaskToBack: " + task);
         
         // If we have a watcher, preflight the move before committing to it.  First check
         // for *other* available tasks, but if none are available, then try again allowing the
@@ -7199,7 +7312,7 @@
 
         ArrayList moved = new ArrayList();
 
-        if (DEBUG_TRANSITION) Log.v(TAG,
+        if (DEBUG_TRANSITION) Slog.v(TAG,
                 "Prepare to back transition: task=" + task);
         
         final int N = mHistory.size();
@@ -7210,10 +7323,10 @@
         // of the stack, keeping them in the same internal order.
         while (pos < N) {
             HistoryRecord r = (HistoryRecord)mHistory.get(pos);
-            if (localLOGV) Log.v(
+            if (localLOGV) Slog.v(
                 TAG, "At " + pos + " ckp " + r.task + ": " + r);
             if (r.task.taskId == task) {
-                if (localLOGV) Log.v(TAG, "Removing and adding at " + (N-1));
+                if (localLOGV) Slog.v(TAG, "Removing and adding at " + (N-1));
                 mHistory.remove(pos);
                 mHistory.add(bottom, r);
                 moved.add(r);
@@ -7257,7 +7370,7 @@
     }
 
     private final void moveTaskBackwardsLocked(int task) {
-        Log.e(TAG, "moveTaskBackwards not yet implemented!");
+        Slog.e(TAG, "moveTaskBackwards not yet implemented!");
     }
 
     public int getTaskForActivity(IBinder token, boolean onlyRoot) {
@@ -7301,25 +7414,25 @@
             if (!r.finishing && r.task != cp
                     && r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
                 cp = r.task;
-                //Log.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
+                //Slog.i(TAG, "Comparing existing cls=" + r.task.intent.getComponent().flattenToShortString()
                 //        + "/aff=" + r.task.affinity + " to new cls="
                 //        + intent.getComponent().flattenToShortString() + "/aff=" + taskAffinity);
                 if (r.task.affinity != null) {
                     if (r.task.affinity.equals(info.taskAffinity)) {
-                        //Log.i(TAG, "Found matching affinity!");
+                        //Slog.i(TAG, "Found matching affinity!");
                         return r;
                     }
                 } else if (r.task.intent != null
                         && r.task.intent.getComponent().equals(cls)) {
-                    //Log.i(TAG, "Found matching class!");
+                    //Slog.i(TAG, "Found matching class!");
                     //dump();
-                    //Log.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
+                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
                     return r;
                 } else if (r.task.affinityIntent != null
                         && r.task.affinityIntent.getComponent().equals(cls)) {
-                    //Log.i(TAG, "Found matching class!");
+                    //Slog.i(TAG, "Found matching class!");
                     //dump();
-                    //Log.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
+                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
                     return r;
                 }
             }
@@ -7344,9 +7457,9 @@
             HistoryRecord r = (HistoryRecord)mHistory.get(i);
             if (!r.finishing) {
                 if (r.intent.getComponent().equals(cls)) {
-                    //Log.i(TAG, "Found matching class!");
+                    //Slog.i(TAG, "Found matching class!");
                     //dump();
-                    //Log.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
+                    //Slog.i(TAG, "For Intent " + intent + " bringing to top: " + r.intent);
                     return r;
                 }
             }
@@ -7451,7 +7564,7 @@
                         pr.receiver.finished();
                     }
                 } catch (Exception e) {
-                    Log.w(TAG, "Exception thrown when sending thumbnail", e);
+                    Slog.w(TAG, "Exception thrown when sending thumbnail", e);
                 }
             }
         }
@@ -7528,7 +7641,7 @@
                 + " from " + (r != null ? r : "(null)") + " (pid=" + callingPid
                 + ", uid=" + callingUid + ") requires "
                 + cpi.readPermission + " or " + cpi.writePermission;
-        Log.w(TAG, msg);
+        Slog.w(TAG, msg);
         return msg;
     }
 
@@ -7577,7 +7690,7 @@
                 // In this case the provider instance already exists, so we can
                 // return it right away.
                 if (r != null) {
-                    if (DEBUG_PROVIDER) Log.v(TAG,
+                    if (DEBUG_PROVIDER) Slog.v(TAG,
                             "Adding provider requested by "
                             + r.processName + " from process "
                             + cpr.info.processName);
@@ -7634,7 +7747,7 @@
                                         cpi.applicationInfo.packageName,
                                         STOCK_PM_FLAGS);
                         if (ai == null) {
-                            Log.w(TAG, "No package info for content provider "
+                            Slog.w(TAG, "No package info for content provider "
                                     + cpi.name);
                             return null;
                         }
@@ -7654,7 +7767,7 @@
 
                 if (DEBUG_PROVIDER) {
                     RuntimeException e = new RuntimeException("here");
-                    Log.w(TAG, "LAUNCHING REMOTE PROVIDER (myuid " + r.info.uid
+                    Slog.w(TAG, "LAUNCHING REMOTE PROVIDER (myuid " + r.info.uid
                           + " pruid " + cpr.appInfo.uid + "): " + cpr.info.name, e);
                 }
 
@@ -7678,7 +7791,7 @@
                             new ComponentName(cpi.applicationInfo.packageName,
                                     cpi.name), false);
                     if (proc == null) {
-                        Log.w(TAG, "Unable to launch app "
+                        Slog.w(TAG, "Unable to launch app "
                                 + cpi.applicationInfo.packageName + "/"
                                 + cpi.applicationInfo.uid + " for provider "
                                 + name + ": process is bad");
@@ -7697,7 +7810,7 @@
                 mProvidersByName.put(name, cpr);
 
                 if (r != null) {
-                    if (DEBUG_PROVIDER) Log.v(TAG,
+                    if (DEBUG_PROVIDER) Slog.v(TAG,
                             "Adding provider requested by "
                             + r.processName + " from process "
                             + cpr.info.processName);
@@ -7718,7 +7831,7 @@
         synchronized (cpr) {
             while (cpr.provider == null) {
                 if (cpr.launchingApp == null) {
-                    Log.w(TAG, "Unable to launch app "
+                    Slog.w(TAG, "Unable to launch app "
                             + cpi.applicationInfo.packageName + "/"
                             + cpi.applicationInfo.uid + " for provider "
                             + name + ": launching app became null");
@@ -7741,7 +7854,7 @@
         if (caller == null) {
             String msg = "null IApplicationThread when getting content provider "
                     + name;
-            Log.w(TAG, msg);
+            Slog.w(TAG, msg);
             throw new SecurityException(msg);
         }
 
@@ -7761,7 +7874,7 @@
             ContentProviderRecord cpr = (ContentProviderRecord)mProvidersByName.get(name);
             if(cpr == null) {
                 // remove from mProvidersByClass
-                if (DEBUG_PROVIDER) Log.v(TAG, name +
+                if (DEBUG_PROVIDER) Slog.v(TAG, name +
                         " provider not found in providers list");
                 return;
             }
@@ -7774,12 +7887,12 @@
             //update content provider record entry info
             ContentProviderRecord localCpr = (ContentProviderRecord)
                     mProvidersByClass.get(cpr.info.name);
-            if (DEBUG_PROVIDER) Log.v(TAG, "Removing provider requested by "
+            if (DEBUG_PROVIDER) Slog.v(TAG, "Removing provider requested by "
                     + r.info.processName + " from process "
                     + localCpr.appInfo.processName);
             if (localCpr.app == r) {
                 //should not happen. taken care of as a local provider
-                Log.w(TAG, "removeContentProvider called on local provider: "
+                Slog.w(TAG, "removeContentProvider called on local provider: "
                         + cpr.info.name + " in process " + r.processName);
                 return;
             } else {
@@ -7800,7 +7913,7 @@
             ContentProviderRecord cpr = (ContentProviderRecord)mProvidersByName.get(name);
             if(cpr == null) {
                 //remove from mProvidersByClass
-                if(localLOGV) Log.v(TAG, name+" content provider not found in providers list");
+                if(localLOGV) Slog.v(TAG, name+" content provider not found in providers list");
                 return;
             }
 
@@ -7808,7 +7921,7 @@
             ContentProviderRecord localCpr = (ContentProviderRecord) mProvidersByClass.get(cpr.info.name);
             localCpr.externals--;
             if (localCpr.externals < 0) {
-                Log.e(TAG, "Externals < 0 for content provider " + localCpr);
+                Slog.e(TAG, "Externals < 0 for content provider " + localCpr);
             }
             updateOomAdjLocked();
         }
@@ -7875,7 +7988,7 @@
             for (int i=providers.size()-1; i>=0; i--) {
                 ProviderInfo pi = (ProviderInfo)providers.get(i);
                 if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
-                    Log.w(TAG, "Not installing system proc provider " + pi.name
+                    Slog.w(TAG, "Not installing system proc provider " + pi.name
                             + ": not system .apk");
                     providers.remove(i);
                 }
@@ -7927,7 +8040,7 @@
 
         synchronized(this) {
             int count = mHistory.size();
-            if (DEBUG_SWITCH) Log.d(
+            if (DEBUG_SWITCH) Slog.d(
                 TAG, "Performing unhandledBack(): stack size = " + count);
             if (count > 1) {
                 final long origId = Binder.clearCallingIdentity();
@@ -7964,7 +8077,7 @@
             // We've got the fd now, so we're done with the provider.
             removeContentProviderExternal(name);
         } else {
-            Log.d(TAG, "Failed to get provider for authority '" + name + "'");
+            Slog.d(TAG, "Failed to get provider for authority '" + name + "'");
         }
         return pfd;
     }
@@ -7977,7 +8090,7 @@
             if (mResumedActivity != null) {
                 pauseIfSleepingLocked();
             } else {
-                Log.w(TAG, "goingToSleep with no resumed activity!");
+                Slog.w(TAG, "goingToSleep with no resumed activity!");
             }
         }
     }
@@ -8001,7 +8114,7 @@
                 while (mResumedActivity != null || mPausingActivity != null) {
                     long delay = endTime - System.currentTimeMillis();
                     if (delay <= 0) {
-                        Log.w(TAG, "Activity manager shutdown timed out");
+                        Slog.w(TAG, "Activity manager shutdown timed out");
                         timedout = true;
                         break;
                     }
@@ -8033,8 +8146,8 @@
             // one to pause.  If we are pausing one, we will just let that stuff
             // run and release the wake lock when all done.
             if (mPausingActivity == null) {
-                if (DEBUG_PAUSE) Log.v(TAG, "Sleep needs to pause...");
-                if (DEBUG_USER_LEAVING) Log.v(TAG, "Sleep => pause with userLeaving=false");
+                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep needs to pause...");
+                if (DEBUG_USER_LEAVING) Slog.v(TAG, "Sleep => pause with userLeaving=false");
                 startPausingLocked(false, true);
             }
         }
@@ -8096,7 +8209,7 @@
             return true;
         }
         
-        Log.w(TAG, name + " request from " + callingUid + " stopped");
+        Slog.w(TAG, name + " request from " + callingUid + " stopped");
         return false;
     }
     
@@ -8243,7 +8356,7 @@
             if (worstType < EMPTY_APP_ADJ && worstType > HIDDEN_APP_MIN_ADJ) {
                 worstType = HIDDEN_APP_MIN_ADJ;
             }
-            Log.w(TAG, "Killing processes for memory at adjustment " + worstType);
+            Slog.w(TAG, "Killing processes for memory at adjustment " + worstType);
             for (int i=0; i<pids.length; i++) {
                 ProcessRecord proc = mPidsSelfLocked.get(pids[i]);
                 if (proc == null) {
@@ -8251,7 +8364,7 @@
                 }
                 int adj = proc.setAdj;
                 if (adj >= worstType) {
-                    Log.w(TAG, "Killing for memory: " + proc + " (adj "
+                    Slog.w(TAG, "Killing for memory: " + proc + " (adj "
                             + adj + ")");
                     EventLog.writeEvent(EventLogTags.AM_KILL_FOR_MEMORY, proc.pid,
                             proc.processName, adj);
@@ -8356,7 +8469,7 @@
                 if (proc.persistent) {
                     continue;
                 }
-                //Log.i(TAG, "Proc " + proc + ": pss=" + proc.lastPss);
+                //Slog.i(TAG, "Proc " + proc + ": pss=" + proc.lastPss);
                 if (proc.lastPss == 0) {
                     stats.mNoPssCount++;
                     continue;
@@ -8419,7 +8532,7 @@
             // change mConfiguration in-place.
             mConfiguration.updateFrom(configuration);
             mConfigurationSeq = mConfiguration.seq = 1;
-            if (DEBUG_CONFIGURATION) Log.v(TAG, "Initial config: " + mConfiguration);
+            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Initial config: " + mConfiguration);
         }
     }
 
@@ -8479,7 +8592,7 @@
                                 }
                             };
                         }
-                        Log.i(TAG, "Sending system update to: " + intent.getComponent());
+                        Slog.i(TAG, "Sending system update to: " + intent.getComponent());
                         broadcastIntentLocked(null, null, intent, null, finisher,
                                 0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID);
                         if (finisher != null) {
@@ -8516,13 +8629,13 @@
             synchronized(this) {
                 for (int i=procsToKill.size()-1; i>=0; i--) {
                     ProcessRecord proc = procsToKill.get(i);
-                    Log.i(TAG, "Removing system update proc: " + proc);
+                    Slog.i(TAG, "Removing system update proc: " + proc);
                     removeProcessLocked(proc, true);
                 }
             }
         }
         
-        Log.i(TAG, "System now ready");
+        Slog.i(TAG, "System now ready");
         EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
             SystemClock.uptimeMillis());
 
@@ -8667,7 +8780,7 @@
             }
             if (app.pid > 0 && app.pid != MY_PID) {
                 handleAppCrashLocked(app);
-                Log.i(ActivityManagerService.TAG, "Killing process "
+                Slog.i(ActivityManagerService.TAG, "Killing process "
                         + app.processName
                         + " (pid=" + app.pid + ") at user's request");
                 Process.killProcess(app.pid);
@@ -8682,7 +8795,7 @@
                 app.info.uid);
         if (crashTime != null && now < crashTime+MIN_CRASH_INTERVAL) {
             // This process loses!
-            Log.w(TAG, "Process " + app.info.processName
+            Slog.w(TAG, "Process " + app.info.processName
                     + " has crashed too many times: killing!");
             EventLog.writeEvent(EventLogTags.AM_PROCESS_CRASHED_TOO_MUCH,
                     app.info.processName, app.info.uid);
@@ -8690,7 +8803,7 @@
             for (int i=mHistory.size()-1; i>=0; i--) {
                 HistoryRecord r = (HistoryRecord)mHistory.get(i);
                 if (r.app == app) {
-                    Log.w(TAG, "  Force finishing activity "
+                    Slog.w(TAG, "  Force finishing activity "
                         + r.intent.getComponent().flattenToShortString());
                     finishActivityLocked(r, i, Activity.RESULT_CANCELED, null, "crashed");
                 }
@@ -8746,7 +8859,7 @@
         }
         r = mPendingBroadcast;
         if (r != null && r.curApp == app) {
-            if (DEBUG_BROADCAST) Log.v(TAG,
+            if (DEBUG_BROADCAST) Slog.v(TAG,
                     "skip & discard pending app " + r);
             logBroadcastReceiverDiscard(r);
             finishReceiverLocked(r.receiver, r.resultCode, r.resultData,
@@ -8827,7 +8940,7 @@
                 }
             }
 
-            Log.w(TAG, "Can't find mystery application: " + app);
+            Slog.w(TAG, "Can't find mystery application: " + app);
             return null;
         }
     }
@@ -8879,7 +8992,7 @@
                             }
                         }
                     } catch (RemoteException e) {
-                        Log.e(TAG, "Error getting package info: " + pkg, e);
+                        Slog.e(TAG, "Error getting package info: " + pkg, e);
                     }
                     sb.append("\n");
                 }
@@ -8905,7 +9018,7 @@
                 try {
                     sb.append(FileUtils.readTextFile(logFile, 128 * 1024, "\n\n[[TRUNCATED]]"));
                 } catch (IOException e) {
-                    Log.e(TAG, "Error reading " + logFile, e);
+                    Slog.e(TAG, "Error reading " + logFile, e);
                 }
             }
             if (crashInfo != null && crashInfo.stackTrace != null) {
@@ -8941,7 +9054,7 @@
                     int pid = r != null ? r.pid : Binder.getCallingPid();
                     if (!mController.appCrashed(name, pid,
                             shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
-                        Log.w(TAG, "Force-killing crashed app " + name
+                        Slog.w(TAG, "Force-killing crashed app " + name
                                 + " at watcher's request");
                         Process.killProcess(pid);
                         return;
@@ -8955,10 +9068,10 @@
 
             // If this process is running instrumentation, finish it.
             if (r != null && r.instrumentationClass != null) {
-                Log.w(TAG, "Error in app " + r.processName
+                Slog.w(TAG, "Error in app " + r.processName
                       + " running instrumentation " + r.instrumentationClass + ":");
-                if (shortMsg != null) Log.w(TAG, "  " + shortMsg);
-                if (longMsg != null) Log.w(TAG, "  " + longMsg);
+                if (shortMsg != null) Slog.w(TAG, "  " + shortMsg);
+                if (longMsg != null) Slog.w(TAG, "  " + longMsg);
                 Bundle info = new Bundle();
                 info.putString("shortMsg", shortMsg);
                 info.putString("longMsg", longMsg);
@@ -9002,7 +9115,7 @@
             try {
                 mContext.startActivity(appErrorIntent);
             } catch (ActivityNotFoundException e) {
-                Log.w(TAG, "bug report receiver dissappeared", e);
+                Slog.w(TAG, "bug report receiver dissappeared", e);
             }
         }
     }
@@ -9077,7 +9190,7 @@
                         }
                         errList.add(report);
                     } else {
-                        Log.w(TAG, "Missing app error report, app = " + app.processName + 
+                        Slog.w(TAG, "Missing app error report, app = " + app.processName + 
                                 " crashing = " + app.crashing +
                                 " notResponding = " + app.notResponding);
                     }
@@ -9127,7 +9240,7 @@
                     if (app.adjTarget instanceof ComponentName) {
                         currApp.importanceReasonComponent = (ComponentName)app.adjTarget;
                     }
-                    //Log.v(TAG, "Proc " + app.processName + ": imp=" + currApp.importance
+                    //Slog.v(TAG, "Proc " + app.processName + ": imp=" + currApp.importance
                     //        + " lru=" + currApp.lru);
                     if (runList == null) {
                         runList = new ArrayList<ActivityManager.RunningAppProcessInfo>();
@@ -9986,7 +10099,7 @@
                                     //c.conn.connected(r.className, null);
                                 } catch (Exception e) {
                                     // todo: this should be asynchronous!
-                                    Log.w(TAG, "Exception thrown disconnected servce "
+                                    Slog.w(TAG, "Exception thrown disconnected servce "
                                           + r.shortName
                                           + " from app " + app.processName, e);
                                 }
@@ -10026,7 +10139,7 @@
                             = sr.bindings.values().iterator();
                     while (bindings.hasNext()) {
                         IntentBindRecord b = bindings.next();
-                        if (DEBUG_SERVICE) Log.v(TAG, "Killing binding " + b
+                        if (DEBUG_SERVICE) Slog.v(TAG, "Killing binding " + b
                                 + ": shouldUnbind=" + b.hasBound);
                         b.binder = null;
                         b.requested = b.received = b.hasBound = false;
@@ -10034,7 +10147,7 @@
                 }
 
                 if (sr.crashCount >= 2) {
-                    Log.w(TAG, "Service crashed " + sr.crashCount
+                    Slog.w(TAG, "Service crashed " + sr.crashCount
                             + " times, stopping: " + sr);
                     EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH,
                             sr.crashCount, sr.shortName, app.pid);
@@ -10096,7 +10209,7 @@
             if (!capp.persistent && capp.thread != null
                     && capp.pid != 0
                     && capp.pid != MY_PID) {
-                Log.i(TAG, "Killing app " + capp.processName
+                Slog.i(TAG, "Killing app " + capp.processName
                         + " (pid " + capp.pid
                         + ") because provider " + cpr.info.name
                         + " is in dying process " + proc.processName);
@@ -10224,7 +10337,7 @@
         
         // If the app is undergoing backup, tell the backup manager about it
         if (mBackupTarget != null && app.pid == mBackupTarget.app.pid) {
-            if (DEBUG_BACKUP) Log.d(TAG, "App " + mBackupTarget.appInfo + " died during backup");
+            if (DEBUG_BACKUP) Slog.d(TAG, "App " + mBackupTarget.appInfo + " died during backup");
             try {
                 IBackupManager bm = IBackupManager.Stub.asInterface(
                         ServiceManager.getService(Context.BACKUP_SERVICE));
@@ -10241,7 +10354,7 @@
         }
 
         if (!app.persistent) {
-            if (DEBUG_PROCESSES) Log.v(TAG,
+            if (DEBUG_PROCESSES) Slog.v(TAG,
                     "Removing non-persistent process during cleanup: " + app);
             mProcessNames.remove(app.processName, app.info.uid);
         } else if (!app.removed) {
@@ -10430,7 +10543,7 @@
             if (checkComponentPermission(r.permission,
                     callingPid, callingUid, r.exported ? -1 : r.appInfo.uid)
                     != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission Denial: Accessing service " + r.name
+                Slog.w(TAG, "Permission Denial: Accessing service " + r.name
                         + " from pid=" + callingPid
                         + ", uid=" + callingUid
                         + " requires " + r.permission);
@@ -10471,7 +10584,7 @@
                 ServiceInfo sInfo =
                     rInfo != null ? rInfo.serviceInfo : null;
                 if (sInfo == null) {
-                    Log.w(TAG, "Unable to start service " + service +
+                    Slog.w(TAG, "Unable to start service " + service +
                           ": not found");
                     return null;
                 }
@@ -10513,7 +10626,7 @@
             if (checkComponentPermission(r.permission,
                     callingPid, callingUid, r.exported ? -1 : r.appInfo.uid)
                     != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission Denial: Accessing service " + r.name
+                Slog.w(TAG, "Permission Denial: Accessing service " + r.name
                         + " from pid=" + Binder.getCallingPid()
                         + ", uid=" + Binder.getCallingUid()
                         + " requires " + r.permission);
@@ -10549,7 +10662,7 @@
         while (i < N) {
             try {
                 ServiceRecord.StartItem si = r.pendingStarts.get(i);
-                if (DEBUG_SERVICE) Log.v(TAG, "Sending arguments to service: "
+                if (DEBUG_SERVICE) Slog.v(TAG, "Sending arguments to service: "
                         + r.name + " " + r.intent + " args=" + si.intent);
                 if (si.intent == null && N > 1) {
                     // If somehow we got a dummy start at the front, then
@@ -10579,7 +10692,7 @@
                 // care of this.
                 break;
             } catch (Exception e) {
-                Log.w(TAG, "Unexpected exception", e);
+                Slog.w(TAG, "Unexpected exception", e);
                 break;
             }
         }
@@ -10602,7 +10715,7 @@
         if ((!i.requested || rebind) && i.apps.size() > 0) {
             try {
                 bumpServiceExecutingLocked(r);
-                if (DEBUG_SERVICE) Log.v(TAG, "Connecting binding " + i
+                if (DEBUG_SERVICE) Slog.v(TAG, "Connecting binding " + i
                         + ": shouldUnbind=" + i.hasBound);
                 r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind);
                 if (!rebind) {
@@ -10642,7 +10755,7 @@
 
         boolean created = false;
         try {
-            if (DEBUG_SERVICE) Log.v(TAG, "Scheduling start service: "
+            if (DEBUG_SERVICE) Slog.v(TAG, "Scheduling start service: "
                     + r.name + " " + r.intent);
             mStringBuilder.setLength(0);
             r.intent.getIntent().toShortString(mStringBuilder, false, true);
@@ -10703,7 +10816,7 @@
                     if (minDuration < dur) minDuration = dur;
                     if (resetTime < dur) resetTime = dur;
                 } else {
-                    Log.w(TAG, "Canceling start item " + si.intent + " in service "
+                    Slog.w(TAG, "Canceling start item " + si.intent + " in service "
                             + r.name);
                     canceled = true;
                 }
@@ -10762,7 +10875,7 @@
         mHandler.removeCallbacks(r.restarter);
         mHandler.postAtTime(r.restarter, r.nextRestartTime);
         r.nextRestartTime = SystemClock.uptimeMillis() + r.restartDelay;
-        Log.w(TAG, "Scheduling restart of crashed service "
+        Slog.w(TAG, "Scheduling restart of crashed service "
                 + r.shortName + " in " + r.restartDelay + "ms");
         EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART,
                 r.shortName, r.restartDelay);
@@ -10789,7 +10902,7 @@
 
     private final boolean bringUpServiceLocked(ServiceRecord r,
             int intentFlags, boolean whileRestarting) {
-        //Log.i(TAG, "Bring up service:");
+        //Slog.i(TAG, "Bring up service:");
         //r.dump("  ");
 
         if (r.app != null && r.app.thread != null) {
@@ -10802,7 +10915,7 @@
             return true;
         }
 
-        if (DEBUG_SERVICE) Log.v(TAG, "Bringing up service " + r.name
+        if (DEBUG_SERVICE) Slog.v(TAG, "Bringing up service " + r.name
                 + " " + r.intent);
 
         // We are now bringing the service up, so no longer in the
@@ -10816,7 +10929,7 @@
                 realStartServiceLocked(r, app);
                 return true;
             } catch (RemoteException e) {
-                Log.w(TAG, "Exception when starting service " + r.shortName, e);
+                Slog.w(TAG, "Exception when starting service " + r.shortName, e);
             }
 
             // If a dead object exception was thrown -- fall through to
@@ -10827,7 +10940,7 @@
         // to be executed when the app comes up.
         if (startProcessLocked(appName, r.appInfo, true, intentFlags,
                 "service", r.name, false) == null) {
-            Log.w(TAG, "Unable to launch app "
+            Slog.w(TAG, "Unable to launch app "
                     + r.appInfo.packageName + "/"
                     + r.appInfo.uid + " for service "
                     + r.intent.getIntent() + ": process is bad");
@@ -10843,7 +10956,7 @@
     }
 
     private final void bringDownServiceLocked(ServiceRecord r, boolean force) {
-        //Log.i(TAG, "Bring down service:");
+        //Slog.i(TAG, "Bring down service:");
         //r.dump("  ");
 
         // Does it still need to run?
@@ -10872,7 +10985,7 @@
                     // todo: shouldn't be a synchronous call!
                     c.conn.connected(r.name, null);
                 } catch (Exception e) {
-                    Log.w(TAG, "Failure disconnecting service " + r.name +
+                    Slog.w(TAG, "Failure disconnecting service " + r.name +
                           " to connection " + c.conn.asBinder() +
                           " (in " + c.binding.client.processName + ")", e);
                 }
@@ -10884,7 +10997,7 @@
             Iterator<IntentBindRecord> it = r.bindings.values().iterator();
             while (it.hasNext()) {
                 IntentBindRecord ibr = it.next();
-                if (DEBUG_SERVICE) Log.v(TAG, "Bringing down binding " + ibr
+                if (DEBUG_SERVICE) Slog.v(TAG, "Bringing down binding " + ibr
                         + ": hasBound=" + ibr.hasBound);
                 if (r.app != null && r.app.thread != null && ibr.hasBound) {
                     try {
@@ -10894,7 +11007,7 @@
                         r.app.thread.scheduleUnbindService(r,
                                 ibr.intent.getIntent());
                     } catch (Exception e) {
-                        Log.w(TAG, "Exception when unbinding service "
+                        Slog.w(TAG, "Exception when unbinding service "
                                 + r.shortName, e);
                         serviceDoneExecutingLocked(r, true);
                     }
@@ -10902,7 +11015,7 @@
             }
         }
 
-        if (DEBUG_SERVICE) Log.v(TAG, "Bringing down service " + r.name
+        if (DEBUG_SERVICE) Slog.v(TAG, "Bringing down service " + r.name
                  + " " + r.intent);
         EventLog.writeEvent(EventLogTags.AM_DESTROY_SERVICE,
                 System.identityHashCode(r), r.shortName,
@@ -10910,7 +11023,7 @@
 
         mServices.remove(r.name);
         mServicesByIntent.remove(r.intent);
-        if (localLOGV) Log.v(TAG, "BRING DOWN SERVICE: " + r.shortName);
+        if (localLOGV) Slog.v(TAG, "BRING DOWN SERVICE: " + r.shortName);
         r.totalRestartCount = 0;
         unscheduleServiceRestartLocked(r);
 
@@ -10919,7 +11032,7 @@
         for (int i=0; i<N; i++) {
             if (mPendingServices.get(i) == r) {
                 mPendingServices.remove(i);
-                if (DEBUG_SERVICE) Log.v(
+                if (DEBUG_SERVICE) Slog.v(
                     TAG, "Removed pending service: " + r.shortName);
                 i--;
                 N--;
@@ -10942,24 +11055,24 @@
             r.app.services.remove(r);
             if (r.app.thread != null) {
                 try {
-                    if (DEBUG_SERVICE) Log.v(TAG,
+                    if (DEBUG_SERVICE) Slog.v(TAG,
                             "Stopping service: " + r.shortName);
                     bumpServiceExecutingLocked(r);
                     mStoppingServices.add(r);
                     updateOomAdjLocked(r.app);
                     r.app.thread.scheduleStopService(r);
                 } catch (Exception e) {
-                    Log.w(TAG, "Exception when stopping service "
+                    Slog.w(TAG, "Exception when stopping service "
                             + r.shortName, e);
                     serviceDoneExecutingLocked(r, true);
                 }
                 updateServiceForegroundLocked(r.app, false);
             } else {
-                if (DEBUG_SERVICE) Log.v(
+                if (DEBUG_SERVICE) Slog.v(
                     TAG, "Removed service that has no process: " + r.shortName);
             }
         } else {
-            if (DEBUG_SERVICE) Log.v(
+            if (DEBUG_SERVICE) Slog.v(
                 TAG, "Removed service that is not running: " + r.shortName);
         }
     }
@@ -10968,7 +11081,7 @@
             Intent service, String resolvedType,
             int callingPid, int callingUid) {
         synchronized(this) {
-            if (DEBUG_SERVICE) Log.v(TAG, "startService: " + service
+            if (DEBUG_SERVICE) Slog.v(TAG, "startService: " + service
                     + " type=" + resolvedType + " args=" + service.getExtras());
 
             if (caller != null) {
@@ -10993,7 +11106,7 @@
             }
             ServiceRecord r = res.record;
             if (unscheduleServiceRestartLocked(r)) {
-                if (DEBUG_SERVICE) Log.v(TAG, "START SERVICE WHILE RESTART PENDING: "
+                if (DEBUG_SERVICE) Slog.v(TAG, "START SERVICE WHILE RESTART PENDING: "
                         + r.shortName);
             }
             r.startRequested = true;
@@ -11051,7 +11164,7 @@
         }
 
         synchronized(this) {
-            if (DEBUG_SERVICE) Log.v(TAG, "stopService: " + service
+            if (DEBUG_SERVICE) Slog.v(TAG, "stopService: " + service
                     + " type=" + resolvedType);
 
             final ProcessRecord callerApp = getRecordForAppLocked(caller);
@@ -11116,7 +11229,7 @@
     public boolean stopServiceToken(ComponentName className, IBinder token,
             int startId) {
         synchronized(this) {
-            if (DEBUG_SERVICE) Log.v(TAG, "stopServiceToken: " + className
+            if (DEBUG_SERVICE) Slog.v(TAG, "stopServiceToken: " + className
                     + " " + token + " startId=" + startId);
             ServiceRecord r = findServiceLocked(className, token);
             if (r != null) {
@@ -11138,7 +11251,7 @@
                     }
                     
                     if (r.deliveredStarts.size() > 0) {
-                        Log.w(TAG, "stopServiceToken startId " + startId
+                        Slog.w(TAG, "stopServiceToken startId " + startId
                                 + " is last, but have " + r.deliveredStarts.size()
                                 + " remaining args");
                     }
@@ -11225,7 +11338,7 @@
         }
 
         synchronized(this) {
-            if (DEBUG_SERVICE) Log.v(TAG, "bindService: " + service
+            if (DEBUG_SERVICE) Slog.v(TAG, "bindService: " + service
                     + " type=" + resolvedType + " conn=" + connection.asBinder()
                     + " flags=0x" + Integer.toHexString(flags));
             final ProcessRecord callerApp = getRecordForAppLocked(caller);
@@ -11240,7 +11353,7 @@
             if (token != null) {
                 int aindex = indexOfTokenLocked(token);
                 if (aindex < 0) {
-                    Log.w(TAG, "Binding with unknown activity: " + token);
+                    Slog.w(TAG, "Binding with unknown activity: " + token);
                     return 0;
                 }
                 activity = (HistoryRecord)mHistory.get(aindex);
@@ -11283,7 +11396,7 @@
             final long origId = Binder.clearCallingIdentity();
 
             if (unscheduleServiceRestartLocked(s)) {
-                if (DEBUG_SERVICE) Log.v(TAG, "BIND SERVICE WHILE RESTART PENDING: "
+                if (DEBUG_SERVICE) Slog.v(TAG, "BIND SERVICE WHILE RESTART PENDING: "
                         + s.shortName);
             }
 
@@ -11315,7 +11428,7 @@
                 updateOomAdjLocked(s.app);
             }
 
-            if (DEBUG_SERVICE) Log.v(TAG, "Bind " + s + " with " + b
+            if (DEBUG_SERVICE) Slog.v(TAG, "Bind " + s + " with " + b
                     + ": received=" + b.intent.received
                     + " apps=" + b.intent.apps.size()
                     + " doRebind=" + b.intent.doRebind);
@@ -11326,7 +11439,7 @@
                 try {
                     c.conn.connected(s.name, b.intent.binder);
                 } catch (Exception e) {
-                    Log.w(TAG, "Failure sending service " + s.shortName
+                    Slog.w(TAG, "Failure sending service " + s.shortName
                             + " to connection " + c.conn.asBinder()
                             + " (in " + c.binding.client.processName + ")", e);
                 }
@@ -11368,7 +11481,7 @@
             b.intent.apps.remove(b.client);
         }
 
-        if (DEBUG_SERVICE) Log.v(TAG, "Disconnecting binding " + b.intent
+        if (DEBUG_SERVICE) Slog.v(TAG, "Disconnecting binding " + b.intent
                 + ": shouldUnbind=" + b.intent.hasBound);
         if (s.app != null && s.app.thread != null && b.intent.apps.size() == 0
                 && b.intent.hasBound) {
@@ -11381,7 +11494,7 @@
                 b.intent.doRebind = false;
                 s.app.thread.scheduleUnbindService(s, b.intent.intent.getIntent());
             } catch (Exception e) {
-                Log.w(TAG, "Exception when unbinding service " + s.shortName, e);
+                Slog.w(TAG, "Exception when unbinding service " + s.shortName, e);
                 serviceDoneExecutingLocked(s, true);
             }
         }
@@ -11394,10 +11507,10 @@
     public boolean unbindService(IServiceConnection connection) {
         synchronized (this) {
             IBinder binder = connection.asBinder();
-            if (DEBUG_SERVICE) Log.v(TAG, "unbindService: conn=" + binder);
+            if (DEBUG_SERVICE) Slog.v(TAG, "unbindService: conn=" + binder);
             ConnectionRecord r = mServiceConnections.get(binder);
             if (r == null) {
-                Log.w(TAG, "Unbind failed: could not find connection for "
+                Slog.w(TAG, "Unbind failed: could not find connection for "
                       + connection.asBinder());
                 return false;
             }
@@ -11431,7 +11544,7 @@
 
             final long origId = Binder.clearCallingIdentity();
 
-            if (DEBUG_SERVICE) Log.v(TAG, "PUBLISHING SERVICE " + r.name
+            if (DEBUG_SERVICE) Slog.v(TAG, "PUBLISHING SERVICE " + r.name
                     + " " + intent + ": " + service);
             if (r != null) {
                 Intent.FilterComparison filter
@@ -11447,19 +11560,19 @@
                         while (it.hasNext()) {
                             ConnectionRecord c = it.next();
                             if (!filter.equals(c.binding.intent.intent)) {
-                                if (DEBUG_SERVICE) Log.v(
+                                if (DEBUG_SERVICE) Slog.v(
                                         TAG, "Not publishing to: " + c);
-                                if (DEBUG_SERVICE) Log.v(
+                                if (DEBUG_SERVICE) Slog.v(
                                         TAG, "Bound intent: " + c.binding.intent.intent);
-                                if (DEBUG_SERVICE) Log.v(
+                                if (DEBUG_SERVICE) Slog.v(
                                         TAG, "Published intent: " + intent);
                                 continue;
                             }
-                            if (DEBUG_SERVICE) Log.v(TAG, "Publishing to: " + c);
+                            if (DEBUG_SERVICE) Slog.v(TAG, "Publishing to: " + c);
                             try {
                                 c.conn.connected(r.name, service);
                             } catch (Exception e) {
-                                Log.w(TAG, "Failure sending service " + r.name +
+                                Slog.w(TAG, "Failure sending service " + r.name +
                                       " to connection " + c.conn.asBinder() +
                                       " (in " + c.binding.client.processName + ")", e);
                             }
@@ -11492,7 +11605,7 @@
                 Intent.FilterComparison filter
                         = new Intent.FilterComparison(intent);
                 IntentBindRecord b = r.bindings.get(filter);
-                if (DEBUG_SERVICE) Log.v(TAG, "unbindFinished in " + r
+                if (DEBUG_SERVICE) Slog.v(TAG, "unbindFinished in " + r
                         + " at " + b + ": apps="
                         + (b != null ? b.apps.size() : 0));
                 if (b != null) {
@@ -11522,11 +11635,11 @@
             ServiceRecord r = (ServiceRecord)token;
             boolean inStopping = mStoppingServices.contains(token);
             if (r != null) {
-                if (DEBUG_SERVICE) Log.v(TAG, "DONE EXECUTING SERVICE " + r.name
+                if (DEBUG_SERVICE) Slog.v(TAG, "DONE EXECUTING SERVICE " + r.name
                         + ": nesting=" + r.executeNesting
                         + ", inStopping=" + inStopping);
                 if (r != token) {
-                    Log.w(TAG, "Done executing service " + r.name
+                    Slog.w(TAG, "Done executing service " + r.name
                           + " with incorrect token: given " + token
                           + ", expected " + r);
                     return;
@@ -11581,7 +11694,7 @@
                 serviceDoneExecutingLocked(r, inStopping);
                 Binder.restoreCallingIdentity(origId);
             } else {
-                Log.w(TAG, "Done executing unknown service " + r.name
+                Slog.w(TAG, "Done executing unknown service " + r.name
                         + " with token " + token);
             }
         }
@@ -11621,7 +11734,7 @@
                 }
             }
             if (timeout != null && mLruProcesses.contains(proc)) {
-                Log.w(TAG, "Timeout executing service: " + timeout);
+                Slog.w(TAG, "Timeout executing service: " + timeout);
                 appNotRespondingLocked(proc, null, null, "Executing service " + timeout.shortName);
             } else {
                 Message msg = mHandler.obtainMessage(SERVICE_TIMEOUT_MSG);
@@ -11639,7 +11752,7 @@
     // instantiated.  The backup agent will invoke backupAgentCreated() on the
     // activity manager to announce its creation.
     public boolean bindBackupAgent(ApplicationInfo app, int backupMode) {
-        if (DEBUG_BACKUP) Log.v(TAG, "startBackupAgent: app=" + app + " mode=" + backupMode);
+        if (DEBUG_BACKUP) Slog.v(TAG, "startBackupAgent: app=" + app + " mode=" + backupMode);
         enforceCallingPermission("android.permission.BACKUP", "startBackupAgent");
 
         synchronized(this) {
@@ -11656,7 +11769,7 @@
             ProcessRecord proc = startProcessLocked(app.processName, app,
                     false, 0, "backup", hostingName, false);
             if (proc == null) {
-                Log.e(TAG, "Unable to start backup agent process " + r);
+                Slog.e(TAG, "Unable to start backup agent process " + r);
                 return false;
             }
 
@@ -11670,14 +11783,14 @@
             // If the process is already attached, schedule the creation of the backup agent now.
             // If it is not yet live, this will be done when it attaches to the framework.
             if (proc.thread != null) {
-                if (DEBUG_BACKUP) Log.v(TAG, "Agent proc already running: " + proc);
+                if (DEBUG_BACKUP) Slog.v(TAG, "Agent proc already running: " + proc);
                 try {
                     proc.thread.scheduleCreateBackupAgent(app, backupMode);
                 } catch (RemoteException e) {
                     // Will time out on the backup manager side
                 }
             } else {
-                if (DEBUG_BACKUP) Log.v(TAG, "Agent proc not running, waiting for attach");
+                if (DEBUG_BACKUP) Slog.v(TAG, "Agent proc not running, waiting for attach");
             }
             // Invariants: at this point, the target app process exists and the application
             // is either already running or in the process of coming up.  mBackupTarget and
@@ -11690,12 +11803,12 @@
 
     // A backup agent has just come up                    
     public void backupAgentCreated(String agentPackageName, IBinder agent) {
-        if (DEBUG_BACKUP) Log.v(TAG, "backupAgentCreated: " + agentPackageName
+        if (DEBUG_BACKUP) Slog.v(TAG, "backupAgentCreated: " + agentPackageName
                 + " = " + agent);
 
         synchronized(this) {
             if (!agentPackageName.equals(mBackupAppName)) {
-                Log.e(TAG, "Backup agent created for " + agentPackageName + " but not requested!");
+                Slog.e(TAG, "Backup agent created for " + agentPackageName + " but not requested!");
                 return;
             }
 
@@ -11707,7 +11820,7 @@
             } catch (RemoteException e) {
                 // can't happen; the backup manager service is local
             } catch (Exception e) {
-                Log.w(TAG, "Exception trying to deliver BackupAgent binding: ");
+                Slog.w(TAG, "Exception trying to deliver BackupAgent binding: ");
                 e.printStackTrace();
             } finally {
                 Binder.restoreCallingIdentity(oldIdent);
@@ -11717,20 +11830,20 @@
 
     // done with this agent
     public void unbindBackupAgent(ApplicationInfo appInfo) {
-        if (DEBUG_BACKUP) Log.v(TAG, "unbindBackupAgent: " + appInfo);
+        if (DEBUG_BACKUP) Slog.v(TAG, "unbindBackupAgent: " + appInfo);
         if (appInfo == null) {
-            Log.w(TAG, "unbind backup agent for null app");
+            Slog.w(TAG, "unbind backup agent for null app");
             return;
         }
 
         synchronized(this) {
             if (mBackupAppName == null) {
-                Log.w(TAG, "Unbinding backup agent with no active backup");
+                Slog.w(TAG, "Unbinding backup agent with no active backup");
                 return;
             }
 
             if (!mBackupAppName.equals(appInfo.packageName)) {
-                Log.e(TAG, "Unbind of " + appInfo + " but is not the current backup target");
+                Slog.e(TAG, "Unbind of " + appInfo + " but is not the current backup target");
                 return;
             }
 
@@ -11746,7 +11859,7 @@
                 try {
                     proc.thread.scheduleDestroyBackupAgent(appInfo);
                 } catch (Exception e) {
-                    Log.e(TAG, "Exception when unbinding backup agent:");
+                    Slog.e(TAG, "Exception when unbinding backup agent:");
                     e.printStackTrace();
                 }
             }
@@ -11777,7 +11890,7 @@
     }
 
     private final void scheduleBroadcastsLocked() {
-        if (DEBUG_BROADCAST) Log.v(TAG, "Schedule broadcasts: current="
+        if (DEBUG_BROADCAST) Slog.v(TAG, "Schedule broadcasts: current="
                 + mBroadcastsScheduled);
 
         if (mBroadcastsScheduled) {
@@ -11818,7 +11931,7 @@
             // the client.
             Intent sticky = allSticky != null ? (Intent)allSticky.get(0) : null;
 
-            if (DEBUG_BROADCAST) Log.v(TAG, "Register receiver " + filter
+            if (DEBUG_BROADCAST) Slog.v(TAG, "Register receiver " + filter
                     + ": " + sticky);
 
             if (receiver == null) {
@@ -11846,7 +11959,7 @@
             BroadcastFilter bf = new BroadcastFilter(filter, rl, permission);
             rl.add(bf);
             if (!bf.debugCheck()) {
-                Log.w(TAG, "==> For Dynamic broadast");
+                Slog.w(TAG, "==> For Dynamic broadast");
             }
             mReceiverResolver.addFilter(bf);
 
@@ -11874,7 +11987,7 @@
     }
 
     public void unregisterReceiver(IIntentReceiver receiver) {
-        if (DEBUG_BROADCAST) Log.v(TAG, "Unregister receiver: " + receiver);
+        if (DEBUG_BROADCAST) Slog.v(TAG, "Unregister receiver: " + receiver);
 
         boolean doNext = false;
 
@@ -11925,11 +12038,11 @@
             boolean ordered, boolean sticky, int callingPid, int callingUid) {
         intent = new Intent(intent);
 
-        if (DEBUG_BROADCAST_LIGHT) Log.v(
+        if (DEBUG_BROADCAST_LIGHT) Slog.v(
             TAG, (sticky ? "Broadcast sticky: ": "Broadcast: ") + intent
             + " ordered=" + ordered);
         if ((resultTo != null) && !ordered) {
-            Log.w(TAG, "Broadcast " + intent + " not ordered but result callback requested!");
+            Slog.w(TAG, "Broadcast " + intent + " not ordered but result callback requested!");
         }
         
         // Handle special intents: if this broadcast is from the package
@@ -11982,7 +12095,7 @@
                         + ", uid=" + callingUid + ")"
                         + " requires "
                         + android.Manifest.permission.BROADCAST_PACKAGE_REMOVED;
-                Log.w(TAG, msg);
+                Slog.w(TAG, msg);
                 throw new SecurityException(msg);
             }
         }
@@ -12010,11 +12123,11 @@
                     String msg = "Permission Denial: not allowed to send broadcast "
                             + intent.getAction() + " from pid="
                             + callingPid + ", uid=" + callingUid;
-                    Log.w(TAG, msg);
+                    Slog.w(TAG, msg);
                     throw new SecurityException(msg);
                 }
             } catch (RemoteException e) {
-                Log.w(TAG, "Remote exception", e);
+                Slog.w(TAG, "Remote exception", e);
                 return BROADCAST_SUCCESS;
             }
         }
@@ -12027,11 +12140,11 @@
                 String msg = "Permission Denial: broadcastIntent() requesting a sticky broadcast from pid="
                         + callingPid + ", uid=" + callingUid
                         + " requires " + android.Manifest.permission.BROADCAST_STICKY;
-                Log.w(TAG, msg);
+                Slog.w(TAG, msg);
                 throw new SecurityException(msg);
             }
             if (requiredPermission != null) {
-                Log.w(TAG, "Can't broadcast sticky intent " + intent
+                Slog.w(TAG, "Can't broadcast sticky intent " + intent
                         + " and enforce permission " + requiredPermission);
                 return BROADCAST_STICKY_CANT_HAVE_PERMISSION;
             }
@@ -12089,7 +12202,7 @@
         final boolean replacePending =
                 (intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
         
-        if (DEBUG_BROADCAST) Log.v(TAG, "Enqueing broadcast: " + intent.getAction()
+        if (DEBUG_BROADCAST) Slog.v(TAG, "Enqueing broadcast: " + intent.getAction()
                 + " replacePending=" + replacePending);
         
         int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
@@ -12101,14 +12214,14 @@
                     callerPackage, callingPid, callingUid, requiredPermission,
                     registeredReceivers, resultTo, resultCode, resultData, map,
                     ordered, sticky, false);
-            if (DEBUG_BROADCAST) Log.v(
+            if (DEBUG_BROADCAST) Slog.v(
                     TAG, "Enqueueing parallel broadcast " + r
                     + ": prev had " + mParallelBroadcasts.size());
             boolean replaced = false;
             if (replacePending) {
                 for (int i=mParallelBroadcasts.size()-1; i>=0; i--) {
                     if (intent.filterEquals(mParallelBroadcasts.get(i).intent)) {
-                        if (DEBUG_BROADCAST) Log.v(TAG,
+                        if (DEBUG_BROADCAST) Slog.v(TAG,
                                 "***** DROPPING PARALLEL: " + intent);
                         mParallelBroadcasts.set(i, r);
                         replaced = true;
@@ -12202,18 +12315,18 @@
                     callerPackage, callingPid, callingUid, requiredPermission,
                     receivers, resultTo, resultCode, resultData, map, ordered,
                     sticky, false);
-            if (DEBUG_BROADCAST) Log.v(
+            if (DEBUG_BROADCAST) Slog.v(
                     TAG, "Enqueueing ordered broadcast " + r
                     + ": prev had " + mOrderedBroadcasts.size());
             if (DEBUG_BROADCAST) {
                 int seq = r.intent.getIntExtra("seq", -1);
-                Log.i(TAG, "Enqueueing broadcast " + r.intent.getAction() + " seq=" + seq);
+                Slog.i(TAG, "Enqueueing broadcast " + r.intent.getAction() + " seq=" + seq);
             }
             boolean replaced = false;
             if (replacePending) {
                 for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) {
                     if (intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
-                        if (DEBUG_BROADCAST) Log.v(TAG,
+                        if (DEBUG_BROADCAST) Slog.v(TAG,
                                 "***** DROPPING ORDERED: " + intent);
                         mOrderedBroadcasts.set(i, r);
                         replaced = true;
@@ -12249,7 +12362,7 @@
                     intent = new Intent(intent);
                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                 } else if ((flags&Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0){
-                    Log.e(TAG, "Attempt to launch receivers of broadcast intent " + intent
+                    Slog.e(TAG, "Attempt to launch receivers of broadcast intent " + intent
                             + " before boot completion");
                     throw new IllegalStateException("Cannot broadcast before boot completed");
                 }
@@ -12302,7 +12415,7 @@
                         + Binder.getCallingPid()
                         + ", uid=" + Binder.getCallingUid()
                         + " requires " + android.Manifest.permission.BROADCAST_STICKY;
-                Log.w(TAG, msg);
+                Slog.w(TAG, msg);
                 throw new SecurityException(msg);
             }
             ArrayList<Intent> list = mStickyBroadcasts.get(intent.getAction());
@@ -12324,26 +12437,26 @@
             boolean explicit) {
         if (mOrderedBroadcasts.size() == 0) {
             if (explicit) {
-                Log.w(TAG, "finishReceiver called but no pending broadcasts");
+                Slog.w(TAG, "finishReceiver called but no pending broadcasts");
             }
             return false;
         }
         BroadcastRecord r = mOrderedBroadcasts.get(0);
         if (r.receiver == null) {
             if (explicit) {
-                Log.w(TAG, "finishReceiver called but none active");
+                Slog.w(TAG, "finishReceiver called but none active");
             }
             return false;
         }
         if (r.receiver != receiver) {
-            Log.w(TAG, "finishReceiver called but active receiver is different");
+            Slog.w(TAG, "finishReceiver called but active receiver is different");
             return false;
         }
         int state = r.state;
         r.state = r.IDLE;
         if (state == r.IDLE) {
             if (explicit) {
-                Log.w(TAG, "finishReceiver called but state is IDLE");
+                Slog.w(TAG, "finishReceiver called but state is IDLE");
             }
         }
         r.receiver = null;
@@ -12374,7 +12487,7 @@
 
     public void finishReceiver(IBinder who, int resultCode, String resultData,
             Bundle resultExtras, boolean resultAbort) {
-        if (DEBUG_BROADCAST) Log.v(TAG, "Finish receiver: " + who);
+        if (DEBUG_BROADCAST) Slog.v(TAG, "Finish receiver: " + who);
 
         // Refuse possible leaked file descriptors
         if (resultExtras != null && resultExtras.hasFileDescriptors()) {
@@ -12416,7 +12529,7 @@
                         ((ResolveInfo)curReceiver).toString());
             }
         } else {
-            Log.w(TAG, "Discarding broadcast before first receiver is invoked: "
+            Slog.w(TAG, "Discarding broadcast before first receiver is invoked: "
                     + r);
             EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
                     System.identityHashCode(r),
@@ -12434,7 +12547,7 @@
             long now = SystemClock.uptimeMillis();
             BroadcastRecord r = mOrderedBroadcasts.get(0);
             if ((r.receiverTime+BROADCAST_TIMEOUT) > now) {
-                if (DEBUG_BROADCAST) Log.v(TAG,
+                if (DEBUG_BROADCAST) Slog.v(TAG,
                         "Premature timeout @ " + now + ": resetting BROADCAST_TIMEOUT_MSG for "
                         + (r.receiverTime + BROADCAST_TIMEOUT));
                 Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG);
@@ -12442,20 +12555,20 @@
                 return;
             }
 
-            Log.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver);
+            Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver);
             r.receiverTime = now;
             r.anrCount++;
 
             // Current receiver has passed its expiration date.
             if (r.nextReceiver <= 0) {
-                Log.w(TAG, "Timeout on receiver with nextReceiver <= 0");
+                Slog.w(TAG, "Timeout on receiver with nextReceiver <= 0");
                 return;
             }
 
             ProcessRecord app = null;
 
             Object curReceiver = r.receivers.get(r.nextReceiver-1);
-            Log.w(TAG, "Receiver during timeout: " + curReceiver);
+            Slog.w(TAG, "Receiver during timeout: " + curReceiver);
             logBroadcastReceiverDiscard(r);
             if (curReceiver instanceof BroadcastFilter) {
                 BroadcastFilter bf = (BroadcastFilter)curReceiver;
@@ -12500,7 +12613,7 @@
 
         boolean started = false;
         try {
-            if (DEBUG_BROADCAST_LIGHT) Log.v(TAG,
+            if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG,
                     "Delivering to component " + r.curComponent
                     + ": " + r);
             ensurePackageDexOpt(r.intent.getComponent().getPackageName());
@@ -12537,7 +12650,7 @@
             int perm = checkComponentPermission(filter.requiredPermission,
                     r.callingPid, r.callingUid, -1);
             if (perm != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission Denial: broadcasting "
+                Slog.w(TAG, "Permission Denial: broadcasting "
                         + r.intent.toString()
                         + " from " + r.callerPackage + " (pid="
                         + r.callingPid + ", uid=" + r.callingUid + ")"
@@ -12550,7 +12663,7 @@
             int perm = checkComponentPermission(r.requiredPermission,
                     filter.receiverList.pid, filter.receiverList.uid, -1);
             if (perm != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission Denial: receiving "
+                Slog.w(TAG, "Permission Denial: receiving "
                         + r.intent.toString()
                         + " to " + filter.receiverList.app
                         + " (pid=" + filter.receiverList.pid
@@ -12585,7 +12698,7 @@
             try {
                 if (DEBUG_BROADCAST_LIGHT) {
                     int seq = r.intent.getIntExtra("seq", -1);
-                    Log.i(TAG, "Delivering to " + filter.receiverList.app
+                    Slog.i(TAG, "Delivering to " + filter.receiverList.app
                             + " (seq=" + seq + "): " + r);
                 }
                 performReceive(filter.receiverList.app, filter.receiverList.receiver,
@@ -12595,7 +12708,7 @@
                     r.state = BroadcastRecord.CALL_DONE_RECEIVE;
                 }
             } catch (RemoteException e) {
-                Log.w(TAG, "Failure sending broadcast " + r.intent, e);
+                Slog.w(TAG, "Failure sending broadcast " + r.intent, e);
                 if (ordered) {
                     r.receiver = null;
                     r.curFilter = null;
@@ -12623,7 +12736,7 @@
         synchronized(this) {
             BroadcastRecord r;
 
-            if (DEBUG_BROADCAST) Log.v(TAG, "processNextBroadcast: "
+            if (DEBUG_BROADCAST) Slog.v(TAG, "processNextBroadcast: "
                     + mParallelBroadcasts.size() + " broadcasts, "
                     + mOrderedBroadcasts.size() + " serialized broadcasts");
 
@@ -12638,17 +12751,17 @@
                 r = mParallelBroadcasts.remove(0);
                 r.dispatchTime = SystemClock.uptimeMillis();
                 final int N = r.receivers.size();
-                if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing parallel broadcast "
+                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing parallel broadcast "
                         + r);
                 for (int i=0; i<N; i++) {
                     Object target = r.receivers.get(i);
-                    if (DEBUG_BROADCAST)  Log.v(TAG,
+                    if (DEBUG_BROADCAST)  Slog.v(TAG,
                             "Delivering non-serialized to registered "
                             + target + ": " + r);
                     deliverToRegisteredReceiver(r, (BroadcastFilter)target, false);
                 }
                 addBroadcastToHistoryLocked(r);
-                if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Done with parallel broadcast "
+                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Done with parallel broadcast "
                         + r);
             }
 
@@ -12659,7 +12772,7 @@
             // check that the process we're waiting for still exists.
             if (mPendingBroadcast != null) {
                 if (DEBUG_BROADCAST_LIGHT) {
-                    Log.v(TAG, "processNextBroadcast: waiting for "
+                    Slog.v(TAG, "processNextBroadcast: waiting for "
                             + mPendingBroadcast.curApp);
                 }
 
@@ -12671,7 +12784,7 @@
                     // It's still alive, so keep waiting
                     return;
                 } else {
-                    Log.w(TAG, "pending app " + mPendingBroadcast.curApp
+                    Slog.w(TAG, "pending app " + mPendingBroadcast.curApp
                             + " died before responding to broadcast");
                     mPendingBroadcast = null;
                 }
@@ -12702,7 +12815,7 @@
                 if (r.dispatchTime > 0) {
                     if ((numReceivers > 0) &&
                             (now > r.dispatchTime + (2*BROADCAST_TIMEOUT*numReceivers))) {
-                        Log.w(TAG, "Hung broadcast discarded after timeout failure:"
+                        Slog.w(TAG, "Hung broadcast discarded after timeout failure:"
                                 + " now=" + now
                                 + " dispatchTime=" + r.dispatchTime
                                 + " startTime=" + r.receiverTime
@@ -12717,7 +12830,7 @@
                 }
 
                 if (r.state != BroadcastRecord.IDLE) {
-                    if (DEBUG_BROADCAST) Log.d(TAG,
+                    if (DEBUG_BROADCAST) Slog.d(TAG,
                             "processNextBroadcast() called when not idle (state="
                             + r.state + ")");
                     return;
@@ -12731,21 +12844,21 @@
                         try {
                             if (DEBUG_BROADCAST) {
                                 int seq = r.intent.getIntExtra("seq", -1);
-                                Log.i(TAG, "Finishing broadcast " + r.intent.getAction()
+                                Slog.i(TAG, "Finishing broadcast " + r.intent.getAction()
                                         + " seq=" + seq + " app=" + r.callerApp);
                             }
                             performReceive(r.callerApp, r.resultTo,
                                 new Intent(r.intent), r.resultCode,
                                 r.resultData, r.resultExtras, false, false);
                         } catch (RemoteException e) {
-                            Log.w(TAG, "Failure sending broadcast result of " + r.intent, e);
+                            Slog.w(TAG, "Failure sending broadcast result of " + r.intent, e);
                         }
                     }
                     
-                    if (DEBUG_BROADCAST) Log.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
+                    if (DEBUG_BROADCAST) Slog.v(TAG, "Cancelling BROADCAST_TIMEOUT_MSG");
                     mHandler.removeMessages(BROADCAST_TIMEOUT_MSG);
 
-                    if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Finished with ordered broadcast "
+                    if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Finished with ordered broadcast "
                             + r);
                     
                     // ... and on to the next...
@@ -12766,9 +12879,9 @@
             if (recIdx == 0) {
                 r.dispatchTime = r.receiverTime;
 
-                if (DEBUG_BROADCAST_LIGHT) Log.v(TAG, "Processing ordered broadcast "
+                if (DEBUG_BROADCAST_LIGHT) Slog.v(TAG, "Processing ordered broadcast "
                         + r);
-                if (DEBUG_BROADCAST) Log.v(TAG,
+                if (DEBUG_BROADCAST) Slog.v(TAG,
                         "Submitting BROADCAST_TIMEOUT_MSG for "
                         + (r.receiverTime + BROADCAST_TIMEOUT));
                 Message msg = mHandler.obtainMessage(BROADCAST_TIMEOUT_MSG);
@@ -12780,7 +12893,7 @@
                 // Simple case: this is a registered receiver who gets
                 // a direct call.
                 BroadcastFilter filter = (BroadcastFilter)nextReceiver;
-                if (DEBUG_BROADCAST)  Log.v(TAG,
+                if (DEBUG_BROADCAST)  Slog.v(TAG,
                         "Delivering serialized to registered "
                         + filter + ": " + r);
                 deliverToRegisteredReceiver(r, filter, r.ordered);
@@ -12805,7 +12918,7 @@
                     info.activityInfo.exported
                             ? -1 : info.activityInfo.applicationInfo.uid);
             if (perm != PackageManager.PERMISSION_GRANTED) {
-                Log.w(TAG, "Permission Denial: broadcasting "
+                Slog.w(TAG, "Permission Denial: broadcasting "
                         + r.intent.toString()
                         + " from " + r.callerPackage + " (pid=" + r.callingPid
                         + ", uid=" + r.callingUid + ")"
@@ -12824,7 +12937,7 @@
                     perm = PackageManager.PERMISSION_DENIED;
                 }
                 if (perm != PackageManager.PERMISSION_GRANTED) {
-                    Log.w(TAG, "Permission Denial: receiving "
+                    Slog.w(TAG, "Permission Denial: receiving "
                             + r.intent + " to "
                             + info.activityInfo.applicationInfo.packageName
                             + " requires " + r.requiredPermission
@@ -12861,7 +12974,7 @@
                     processCurBroadcastLocked(r, app);
                     return;
                 } catch (RemoteException e) {
-                    Log.w(TAG, "Exception when sending broadcast to "
+                    Slog.w(TAG, "Exception when sending broadcast to "
                           + r.curComponent, e);
                 }
 
@@ -12878,7 +12991,7 @@
                             == null) {
                 // Ah, this recipient is unavailable.  Finish it if necessary,
                 // and mark the broadcast record as ready for the next.
-                Log.w(TAG, "Unable to launch app "
+                Slog.w(TAG, "Unable to launch app "
                         + info.activityInfo.applicationInfo.packageName + "/"
                         + info.activityInfo.applicationInfo.uid + " for broadcast "
                         + r.intent + ": process is bad");
@@ -12967,7 +13080,7 @@
      */
     private void reportStartInstrumentationFailure(IInstrumentationWatcher watcher, 
             ComponentName cn, String report) {
-        Log.w(TAG, report);
+        Slog.w(TAG, report);
         try {
             if (watcher != null) {
                 Bundle results = new Bundle();
@@ -12976,7 +13089,7 @@
                 watcher.instrumentationStatus(cn, -1, results);
             }
         } catch (RemoteException e) {
-            Log.w(TAG, e);
+            Slog.w(TAG, e);
         }
     }
 
@@ -13010,7 +13123,7 @@
         synchronized(this) {
             ProcessRecord app = getRecordForAppLocked(target);
             if (app == null) {
-                Log.w(TAG, "finishInstrumentation: no app for " + target);
+                Slog.w(TAG, "finishInstrumentation: no app for " + target);
                 return;
             }
             final long origId = Binder.clearCallingIdentity();
@@ -13084,7 +13197,7 @@
             changes = newConfig.updateFrom(values);
             if (changes != 0) {
                 if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
-                    Log.i(TAG, "Updating configuration to: " + values);
+                    Slog.i(TAG, "Updating configuration to: " + values);
                 }
                 
                 EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
@@ -13101,7 +13214,7 @@
                 }
                 newConfig.seq = mConfigurationSeq;
                 mConfiguration = newConfig;
-                Log.i(TAG, "Config changed: " + newConfig);
+                Slog.i(TAG, "Config changed: " + newConfig);
                 
                 AttributeCache ac = AttributeCache.instance();
                 if (ac != null) {
@@ -13116,7 +13229,7 @@
                     ProcessRecord app = mLruProcesses.get(i);
                     try {
                         if (app.thread != null) {
-                            if (DEBUG_CONFIGURATION) Log.v(TAG, "Sending to proc "
+                            if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending to proc "
                                     + app.processName + " new config " + mConfiguration);
                             app.thread.scheduleConfigurationChanged(mConfiguration);
                         }
@@ -13150,7 +13263,7 @@
                 // If this didn't result in the starting activity being
                 // destroyed, then we need to make sure at this point that all
                 // other activities are made visible.
-                if (DEBUG_SWITCH) Log.i(TAG, "Config didn't destroy " + starting
+                if (DEBUG_SWITCH) Slog.i(TAG, "Config didn't destroy " + starting
                         + ", ensuring others are correct.");
                 ensureActivitiesVisibleLocked(starting, changes);
             }
@@ -13171,7 +13284,7 @@
             results = r.results;
             newIntents = r.newIntents;
         }
-        if (DEBUG_SWITCH) Log.v(TAG, "Relaunching: " + r
+        if (DEBUG_SWITCH) Slog.v(TAG, "Relaunching: " + r
                 + " with results=" + results + " newIntents=" + newIntents
                 + " andResume=" + andResume);
         EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
@@ -13181,7 +13294,7 @@
         r.startFreezingScreenLocked(r.app, 0);
         
         try {
-            if (DEBUG_SWITCH) Log.i(TAG, "Switch is restarting resumed " + r);
+            if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r);
             r.app.thread.scheduleRelaunchActivity(r, results, newIntents,
                     changes, !andResume, mConfiguration);
             // Note: don't need to call pauseIfSleepingLocked() here, because
@@ -13209,21 +13322,21 @@
      */
     private final boolean ensureActivityConfigurationLocked(HistoryRecord r,
             int globalChanges) {
-        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+        if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                 "Ensuring correct configuration: " + r);
         
         // Short circuit: if the two configurations are the exact same
         // object (the common case), then there is nothing to do.
         Configuration newConfig = mConfiguration;
         if (r.configuration == newConfig) {
-            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                     "Configuration unchanged in " + r);
             return true;
         }
         
         // We don't worry about activities that are finishing.
         if (r.finishing) {
-            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                     "Configuration doesn't matter in finishing " + r);
             r.stopFreezingScreenLocked(false);
             return true;
@@ -13237,7 +13350,7 @@
         // If the activity isn't currently running, just leave the new
         // configuration and it will pick that up next time it starts.
         if (r.app == null || r.app.thread == null) {
-            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+            if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                     "Configuration doesn't matter not running " + r);
             r.stopFreezingScreenLocked(false);
             return true;
@@ -13250,7 +13363,7 @@
             // Figure out what has changed between the two configurations.
             int changes = oldConfig.diff(newConfig);
             if (DEBUG_SWITCH || DEBUG_CONFIGURATION) {
-                Log.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
+                Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x"
                         + Integer.toHexString(changes) + ", handles=0x"
                         + Integer.toHexString(r.info.configChanges)
                         + ", newConfig=" + newConfig);
@@ -13260,14 +13373,14 @@
                 r.configChangeFlags |= changes;
                 r.startFreezingScreenLocked(r.app, globalChanges);
                 if (r.app == null || r.app.thread == null) {
-                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                             "Switch is destroying non-running " + r);
                     destroyActivityLocked(r, true);
                 } else if (r.state == ActivityState.PAUSING) {
                     // A little annoying: we are waiting for this activity to
                     // finish pausing.  Let's not do anything now, but just
                     // flag that it needs to be restarted when done pausing.
-                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                             "Switch is skipping already pausing " + r);
                     r.configDestroy = true;
                     return true;
@@ -13276,12 +13389,12 @@
                     // and we need to restart the top, resumed activity.
                     // Instead of doing the normal handshaking, just say
                     // "restart!".
-                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                             "Switch is restarting resumed " + r);
                     relaunchActivityLocked(r, r.configChangeFlags, true);
                     r.configChangeFlags = 0;
                 } else {
-                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Log.v(TAG,
+                    if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG,
                             "Switch is restarting non-resumed " + r);
                     relaunchActivityLocked(r, r.configChangeFlags, false);
                     r.configChangeFlags = 0;
@@ -13300,7 +13413,7 @@
         // it last got.
         if (r.app != null && r.app.thread != null) {
             try {
-                if (DEBUG_CONFIGURATION) Log.v(TAG, "Sending new config to " + r);
+                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending new config to " + r);
                 r.app.thread.scheduleActivityConfigurationChanged(r);
             } catch (RemoteException e) {
                 // If process died, whatever.
@@ -13443,7 +13556,7 @@
             app.adjType = "bg-empty";
         }
 
-        //Log.i(TAG, "OOM " + app + ": initial adj=" + adj);
+        //Slog.i(TAG, "OOM " + app + ": initial adj=" + adj);
         
         // By default, we use the computed adjustment.  It may be changed if
         // there are applications dependent on our services or providers, but
@@ -13455,7 +13568,7 @@
         if (mBackupTarget != null && app == mBackupTarget.app) {
             // If possible we want to avoid killing apps while they're being backed up
             if (adj > BACKUP_APP_ADJ) {
-                if (DEBUG_BACKUP) Log.v(TAG, "oom BACKUP_APP_ADJ for " + app);
+                if (DEBUG_BACKUP) Slog.v(TAG, "oom BACKUP_APP_ADJ for " + app);
                 adj = BACKUP_APP_ADJ;
                 app.adjType = "backup";
                 app.hidden = false;
@@ -13532,7 +13645,7 @@
                         }
                         HistoryRecord a = cr.activity;
                         //if (a != null) {
-                        //    Log.i(TAG, "Connection to " + a ": state=" + a.state);
+                        //    Slog.i(TAG, "Connection to " + a ": state=" + a.state);
                         //}
                         if (a != null && adj > FOREGROUND_APP_ADJ &&
                                 (a.state == ActivityState.RESUMED
@@ -13620,7 +13733,7 @@
 
         app.curRawAdj = adj;
         
-        //Log.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
+        //Slog.i(TAG, "OOM ADJ " + app + ": pid=" + app.pid +
         //      " adj=" + adj + " curAdj=" + app.curAdj + " maxAdj=" + app.maxAdj);
         if (adj > app.maxAdj) {
             adj = app.maxAdj;
@@ -13792,7 +13905,7 @@
             }
             if (adj != app.setAdj) {
                 if (Process.setOomAdj(app.pid, adj)) {
-                    if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Log.v(
+                    if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(
                         TAG, "Set app " + app.processName +
                         " oom adj to " + adj);
                     app.setAdj = adj;
@@ -13802,7 +13915,7 @@
             }
             if (app.setSchedGroup != app.curSchedGroup) {
                 app.setSchedGroup = app.curSchedGroup;
-                if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Log.v(TAG,
+                if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG,
                         "Setting process group of " + app.processName
                         + " to " + app.curSchedGroup);
                 if (true) {
@@ -13810,7 +13923,7 @@
                     try {
                         Process.setProcessGroup(app.pid, app.curSchedGroup);
                     } catch (Exception e) {
-                        Log.w(TAG, "Failed setting process group of " + app.pid
+                        Slog.w(TAG, "Failed setting process group of " + app.pid
                                 + " to " + app.curSchedGroup);
                         e.printStackTrace();
                     } finally {
@@ -13872,7 +13985,7 @@
         if (false) {
             RuntimeException e = new RuntimeException();
             e.fillInStackTrace();
-            Log.i(TAG, "updateOomAdj: top=" + TOP_ACT, e);
+            Slog.i(TAG, "updateOomAdj: top=" + TOP_ACT, e);
         }
 
         mAdjSeq++;
@@ -13893,7 +14006,7 @@
         while (i > 0) {
             i--;
             ProcessRecord app = mLruProcesses.get(i);
-            //Log.i(TAG, "OOM " + app + ": cur hidden=" + curHiddenAdj);
+            //Slog.i(TAG, "OOM " + app + ": cur hidden=" + curHiddenAdj);
             if (updateOomAdjLocked(app, curHiddenAdj, TOP_APP)) {
                 if (curHiddenAdj < EMPTY_APP_ADJ
                     && app.curAdj == curHiddenAdj) {
@@ -13924,7 +14037,7 @@
                 final ProcessRecord app = mRemovedProcesses.get(i);
                 if (app.activities.size() == 0
                         && app.curReceiver == null && app.services.size() == 0) {
-                    Log.i(
+                    Slog.i(
                         TAG, "Exiting empty application process "
                         + app.processName + " ("
                         + (app.thread != null ? app.thread.asBinder() : null)
@@ -13965,7 +14078,7 @@
                             || app.persistentActivities > 0) {
                         // Don't count processes holding services against our
                         // maximum process count.
-                        if (localLOGV) Log.v(
+                        if (localLOGV) Slog.v(
                             TAG, "Not trimming app " + app + " with services: "
                             + app.services);
                         numServiceProcs++;
@@ -13991,7 +14104,7 @@
                     // running any activities.
                     if (!app.persistent && app.activities.size() == 0
                             && app.curReceiver == null && app.services.size() == 0) {
-                        Log.i(
+                        Slog.i(
                             TAG, "Exiting empty application process "
                             + app.processName + " ("
                             + (app.thread != null ? app.thread.asBinder() : null)
@@ -14016,7 +14129,7 @@
 
                 // If we still have too many processes, now from the least
                 // recently used process we start finishing activities.
-                if (Config.LOGV) Log.v(
+                if (Config.LOGV) Slog.v(
                     TAG, "*** NOW HAVE " + mLruProcesses.size() +
                     " of " + curMaxProcs + " processes");
                 for (   i=0;
@@ -14031,11 +14144,11 @@
                         && app.persistentActivities == 0;
                     int NUMA = app.activities.size();
                     int j;
-                    if (Config.LOGV) Log.v(
+                    if (Config.LOGV) Slog.v(
                         TAG, "Looking to quit " + app.processName);
                     for (j=0; j<NUMA && canQuit; j++) {
                         HistoryRecord r = (HistoryRecord)app.activities.get(j);
-                        if (Config.LOGV) Log.v(
+                        if (Config.LOGV) Slog.v(
                             TAG, "  " + r.intent.getComponent().flattenToShortString()
                             + ": frozen=" + r.haveState + ", visible=" + r.visible);
                         canQuit = (r.haveState || !r.stateNotNeeded)
@@ -14050,7 +14163,7 @@
                             }
                             r.resultTo = null;
                         }
-                        Log.i(TAG, "Exiting application process "
+                        Slog.i(TAG, "Exiting application process "
                               + app.processName + " ("
                               + (app.thread != null ? app.thread.asBinder() : null)
                               + ")\n");
diff --git a/services/java/com/android/server/am/AppErrorDialog.java b/services/java/com/android/server/am/AppErrorDialog.java
index 328f5e7..3a1aad6 100644
--- a/services/java/com/android/server/am/AppErrorDialog.java
+++ b/services/java/com/android/server/am/AppErrorDialog.java
@@ -23,7 +23,7 @@
 import android.content.res.Resources;
 import android.os.Handler;
 import android.os.Message;
-import android.util.Log;
+import android.util.Slog;
 
 class AppErrorDialog extends BaseErrorDialog {
     private final static String TAG = "AppErrorDialog";
diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java
index 57c75e0..9702f91 100644
--- a/services/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/java/com/android/server/am/AppNotRespondingDialog.java
@@ -26,7 +26,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.Process;
-import android.util.Log;
+import android.util.Slog;
 
 class AppNotRespondingDialog extends BaseErrorDialog {
     private static final String TAG = "AppNotRespondingDialog";
@@ -130,7 +130,7 @@
                 try {
                     getContext().startActivity(appErrorIntent);
                 } catch (ActivityNotFoundException e) {
-                    Log.w(TAG, "bug report receiver dissappeared", e);
+                    Slog.w(TAG, "bug report receiver dissappeared", e);
                 }
             }
         }
diff --git a/services/java/com/android/server/am/BackupRecord.java b/services/java/com/android/server/am/BackupRecord.java
index 5ac8e0d..6590b91 100644
--- a/services/java/com/android/server/am/BackupRecord.java
+++ b/services/java/com/android/server/am/BackupRecord.java
@@ -54,4 +54,4 @@
             .append(' ').append(appInfo.backupAgentName).append('}');
         return stringName = sb.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/services/java/com/android/server/am/BaseErrorDialog.java b/services/java/com/android/server/am/BaseErrorDialog.java
index aa80ae6..03e3272 100644
--- a/services/java/com/android/server/am/BaseErrorDialog.java
+++ b/services/java/com/android/server/am/BaseErrorDialog.java
@@ -45,10 +45,10 @@
 
     public boolean dispatchKeyEvent(KeyEvent event) {
         if (mConsuming) {
-            //Log.i(TAG, "Consuming: " + event);
+            //Slog.i(TAG, "Consuming: " + event);
             return true;
         }
-        //Log.i(TAG, "Dispatching: " + event);
+        //Slog.i(TAG, "Dispatching: " + event);
         return super.dispatchKeyEvent(event);
     }
 
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index d59aead..cdf4e95 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -24,7 +24,7 @@
 import android.os.Process;
 import android.os.ServiceManager;
 import android.telephony.SignalStrength;
-import android.util.Log;
+import android.util.Slog;
 
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.os.BatteryStatsImpl;
@@ -57,7 +57,7 @@
     }
     
     public void shutdown() {
-        Log.w("BatteryStats", "Writing battery stats before shutdown...");
+        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
         synchronized (mStats) {
             mStats.writeLocked();
         }
@@ -84,8 +84,8 @@
     public byte[] getStatistics() {
         mContext.enforceCallingPermission(
                 android.Manifest.permission.BATTERY_STATS, null);
-        //Log.i("foo", "SENDING BATTERY INFO:");
-        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo"));
+        //Slog.i("foo", "SENDING BATTERY INFO:");
+        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
         Parcel out = Parcel.obtain();
         mStats.writeToParcel(out, 0);
         byte[] data = out.marshall();
diff --git a/services/java/com/android/server/am/DeviceMonitor.java b/services/java/com/android/server/am/DeviceMonitor.java
index ce07430..5f3b0ce 100644
--- a/services/java/com/android/server/am/DeviceMonitor.java
+++ b/services/java/com/android/server/am/DeviceMonitor.java
@@ -16,7 +16,7 @@
 
 package com.android.server.am;
 
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.*;
 import java.util.Arrays;
@@ -65,7 +65,7 @@
                 try {
                     dump();
                 } catch (IOException e) {
-                    Log.w(LOG_TAG, "Dump failed.", e);
+                    Slog.w(LOG_TAG, "Dump failed.", e);
                 }
                 pause();
             }
@@ -100,7 +100,7 @@
             Arrays.sort(files);
             for (int i = 0; i < count; i++) {
                 if (!files[i].delete()) {
-                    Log.w(LOG_TAG, "Couldn't delete " + files[i] + ".");
+                    Slog.w(LOG_TAG, "Couldn't delete " + files[i] + ".");
                 }
             }
         }
@@ -178,7 +178,7 @@
                 closeable.close();
             }
         } catch (IOException e) {
-            Log.w(LOG_TAG, e);
+            Slog.w(LOG_TAG, e);
         }
     }
 
diff --git a/services/java/com/android/server/am/HistoryRecord.java b/services/java/com/android/server/am/HistoryRecord.java
index 0b34f7c..7d7247c 100644
--- a/services/java/com/android/server/am/HistoryRecord.java
+++ b/services/java/com/android/server/am/HistoryRecord.java
@@ -387,12 +387,14 @@
                     sb.append(" ms)");
                     Log.i(ActivityManagerService.TAG, sb.toString());
                 }
+                service.reportActivityLaunchedLocked(false, this, thisTime, totalTime);
                 if (totalTime > 0) {
                     service.mUsageStatsService.noteLaunchTime(realActivity, (int)totalTime);
                 }
                 startTime = 0;
                 service.mInitialStartTime = 0;
             }
+            service.reportActivityVisibleLocked(this);
             if (ActivityManagerService.DEBUG_SWITCH) Log.v(
                     ActivityManagerService.TAG, "windowsVisible(): " + this);
             if (!nowVisible) {
diff --git a/services/java/com/android/server/am/PendingIntentRecord.java b/services/java/com/android/server/am/PendingIntentRecord.java
index fac47d7..847e91b 100644
--- a/services/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/java/com/android/server/am/PendingIntentRecord.java
@@ -24,7 +24,7 @@
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.PrintWriter;
 import java.lang.ref.WeakReference;
@@ -81,7 +81,7 @@
             hash = (ODD_PRIME_NUMBER*hash) + _p.hashCode();
             hash = (ODD_PRIME_NUMBER*hash) + _t;
             hashCode = hash;
-            //Log.i(ActivityManagerService.TAG, this + " hashCode=0x"
+            //Slog.i(ActivityManagerService.TAG, this + " hashCode=0x"
             //        + Integer.toHexString(hashCode));
         }
         
@@ -213,7 +213,7 @@
                                     finalIntent, resolvedType,
                                     resultTo, resultWho, requestCode, false);
                         } catch (RuntimeException e) {
-                            Log.w(ActivityManagerService.TAG,
+                            Slog.w(ActivityManagerService.TAG,
                                     "Unable to send startActivity intent", e);
                         }
                         break;
@@ -231,7 +231,7 @@
                                     (finishedReceiver != null), false);
                             sendFinish = false;
                         } catch (RuntimeException e) {
-                            Log.w(ActivityManagerService.TAG,
+                            Slog.w(ActivityManagerService.TAG,
                                     "Unable to send startActivity intent", e);
                         }
                         break;
@@ -240,7 +240,7 @@
                             owner.startServiceInPackage(uid,
                                     finalIntent, resolvedType);
                         } catch (RuntimeException e) {
-                            Log.w(ActivityManagerService.TAG,
+                            Slog.w(ActivityManagerService.TAG,
                                     "Unable to send startService intent", e);
                         }
                         break;
diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java
index 5a02c40..0542497 100644
--- a/services/java/com/android/server/am/ServiceRecord.java
+++ b/services/java/com/android/server/am/ServiceRecord.java
@@ -29,7 +29,7 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.SystemClock;
-import android.util.Log;
+import android.util.Slog;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -269,7 +269,7 @@
                         inm.enqueueNotification(localPackageName, localForegroundId,
                                 localForegroundNoti, outId);
                     } catch (RuntimeException e) {
-                        Log.w(ActivityManagerService.TAG,
+                        Slog.w(ActivityManagerService.TAG,
                                 "Error showing notification for service", e);
                         // If it gave us a garbage notification, it doesn't
                         // get to be foreground.
@@ -297,7 +297,7 @@
                     try {
                         inm.cancelNotification(localPackageName, localForegroundId);
                     } catch (RuntimeException e) {
-                        Log.w(ActivityManagerService.TAG,
+                        Slog.w(ActivityManagerService.TAG,
                                 "Error canceling notification for service", e);
                     } catch (RemoteException e) {
                     }
diff --git a/services/java/com/android/server/am/UsageStatsService.java b/services/java/com/android/server/am/UsageStatsService.java
index f99ca96..d170b02 100644
--- a/services/java/com/android/server/am/UsageStatsService.java
+++ b/services/java/com/android/server/am/UsageStatsService.java
@@ -27,7 +27,7 @@
 import android.os.Process;
 import android.os.ServiceManager;
 import android.os.SystemClock;
-import android.util.Log;
+import android.util.Slog;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
@@ -149,14 +149,14 @@
         PkgUsageStatsExtended(Parcel in) {
             mLaunchCount = in.readInt();
             mUsageTime = in.readLong();
-            if (localLOGV) Log.v(TAG, "Launch count: " + mLaunchCount
+            if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount
                     + ", Usage time:" + mUsageTime);
             
             final int N = in.readInt();
-            if (localLOGV) Log.v(TAG, "Reading comps: " + N);
+            if (localLOGV) Slog.v(TAG, "Reading comps: " + N);
             for (int i=0; i<N; i++) {
                 String comp = in.readString();
-                if (localLOGV) Log.v(TAG, "Component: " + comp);
+                if (localLOGV) Slog.v(TAG, "Component: " + comp);
                 TimeStats times = new TimeStats(in);
                 mLaunchTimes.put(comp, times);
             }
@@ -231,7 +231,7 @@
             while (i > 0) {
                 i--;
                 if (fList[i].startsWith(prefix)) {
-                    Log.i(TAG, "Deleting old usage file: " + fList[i]);
+                    Slog.i(TAG, "Deleting old usage file: " + fList[i]);
                     (new File(parentDir, fList[i])).delete();
                 }
             }
@@ -291,7 +291,7 @@
                     newFile.createNewFile();
                 }
             } catch (IOException e) {
-                Log.w(TAG,"Error : " + e + " reading data from file:" + newFile);
+                Slog.w(TAG,"Error : " + e + " reading data from file:" + newFile);
             }
         }
     }
@@ -300,7 +300,7 @@
         Parcel in = getParcelForFile(file);
         int vers = in.readInt();
         if (vers != VERSION) {
-            Log.w(TAG, "Usage stats version changed; dropping");
+            Slog.w(TAG, "Usage stats version changed; dropping");
             return;
         }
         int N = in.readInt();
@@ -310,7 +310,7 @@
             if (pkgName == null) {
                 break;
             }
-            if (localLOGV) Log.v(TAG, "Reading package #" + N + ": " + pkgName);
+            if (localLOGV) Slog.v(TAG, "Reading package #" + N + ": " + pkgName);
             PkgUsageStatsExtended pus = new PkgUsageStatsExtended(in);
             synchronized (mStatsLock) {
                 mStats.put(pkgName, pus);
@@ -356,7 +356,7 @@
         for (int i = 0; i < count; i++) {
             String fileName = fileList.get(i);
             File file = new File(mDir, fileName);
-            Log.i(TAG, "Deleting usage file : " + fileName);
+            Slog.i(TAG, "Deleting usage file : " + fileName);
             file.delete();
         }
     }
@@ -384,7 +384,7 @@
             if (mFile != null && mFile.exists()) {
                 backupFile = new File(mFile.getPath() + ".bak");
                 if (!mFile.renameTo(backupFile)) {
-                    Log.w(TAG, "Failed to persist new stats");
+                    Slog.w(TAG, "Failed to persist new stats");
                     return;
                 }
             }
@@ -407,7 +407,7 @@
                     backupFile.delete();
                 }
             } catch (IOException e) {
-                Log.w(TAG, "Failed writing stats to file:" + mFile);
+                Slog.w(TAG, "Failed writing stats to file:" + mFile);
                 if (backupFile != null) {
                     mFile.delete();
                     backupFile.renameTo(mFile);
@@ -448,7 +448,7 @@
     }
     
     public void shutdown() {
-        Log.w(TAG, "Writing usage stats before shutdown...");
+        Slog.w(TAG, "Writing usage stats before shutdown...");
         writeStatsToFile(true);
     }
     
@@ -475,7 +475,7 @@
                 if (mLastResumedPkg != null) {
                     // We last resumed some other package...  just pause it now
                     // to recover.
-                    Log.i(TAG, "Unexpected resume of " + pkgName
+                    Slog.i(TAG, "Unexpected resume of " + pkgName
                             + " while already resumed in " + mLastResumedPkg);
                     PkgUsageStatsExtended pus = mStats.get(mLastResumedPkg);
                     if (pus != null) {
@@ -491,7 +491,7 @@
             mLastResumedPkg = pkgName;
             mLastResumedComp = componentName.getClassName();
             
-            if (localLOGV) Log.i(TAG, "started component:" + pkgName);
+            if (localLOGV) Slog.i(TAG, "started component:" + pkgName);
             PkgUsageStatsExtended pus = mStats.get(pkgName);
             if (pus == null) {
                 pus = new PkgUsageStatsExtended();
@@ -514,18 +514,18 @@
                 return;
             }
             if (!mIsResumed) {
-                Log.i(TAG, "Something wrong here, didn't expect "
+                Slog.i(TAG, "Something wrong here, didn't expect "
                         + pkgName + " to be paused");
                 return;
             }
             mIsResumed = false;
             
-            if (localLOGV) Log.i(TAG, "paused component:"+pkgName);
+            if (localLOGV) Slog.i(TAG, "paused component:"+pkgName);
         
             PkgUsageStatsExtended pus = mStats.get(pkgName);
             if (pus == null) {
                 // Weird some error here
-                Log.i(TAG, "No package stats for pkg:"+pkgName);
+                Slog.i(TAG, "No package stats for pkg:"+pkgName);
                 return;
             }
             pus.updatePause();
@@ -642,10 +642,10 @@
                     dFile.delete();
                 }
             } catch (FileNotFoundException e) {
-                Log.w(TAG, "Failed with "+e+" when collecting dump info from file : " + file);
+                Slog.w(TAG, "Failed with "+e+" when collecting dump info from file : " + file);
                 return;
             } catch (IOException e) {
-                Log.w(TAG, "Failed with "+e+" when collecting dump info from file : "+file);
+                Slog.w(TAG, "Failed with "+e+" when collecting dump info from file : "+file);
             }      
         }
     }
@@ -829,7 +829,7 @@
         } else if (isCheckinRequest) {
             // If checkin doesn't specify any packages, then we simply won't
             // show anything.
-            Log.w(TAG, "Checkin without packages");
+            Slog.w(TAG, "Checkin without packages");
             return;
         }
         
diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java
index 16638bc..5f37a42 100644
--- a/services/java/com/android/server/connectivity/Tethering.java
+++ b/services/java/com/android/server/connectivity/Tethering.java
@@ -31,6 +31,7 @@
 import android.net.IConnectivityManager;
 import android.net.INetworkManagementEventObserver;
 import android.net.NetworkInfo;
+import android.os.BatteryManager;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.INetworkManagementService;
@@ -65,10 +66,14 @@
     private final String TAG = "Tethering";
 
     private boolean mPlaySounds = false;
+    private boolean mBooted = false;
+    //used to remember if we got connected before boot finished
+    private boolean mDeferedUsbConnection = false;
 
     // TODO - remove both of these - should be part of interface inspection/selection stuff
     private String[] mTetherableUsbRegexs;
     private String[] mTetherableWifiRegexs;
+    private String[] mUpstreamIfaceRegexs;
 
     private HashMap<String, TetherInterfaceSM> mIfaces;
 
@@ -86,13 +91,10 @@
     private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8";
     private static final String DNS_DEFAULT_SERVER2 = "4.2.2.2";
 
+    private boolean mDunRequired;
+    private boolean mUseHiPri;
     private String mUpstreamIfaceName;
 
-    // turning on/off RNDIS resets the interface generating and extra discon/conn cycle
-    // count how many to ignore..  Self correcting if you plug/unplug a bunch of times.
-    // TODO - brittle - maybe don't need?
-    private int mUsbResetExpected = 0;
-
     HierarchicalStateMachine mTetherMasterSM;
 
     public Tethering(Context context) {
@@ -116,9 +118,9 @@
 
         // TODO - remove this hack after real USB connections are detected.
         IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_UMS_DISCONNECTED);
-        filter.addAction(Intent.ACTION_UMS_CONNECTED);
+        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
         filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
         mStateReceiver = new StateReceiver();
         mContext.registerReceiver(mStateReceiver, filter);
 
@@ -134,17 +136,20 @@
             tmp[1] = new String("");
             mDhcpRange = tmp;
         }
+        mDunRequired = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_tether_dun_required);
 
         mTetherableUsbRegexs = context.getResources().getStringArray(
                 com.android.internal.R.array.config_tether_usb_regexs);
         mTetherableWifiRegexs = context.getResources().getStringArray(
                 com.android.internal.R.array.config_tether_wifi_regexs);
+        mUpstreamIfaceRegexs = context.getResources().getStringArray(
+                com.android.internal.R.array.config_tether_upstream_regexs);
 
         // TODO - remove and rely on real notifications of the current iface
         mDnsServers = new String[2];
         mDnsServers[0] = DNS_DEFAULT_SERVER1;
         mDnsServers[1] = DNS_DEFAULT_SERVER2;
-        mUpstreamIfaceName = "rmnet0";
     }
 
     public void interfaceLinkStatusChanged(String iface, boolean link) {
@@ -428,31 +433,21 @@
     private class StateReceiver extends BroadcastReceiver {
         public void onReceive(Context content, Intent intent) {
             String action = intent.getAction();
-            if (action.equals(Intent.ACTION_UMS_CONNECTED)) {
-                Log.w(TAG, "got UMS connected");
-                synchronized (Tethering.this) {
-                    if(mUsbResetExpected != 0) {
-                        Log.w(TAG, "mUsbResetExpected == " + mUsbResetExpected + ", ignored");
-                        mUsbResetExpected--;
-                        return;
-                    }
+            if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+                boolean usbConnected = (intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1)
+                        == BatteryManager.BATTERY_PLUGGED_USB);
+                if (mBooted) {
+                    Tethering.this.enableUsbIfaces(usbConnected); // add or remove them
+                } else {
+                    mDeferedUsbConnection = usbConnected;
                 }
-                Tethering.this.enableUsbIfaces(true); // add them
-            } else if (action.equals(Intent.ACTION_UMS_DISCONNECTED)) {
-                Log.w(TAG, "got UMS disconneded broadcast");
-                synchronized (Tethering.this) {
-                    if(mUsbResetExpected != 0) {
-                        Log.w(TAG, "mUsbResetExpected == " + mUsbResetExpected + ", ignored");
-                        mUsbResetExpected--;
-                        return;
-                    }
-                }
-                Tethering.this.enableUsbIfaces(false); // remove them
             } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                 IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
                 IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
                 try {
-                    NetworkInfo info = service.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_DUN);
+                    int netType = (mUseHiPri ? ConnectivityManager.TYPE_MOBILE_HIPRI:
+                                               ConnectivityManager.TYPE_MOBILE_DUN);
+                    NetworkInfo info = service.getNetworkInfo(netType);
                     int msg;
                     if (info != null && info.isConnected() == true) {
                         msg = TetherMasterSM.CMD_CELL_DUN_ENABLED;
@@ -461,6 +456,11 @@
                     }
                     mTetherMasterSM.sendMessage(mTetherMasterSM.obtainMessage(msg));
                 } catch (RemoteException e) {}
+            } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
+                mBooted = true;
+                if (mDeferedUsbConnection) {
+                    Tethering.this.enableUsbIfaces(true);
+                }
             }
         }
     }
@@ -497,10 +497,8 @@
 
         try {
             if (enabled) {
-                // turning this on will reset USB and generate two bogus events - ignore them
                 synchronized (this) {
                     if (!service.isUsbRNDISStarted()) {
-                        mUsbResetExpected += 2;
                         service.startUsbRNDIS();
                     }
                 }
@@ -545,9 +543,8 @@
                             } else {
                                 ifcg.interfaceFlags = ifcg.interfaceFlags.replace("up", "down");
                                 // TODO - clean this up - maybe a better regex?
-                                ifcg.interfaceFlags = ifcg.interfaceFlags.replace(" running", "");
-                                ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running ","");
-                                ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running","");
+                                ifcg.interfaceFlags = ifcg.interfaceFlags.replace("running", "");
+                                ifcg.interfaceFlags = ifcg.interfaceFlags.replace("  "," ");
                             }
                             service.setInterfaceConfig(iface, ifcg);
                         }
@@ -562,89 +559,6 @@
         return true;
     }
 
-    private void handleTtyConnect() {
-        Log.d(TAG, "handleTtyConnect");
-        // for each of the available Tty not already supported by a ppp session,
-        // create a ppp session
-        // TODO - this should be data-driven rather than hard coded.
-        String[] allowedTtys = new String[1];
-        allowedTtys[0] = new String("ttyGS0");
-
-        IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
-        INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
-
-        String[] availableTtys;
-        try {
-            availableTtys = service.listTtys();
-        } catch (RemoteException e) {
-            Log.e(TAG, "error listing Ttys :" + e);
-            return;
-        }
-
-        for (String tty : availableTtys) {
-            for (String pattern : allowedTtys) {
-                if (tty.matches(pattern)) {
-                    synchronized (this) {
-                        if (!mActiveTtys.contains(tty)) {
-                            // TODO - don't hardcode this
-                            try {
-                                // local, remote, dns
-                                service.attachPppd(tty, "169.254.1.128", "169.254.1.1",
-                                        "169.254.1.128", "0.0.0.0");
-                            } catch (Exception e) {
-                                Log.e(TAG, "error calling attachPppd: " + e);
-                                return;
-                            }
-                            Log.d(TAG, "started Pppd on tty " + tty);
-                            mActiveTtys.add(tty);
-                            // TODO - remove this after we detect the new iface
-                            interfaceAdded("ppp0");
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private synchronized void handleTtyDisconnect() {
-        Log.d(TAG, "handleTtyDisconnect");
-
-        // TODO - this should be data-driven rather than hard coded.
-        String[] allowedTtys = new String[1];
-        allowedTtys[0] = new String("ttyGS0");
-
-        IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
-        INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
-
-        String[] availableTtys;
-        try {
-            availableTtys = service.listTtys();
-        } catch (RemoteException e) {
-            Log.e(TAG, "error listing Ttys :" + e);
-            return;
-        }
-
-        for (String tty : availableTtys) {
-            for (String pattern : allowedTtys) {
-                if (tty.matches(pattern)) {
-                    synchronized (this) {
-                        if (mActiveTtys.contains(tty)) {
-                            try {
-                                service.detachPppd(tty);
-                            } catch (Exception e) {
-                                Log.e(TAG, "error calling detachPppd on " + tty + " :" + e);
-                            }
-                            mActiveTtys.remove(tty);
-                            // TODO - remove this after we detect the new iface
-                            interfaceRemoved("ppp0");
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
     public String[] getTetherableUsbRegexs() {
         return mTetherableUsbRegexs;
     }
@@ -653,6 +567,14 @@
         return mTetherableWifiRegexs;
     }
 
+    public String[] getUpstreamIfaceRegexs() {
+        return mUpstreamIfaceRegexs;
+    }
+
+    public boolean isDunRequired() {
+        return mDunRequired;
+    }
+
     public String[] getTetheredIfaces() {
         ArrayList<String> list = new ArrayList<String>();
         synchronized (mIfaces) {
@@ -1240,7 +1162,8 @@
                 int retValue = Phone.APN_REQUEST_FAILED;
                 try {
                     retValue = service.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
-                            Phone.FEATURE_ENABLE_DUN, new Binder());
+                            (mUseHiPri ? Phone.FEATURE_ENABLE_HIPRI : Phone.FEATURE_ENABLE_DUN),
+                            new Binder());
                 } catch (Exception e) {
                 }
                 return retValue;
@@ -1251,7 +1174,7 @@
                         IConnectivityManager.Stub.asInterface(b);
                 try {
                     service.stopUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE,
-                            Phone.FEATURE_ENABLE_DUN);
+                            (mUseHiPri ? Phone.FEATURE_ENABLE_HIPRI : Phone.FEATURE_ENABLE_DUN));
                 } catch (Exception e) {
                     return false;
                 }
@@ -1301,10 +1224,46 @@
                 transitionTo(mInitialState);
                 return true;
             }
+            public String findActiveUpstreamIface() {
+                // check for what iface we can use - if none found switch to error.
+                IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
+                INetworkManagementService service = INetworkManagementService.Stub.asInterface(b);
+
+                String[] ifaces = new String[0];
+                try {
+                    ifaces = service.listInterfaces();
+                } catch (Exception e) {
+                    Log.e(TAG, "Error listing Interfaces :" + e);
+                    return null;
+                }
+                for (String iface : ifaces) {
+                    for (String regex : mUpstreamIfaceRegexs) {
+                        if (iface.matches(regex)) {
+                            // verify it is up!
+                            InterfaceConfiguration ifcg = null;
+                            try {
+                                ifcg = service.getInterfaceConfig(iface);
+                            } catch (Exception e) {
+                                Log.e(TAG, "Error getting iface config :" + e);
+                                // ignore - try next
+                                continue;
+                            }
+                            if (ifcg.interfaceFlags.contains("up")) {
+                                return iface;
+                            }
+                        }
+                    }
+                }
+                return null;
+            }
         }
 
         class InitialState extends TetherMasterUtilState {
             @Override
+            public void enter() {
+                mUseHiPri = false;
+            }
+            @Override
             public boolean processMessage(Message message) {
                 Log.d(TAG, "MasterInitialState.processMessage what=" + message.what);
                 boolean retValue = true;
@@ -1336,28 +1295,35 @@
         class CellDunRequestedState extends TetherMasterUtilState {
             @Override
             public void enter() {
-                ++mSequenceNumber;
-                int result = turnOnMobileDun();
-                switch (result) {
-                    case Phone.APN_ALREADY_ACTIVE:
-                        Log.d(TAG, "Dun already active");
-                        sendMessage(obtainMessage(CMD_CELL_DUN_ENABLED));
-                        break;
-                    case Phone.APN_REQUEST_FAILED:
-                    case Phone.APN_TYPE_NOT_AVAILABLE:
-                        Log.d(TAG, "Error bringing up Dun connection");
-                        Message m = obtainMessage(CMD_CELL_DUN_TIMEOUT);
-                        m.arg1 = mSequenceNumber;
-                        sendMessage(m);
-                        break;
-                    case Phone.APN_REQUEST_STARTED:
-                        Log.d(TAG, "Started bringing up Dun connection");
-                        m = obtainMessage(CMD_CELL_DUN_TIMEOUT);
-                        m.arg1 = mSequenceNumber;
-                        sendMessageDelayed(m, CELL_DUN_TIMEOUT_MS);
-                        break;
-                    default:
-                        Log.e(TAG, "Unknown return value from startUsingNetworkFeature " + result);
+                mUseHiPri = (findActiveUpstreamIface() == null && !mDunRequired);
+                if (mDunRequired || mUseHiPri) {
+                    ++mSequenceNumber;
+                    int result = turnOnMobileDun();
+                    switch (result) {
+                        case Phone.APN_ALREADY_ACTIVE:
+                            Log.d(TAG, "Dun already active");
+                            sendMessage(obtainMessage(CMD_CELL_DUN_ENABLED));
+                            break;
+                        case Phone.APN_REQUEST_FAILED:
+                        case Phone.APN_TYPE_NOT_AVAILABLE:
+                            Log.d(TAG, "Error bringing up Dun connection");
+                            Message m = obtainMessage(CMD_CELL_DUN_TIMEOUT);
+                            m.arg1 = mSequenceNumber;
+                            sendMessage(m);
+                            break;
+                        case Phone.APN_REQUEST_STARTED:
+                            Log.d(TAG, "Started bringing up Dun connection");
+                            m = obtainMessage(CMD_CELL_DUN_TIMEOUT);
+                            m.arg1 = mSequenceNumber;
+                            sendMessageDelayed(m, CELL_DUN_TIMEOUT_MS);
+                            break;
+                        default:
+                            Log.e(TAG, "Unknown return value from startUsingNetworkFeature " +
+                                    result);
+                    }
+                } else {
+                    Log.d(TAG, "no Dun Required.  Skipping to Active");
+                    sendMessage(obtainMessage(CMD_CELL_DUN_ENABLED));
                 }
             }
 
@@ -1376,7 +1342,9 @@
                         if (index != -1) {
                             mNotifyList.remove(index);
                             if (mNotifyList.isEmpty()) {
-                                turnOffMobileDun();
+                                if (mDunRequired || mUseHiPri) {
+                                    turnOffMobileDun();
+                                }
                                 transitionTo(mInitialState);
                             }
                         }
@@ -1422,7 +1390,9 @@
                         if (index != -1) {
                             mNotifyList.remove(index);
                             if (mNotifyList.isEmpty()) {
-                                turnOffMobileDun();
+                                if (mDunRequired || mUseHiPri) {
+                                    turnOffMobileDun();
+                                }
                                 transitionTo(mInitialState);
                             }
                         }
@@ -1447,11 +1417,19 @@
         class TetherModeAliveState extends TetherMasterUtilState {
             @Override
             public void enter() {
-                Log.d(TAG, "renewing Dun in " + CELL_DUN_RENEW_MS + "ms");
-                sendMessageDelayed(obtainMessage(CMD_CELL_DUN_RENEW), CELL_DUN_RENEW_MS);
-                for (Object o : mNotifyList) {
-                    TetherInterfaceSM sm = (TetherInterfaceSM)o;
-                    sm.sendMessage(sm.obtainMessage(TetherInterfaceSM.CMD_TETHER_MODE_ALIVE));
+                if (mDunRequired || mUseHiPri) {
+                    Log.d(TAG, "renewing Dun in " + CELL_DUN_RENEW_MS + "ms");
+                    sendMessageDelayed(obtainMessage(CMD_CELL_DUN_RENEW), CELL_DUN_RENEW_MS);
+                }
+                mUpstreamIfaceName = findActiveUpstreamIface();
+                if (mUpstreamIfaceName == null) {
+                    Log.d(TAG, "Erroring our of tether - no upstream ifaces available");
+                    sendMessage(obtainMessage(CMD_CELL_DUN_DISABLED));
+                } else {
+                    for (Object o : mNotifyList) {
+                        TetherInterfaceSM sm = (TetherInterfaceSM)o;
+                        sm.sendMessage(sm.obtainMessage(TetherInterfaceSM.CMD_TETHER_MODE_ALIVE));
+                    }
                 }
             }
             @Override
@@ -1470,8 +1448,11 @@
                         if (index != -1) {
                             mNotifyList.remove(index);
                             if (mNotifyList.isEmpty()) {
-                                turnOffMobileDun();
+                                if (mDunRequired || mUseHiPri) {
+                                    turnOffMobileDun();
+                                }
                                 turnOffMasterTetherSettings(); // transitions appropriately
+                                mUpstreamIfaceName = null;
                             }
                         }
                         break;
@@ -1484,6 +1465,7 @@
                                     TetherInterfaceSM.CMD_TETHER_MODE_DEAD));
                         }
                         turnOffMasterTetherSettings(); // transitions appropriately
+                        mUpstreamIfaceName = null;
                         break;
                     case CMD_CELL_DUN_RENEW:
                         Log.d(TAG, "renewing dun connection - requeuing for another " +
diff --git a/services/java/com/android/server/status/DateView.java b/services/java/com/android/server/status/DateView.java
index 78bfd5e..3e54a6d 100644
--- a/services/java/com/android/server/status/DateView.java
+++ b/services/java/com/android/server/status/DateView.java
@@ -5,7 +5,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.util.AttributeSet;
-import android.util.Log;
+import android.util.Slog;
 import android.widget.TextView;
 import android.view.MotionEvent;
 
diff --git a/services/java/com/android/server/status/ExpandedView.java b/services/java/com/android/server/status/ExpandedView.java
index 33ac8c1..7e66810 100644
--- a/services/java/com/android/server/status/ExpandedView.java
+++ b/services/java/com/android/server/status/ExpandedView.java
@@ -7,7 +7,7 @@
 import android.view.MotionEvent;
 import android.view.WindowManager;
 import android.widget.LinearLayout;
-import android.util.Log;
+import android.util.Slog;
 
 
 public class ExpandedView extends LinearLayout {
@@ -34,7 +34,7 @@
          super.onLayout(changed, left, top, right, bottom);
          int height = bottom - top;
          if (height != mPrevHeight) {
-             //Log.d(StatusBarService.TAG, "height changed old=" + mPrevHeight + " new=" + height);
+             //Slog.d(StatusBarService.TAG, "height changed old=" + mPrevHeight + " new=" + height);
              mPrevHeight = height;
              mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE);
          }
diff --git a/services/java/com/android/server/status/FixedSizeDrawable.java b/services/java/com/android/server/status/FixedSizeDrawable.java
index fe5abca..69a09d7 100644
--- a/services/java/com/android/server/status/FixedSizeDrawable.java
+++ b/services/java/com/android/server/status/FixedSizeDrawable.java
@@ -4,7 +4,7 @@
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
 import android.graphics.Rect;
-import android.util.Log;
+import android.util.Slog;
 
 class FixedSizeDrawable extends Drawable {
     Drawable mDrawable;
diff --git a/services/java/com/android/server/status/IconData.java b/services/java/com/android/server/status/IconData.java
index 8a61eb5..adca375 100644
--- a/services/java/com/android/server/status/IconData.java
+++ b/services/java/com/android/server/status/IconData.java
@@ -1,6 +1,6 @@
 package com.android.server.status;
 
-import android.util.Log;
+import android.util.Slog;
 
 public class IconData {
     /**
diff --git a/services/java/com/android/server/status/LatestItemView.java b/services/java/com/android/server/status/LatestItemView.java
index a47f6ad..6e7a9ce 100644
--- a/services/java/com/android/server/status/LatestItemView.java
+++ b/services/java/com/android/server/status/LatestItemView.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.util.Log;
+import android.util.Slog;
 import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
diff --git a/services/java/com/android/server/status/NotificationViewList.java b/services/java/com/android/server/status/NotificationViewList.java
index 8f1633f..b9865a4 100644
--- a/services/java/com/android/server/status/NotificationViewList.java
+++ b/services/java/com/android/server/status/NotificationViewList.java
@@ -1,7 +1,7 @@
 package com.android.server.status;
 
 import android.os.IBinder;
-import android.util.Log;
+import android.util.Slog;
 import android.view.View;
 import java.util.ArrayList;
 
@@ -119,8 +119,8 @@
                 index++;
             }
         }
-        Log.e(StatusBarService.TAG, "Couldn't find notification in NotificationViewList.");
-        Log.e(StatusBarService.TAG, "notification=" + notification);
+        Slog.e(StatusBarService.TAG, "Couldn't find notification in NotificationViewList.");
+        Slog.e(StatusBarService.TAG, "notification=" + notification);
         dump(notification);
         return 0;
     }
@@ -171,7 +171,7 @@
         list.add(index, notification);
 
         if (StatusBarService.SPEW) {
-            Log.d(StatusBarService.TAG, "NotificationViewList index=" + index);
+            Slog.d(StatusBarService.TAG, "NotificationViewList index=" + index);
             dump(notification);
         }
     }
@@ -190,7 +190,7 @@
                 }
                 s += " ";
             }
-            Log.d(StatusBarService.TAG, "NotificationViewList ongoing: " + s);
+            Slog.d(StatusBarService.TAG, "NotificationViewList ongoing: " + s);
 
             s = "";
             for (int i=0; i<mLatest.size(); i++) {
@@ -204,7 +204,7 @@
                 }
                 s += " ";
             }
-            Log.d(StatusBarService.TAG, "NotificationViewList latest:  " + s);
+            Slog.d(StatusBarService.TAG, "NotificationViewList latest:  " + s);
         }
     }
 
diff --git a/services/java/com/android/server/status/StatusBarIcon.java b/services/java/com/android/server/status/StatusBarIcon.java
index b20d3f6..c9e3b78 100644
--- a/services/java/com/android/server/status/StatusBarIcon.java
+++ b/services/java/com/android/server/status/StatusBarIcon.java
@@ -6,7 +6,7 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Slog;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -140,7 +140,7 @@
             try {
                 r = context.getPackageManager().getResourcesForApplication(data.iconPackage);
             } catch (PackageManager.NameNotFoundException ex) {
-                Log.e(StatusBarService.TAG, "Icon package not found: " + data.iconPackage, ex);
+                Slog.e(StatusBarService.TAG, "Icon package not found: " + data.iconPackage, ex);
                 return null;
             }
         } else {
@@ -148,14 +148,14 @@
         }
 
         if (data.iconId == 0) {
-            Log.w(StatusBarService.TAG, "No icon ID for slot " + data.slot);
+            Slog.w(StatusBarService.TAG, "No icon ID for slot " + data.slot);
             return null;
         }
         
         try {
             return r.getDrawable(data.iconId);
         } catch (RuntimeException e) {
-            Log.w(StatusBarService.TAG, "Icon not found in "
+            Slog.w(StatusBarService.TAG, "Icon not found in "
                   + (data.iconPackage != null ? data.iconId : "<system>")
                   + ": " + Integer.toHexString(data.iconId));
         }
diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java
index f1ccb9b..44e0dad 100644
--- a/services/java/com/android/server/status/StatusBarPolicy.java
+++ b/services/java/com/android/server/status/StatusBarPolicy.java
@@ -51,7 +51,7 @@
 import android.text.style.RelativeSizeSpan;
 import android.text.Spannable;
 import android.text.SpannableStringBuilder;
-import android.util.Log;
+import android.util.Slog;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -650,7 +650,7 @@
         boolean plugged = intent.getIntExtra("plugged", 0) != 0;
         int level = intent.getIntExtra("level", -1);
         if (false) {
-            Log.d(TAG, "updateBattery level=" + level
+            Slog.d(TAG, "updateBattery level=" + level
                     + " plugged=" + plugged
                     + " mBatteryPlugged=" + mBatteryPlugged
                     + " mBatteryLevel=" + mBatteryLevel
@@ -679,14 +679,14 @@
         }
         */
         if (false) {
-            Log.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
+            Slog.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
         }
     }
 
     private void onBatteryLow(Intent intent) {
         if (SHOW_LOW_BATTERY_WARNING) {
             if (false) {
-                Log.d(TAG, "mPhoneState=" + mPhoneState
+                Slog.d(TAG, "mPhoneState=" + mPhoneState
                       + " mLowBatteryDialog=" + mLowBatteryDialog
                       + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
             }
@@ -838,7 +838,7 @@
     private final void updateCallState(int state) {
         mPhoneState = state;
         if (false) {
-            Log.d(TAG, "mPhoneState=" + mPhoneState
+            Slog.d(TAG, "mPhoneState=" + mPhoneState
                     + " mLowBatteryDialog=" + mLowBatteryDialog
                     + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
         }
@@ -973,7 +973,7 @@
         int[] iconList;
 
         if (!hasService()) {
-            //Log.d(TAG, "updateSignalStrength: no service");
+            //Slog.d(TAG, "updateSignalStrength: no service");
             if (Settings.System.getInt(mContext.getContentResolver(),
                     Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
                 mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
@@ -1012,7 +1012,7 @@
             if ((mPhoneState == TelephonyManager.CALL_STATE_IDLE) && isEvdo()){
                 iconLevel = getEvdoLevel();
                 if (false) {
-                    Log.d(TAG, "use Evdo level=" + iconLevel + " to replace Cdma Level=" + getCdmaLevel());
+                    Slog.d(TAG, "use Evdo level=" + iconLevel + " to replace Cdma Level=" + getCdmaLevel());
                 }
             } else {
                 iconLevel = getCdmaLevel();
@@ -1306,16 +1306,16 @@
         final String action = intent.getAction();
         final boolean enabled = intent.getBooleanExtra(TtyIntent.TTY_ENABLED, false);
 
-        if (false) Log.v(TAG, "updateTTY: enabled: " + enabled);
+        if (false) Slog.v(TAG, "updateTTY: enabled: " + enabled);
 
         if (enabled) {
             // TTY is on
-            if (false) Log.v(TAG, "updateTTY: set TTY on");
+            if (false) Slog.v(TAG, "updateTTY: set TTY on");
             mService.updateIcon(mTTYModeIcon, mTTYModeEnableIconData, null);
             mService.setIconVisibility(mTTYModeIcon, true);
         } else {
             // TTY is off
-            if (false) Log.v(TAG, "updateTTY: set TTY off");
+            if (false) Slog.v(TAG, "updateTTY: set TTY off");
             mService.setIconVisibility(mTTYModeIcon, false);
         }
     }
@@ -1336,17 +1336,17 @@
         int iconMode = state.getCdmaEriIconMode();
 
         if (iconIndex == -1) {
-            Log.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
+            Slog.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
             return;
         }
 
         if (iconMode == -1) {
-            Log.e(TAG, "getCdmeEriIconMode returned null, skipping ERI icon update");
+            Slog.e(TAG, "getCdmeEriIconMode returned null, skipping ERI icon update");
             return;
         }
 
         if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) {
-            if (false) Log.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
+            if (false) Slog.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
             mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
             return;
         }
diff --git a/services/java/com/android/server/status/StatusBarService.java b/services/java/com/android/server/status/StatusBarService.java
index 3f77291..d5f2c1d 100644
--- a/services/java/com/android/server/status/StatusBarService.java
+++ b/services/java/com/android/server/status/StatusBarService.java
@@ -41,7 +41,7 @@
 import android.os.Message;
 import android.os.SystemClock;
 import android.provider.Telephony;
-import android.util.Log;
+import android.util.Slog;
 import android.view.Display;
 import android.view.Gravity;
 import android.view.KeyEvent;
@@ -116,7 +116,7 @@
         IBinder token;
 
         public void binderDied() {
-            Log.i(TAG, "binder died for pkg=" + pkg);
+            Slog.i(TAG, "binder died for pkg=" + pkg);
             disable(0, token, pkg);
             token.unlinkToDeath(this, 0);
         }
@@ -482,7 +482,7 @@
     // lock on mDisableRecords
     void manageDisableListLocked(int what, IBinder token, String pkg) {
         if (SPEW) {
-            Log.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what)
+            Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what)
                     + " pkg=" + pkg);
         }
         // update the list
@@ -661,7 +661,7 @@
     /* private */ void performAddUpdateIcon(IBinder key, IconData data, NotificationData n)
                         throws StatusBarException {
         if (SPEW) {
-            Log.d(TAG, "performAddUpdateIcon icon=" + data + " notification=" + n + " key=" + key);
+            Slog.d(TAG, "performAddUpdateIcon icon=" + data + " notification=" + n + " key=" + key);
         }
         // notification
         if (n != null) {
@@ -725,7 +725,7 @@
                         rightIcons[slotIndex] = icon;
                         mStatusIcons.addView(icon.view, pos);
                     } else {
-                        Log.e(TAG, "duplicate icon in slot " + slotIndex + "/" + data.slot);
+                        Slog.e(TAG, "duplicate icon in slot " + slotIndex + "/" + data.slot);
                         mIconMap.remove(key);
                         mIconList.remove(icon);
                         return ;
@@ -754,7 +754,7 @@
     /* private */ void performSetIconVisibility(IBinder key, boolean visible) {
         synchronized (mIconMap) {
             if (SPEW) {
-                Log.d(TAG, "performSetIconVisibility key=" + key + " visible=" + visible);
+                Slog.d(TAG, "performSetIconVisibility key=" + key + " visible=" + visible);
             }
             StatusBarIcon icon = mIconMap.get(key);
             icon.view.setVisibility(visible ? View.VISIBLE : View.GONE);
@@ -764,7 +764,7 @@
     /* private */ void performRemoveIcon(IBinder key) {
         synchronized (this) {
             if (SPEW) {
-                Log.d(TAG, "performRemoveIcon key=" + key);
+                Slog.d(TAG, "performRemoveIcon key=" + key);
             }
             StatusBarIcon icon = mIconMap.remove(key);
             mIconList.remove(icon);
@@ -851,7 +851,7 @@
             exception = e;
         }
         if (child == null) {
-            Log.e(TAG, "couldn't inflate view for package " + n.pkg, exception);
+            Slog.e(TAG, "couldn't inflate view for package " + n.pkg, exception);
             return null;
         }
         content.addView(child);
@@ -908,7 +908,7 @@
             }
             catch (RuntimeException e) {
                 // It failed to add cleanly.  Log, and remove the view from the panel.
-                Log.w(TAG, "couldn't reapply views for package " + n.contentView.getPackage(), e);
+                Slog.w(TAG, "couldn't reapply views for package " + n.contentView.getPackage(), e);
                 removeNotificationView(notification);
             }
         } else {
@@ -949,7 +949,7 @@
     }
 
     private void makeExpandedVisible() {
-        if (SPEW) Log.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
+        if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible);
         if (mExpandedVisible) {
             return;
         }
@@ -969,7 +969,7 @@
     }
     
     void animateExpand() {
-        if (SPEW) Log.d(TAG, "Animate expand: expanded=" + mExpanded);
+        if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded);
         if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
             return ;
         }
@@ -983,7 +983,7 @@
     
     void animateCollapse() {
         if (SPEW) {
-            Log.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
+            Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
                     + " mExpandedVisible=" + mExpandedVisible
                     + " mExpanded=" + mExpanded
                     + " mAnimating=" + mAnimating
@@ -1009,7 +1009,7 @@
     }
     
     void performExpand() {
-        if (SPEW) Log.d(TAG, "performExpand: mExpanded=" + mExpanded);
+        if (SPEW) Slog.d(TAG, "performExpand: mExpanded=" + mExpanded);
         if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
             return ;
         }
@@ -1034,7 +1034,7 @@
     }
 
     void performCollapse() {
-        if (SPEW) Log.d(TAG, "performCollapse: mExpanded=" + mExpanded
+        if (SPEW) Slog.d(TAG, "performCollapse: mExpanded=" + mExpanded
                 + " mExpandedVisible=" + mExpandedVisible);
         
         if (!mExpandedVisible) {
@@ -1060,18 +1060,18 @@
 
     void doAnimation() {
         if (mAnimating) {
-            if (SPEW) Log.d(TAG, "doAnimation");
-            if (SPEW) Log.d(TAG, "doAnimation before mAnimY=" + mAnimY);
+            if (SPEW) Slog.d(TAG, "doAnimation");
+            if (SPEW) Slog.d(TAG, "doAnimation before mAnimY=" + mAnimY);
             incrementAnim();
-            if (SPEW) Log.d(TAG, "doAnimation after  mAnimY=" + mAnimY);
+            if (SPEW) Slog.d(TAG, "doAnimation after  mAnimY=" + mAnimY);
             if (mAnimY >= mDisplay.getHeight()-1) {
-                if (SPEW) Log.d(TAG, "Animation completed to expanded state.");
+                if (SPEW) Slog.d(TAG, "Animation completed to expanded state.");
                 mAnimating = false;
                 updateExpandedViewPos(EXPANDED_FULL_OPEN);
                 performExpand();
             }
             else if (mAnimY < mStatusBarView.getHeight()) {
-                if (SPEW) Log.d(TAG, "Animation completed to collapsed state.");
+                if (SPEW) Slog.d(TAG, "Animation completed to collapsed state.");
                 mAnimating = false;
                 updateExpandedViewPos(0);
                 performCollapse();
@@ -1099,7 +1099,7 @@
         mAnimY = y + (v*t) + (0.5f*a*t*t);                          // px
         mAnimVel = v + (a*t);                                       // px/s
         mAnimLastTime = now;                                        // ms
-        //Log.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY
+        //Slog.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY
         //        + " mAnimAccel=" + mAnimAccel);
     }
 
@@ -1155,7 +1155,7 @@
         mAnimY = y;
         mAnimVel = vel;
 
-        //Log.d(TAG, "starting with mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel);
+        //Slog.d(TAG, "starting with mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel);
 
         if (mExpanded) {
             if (!always && (
@@ -1195,7 +1195,7 @@
                 }
             }
         }
-        //Log.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel
+        //Slog.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel
         //        + " mAnimAccel=" + mAnimAccel);
 
         long now = SystemClock.uptimeMillis();
@@ -1210,7 +1210,7 @@
     
     boolean interceptTouchEvent(MotionEvent event) {
         if (SPEW) {
-            Log.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
+            Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled="
                 + mDisabled);
         }
 
@@ -1311,7 +1311,7 @@
                 mNotificationCallbacks.onNotificationClick(mPkg, mTag, mId);
             } catch (PendingIntent.CanceledException e) {
                 // the stack trace isn't very helpful here.  Just log the exception message.
-                Log.w(TAG, "Sending contentIntent failed: " + e);
+                Slog.w(TAG, "Sending contentIntent failed: " + e);
             }
             deactivate();
         }
@@ -1475,19 +1475,19 @@
             mHandler.post(new Runnable() {
                     public void run() {
                         mStatusBarView.getLocationOnScreen(mAbsPos);
-                        Log.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+                        Slog.d(TAG, "mStatusBarView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
                                 + ") " + mStatusBarView.getWidth() + "x"
                                 + mStatusBarView.getHeight());
                         mStatusBarView.debug();
 
                         mExpandedView.getLocationOnScreen(mAbsPos);
-                        Log.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+                        Slog.d(TAG, "mExpandedView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
                                 + ") " + mExpandedView.getWidth() + "x"
                                 + mExpandedView.getHeight());
                         mExpandedView.debug();
 
                         mTrackingView.getLocationOnScreen(mAbsPos);
-                        Log.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
+                        Slog.d(TAG, "mTrackingView: ----- (" + mAbsPos[0] + "," + mAbsPos[1]
                                 + ") " + mTrackingView.getWidth() + "x"
                                 + mTrackingView.getHeight());
                         mTrackingView.debug();
@@ -1578,7 +1578,7 @@
 
     void updateExpandedViewPos(int expandedPosition) {
         if (SPEW) {
-            Log.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition
+            Slog.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition
                     + " mTrackingParams.y=" + mTrackingParams.y
                     + " mTrackingPosition=" + mTrackingPosition);
         }
@@ -1652,7 +1652,7 @@
         }
 
         if (SPEW) {
-            Log.d(TAG, "updateExpandedViewPos after  expandedPosition=" + expandedPosition
+            Slog.d(TAG, "updateExpandedViewPos after  expandedPosition=" + expandedPosition
                     + " mTrackingParams.y=" + mTrackingParams.y
                     + " mTrackingPosition=" + mTrackingPosition
                     + " mExpandedParams.y=" + mExpandedParams.y
@@ -1697,13 +1697,13 @@
         // act accordingly
         if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) {
             if ((net & StatusBarManager.DISABLE_EXPAND) != 0) {
-                Log.d(TAG, "DISABLE_EXPAND: yes");
+                Slog.d(TAG, "DISABLE_EXPAND: yes");
                 animateCollapse();
             }
         }
         if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
             if ((net & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) {
-                Log.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
+                Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes");
                 if (mTicking) {
                     mNotificationIcons.setVisibility(View.INVISIBLE);
                     mTicker.halt();
@@ -1711,7 +1711,7 @@
                     setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out);
                 }
             } else {
-                Log.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
+                Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no");
                 if (!mExpandedVisible) {
                     setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in);
                 }
@@ -1751,7 +1751,7 @@
 
     void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
         if (false) {
-            Log.d(TAG, "updateNetworkName showSpn=" + showSpn + " spn=" + spn
+            Slog.d(TAG, "updateNetworkName showSpn=" + showSpn + " spn=" + spn
                     + " showPlmn=" + showPlmn + " plmn=" + plmn);
         }
         boolean something = false;
@@ -1793,7 +1793,7 @@
 
         mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore);
 
-        if (false) Log.v(TAG, "updateResources");
+        if (false) Slog.v(TAG, "updateResources");
     }
 
     //
@@ -1814,7 +1814,7 @@
         public void run() {
             vibrate();
             SystemClock.sleep(250);
-            Log.d(TAG, "startTracing");
+            Slog.d(TAG, "startTracing");
             android.os.Debug.startMethodTracing("/data/statusbar-traces/trace");
             mHandler.postDelayed(mStopTracing, 10000);
         }
@@ -1823,7 +1823,7 @@
     Runnable mStopTracing = new Runnable() {
         public void run() {
             android.os.Debug.stopMethodTracing();
-            Log.d(TAG, "stopTracing");
+            Slog.d(TAG, "stopTracing");
             vibrate();
         }
     };
diff --git a/services/java/com/android/server/status/StatusBarView.java b/services/java/com/android/server/status/StatusBarView.java
index 35dfb81..d12a3cf 100644
--- a/services/java/com/android/server/status/StatusBarView.java
+++ b/services/java/com/android/server/status/StatusBarView.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.util.Log;
+import android.util.Slog;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
diff --git a/services/java/com/android/server/status/StorageNotification.java b/services/java/com/android/server/status/StorageNotification.java
index e0b288d..8da8cd3 100644
--- a/services/java/com/android/server/status/StorageNotification.java
+++ b/services/java/com/android/server/status/StorageNotification.java
@@ -37,7 +37,7 @@
 import android.os.storage.StorageManager;
 import android.os.storage.StorageResultCode;
 import android.provider.Settings;
-import android.util.Log;
+import android.util.Slog;
 import android.view.View;
 import android.widget.Button;
 import android.widget.ImageView;
@@ -81,7 +81,7 @@
 
         mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
         mUmsAvailable = mStorageManager.isUsbMassStorageConnected();
-        Log.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", mUmsAvailable,
+        Slog.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", mUmsAvailable,
                 Environment.getExternalStorageState()));
     }
 
@@ -97,7 +97,7 @@
          */
         String st = Environment.getExternalStorageState();
 
-        Log.i(TAG, String.format("UMS connection changed to %s (media state %s)", connected, st));
+        Slog.i(TAG, String.format("UMS connection changed to %s (media state %s)", connected, st));
 
         if (connected && (st.equals(
                 Environment.MEDIA_REMOVED) || st.equals(Environment.MEDIA_CHECKING))) {
@@ -114,7 +114,7 @@
      */
     @Override
     public void onStorageStateChanged(String path, String oldState, String newState) {
-        Log.i(TAG, String.format(
+        Slog.i(TAG, String.format(
                 "Media {%s} state changed from {%s} -> {%s}", path, oldState, newState));
         if (newState.equals(Environment.MEDIA_SHARED)) {
             /*
@@ -229,7 +229,7 @@
                     true, true, null);
             updateUsbMassStorageNotification(false);
         } else {
-            Log.w(TAG, String.format("Ignoring unknown state {%s}", newState));
+            Slog.w(TAG, String.format("Ignoring unknown state {%s}", newState));
         }
     }
 
diff --git a/services/java/com/android/server/status/Ticker.java b/services/java/com/android/server/status/Ticker.java
index c93ee0d..6626c86 100644
--- a/services/java/com/android/server/status/Ticker.java
+++ b/services/java/com/android/server/status/Ticker.java
@@ -9,7 +9,7 @@
 import android.text.Layout.Alignment;
 import android.text.TextPaint;
 import android.text.TextUtils;
-import android.util.Log;
+import android.util.Slog;
 import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
diff --git a/services/java/com/android/server/status/TrackingPatternView.java b/services/java/com/android/server/status/TrackingPatternView.java
index 4cb8eff..2c91aa4 100644
--- a/services/java/com/android/server/status/TrackingPatternView.java
+++ b/services/java/com/android/server/status/TrackingPatternView.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
-import android.util.Log;
+import android.util.Slog;
 import android.view.View;
 import android.graphics.BitmapFactory;
 import android.graphics.Bitmap;
diff --git a/services/java/com/android/server/status/UsbStorageActivity.java b/services/java/com/android/server/status/UsbStorageActivity.java
index 7a2a2d6..c1c8c22 100644
--- a/services/java/com/android/server/status/UsbStorageActivity.java
+++ b/services/java/com/android/server/status/UsbStorageActivity.java
@@ -16,25 +16,27 @@
 
 package com.android.server.status;
 
+import com.android.internal.R;
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.DialogInterface.OnCancelListener;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.Environment;
+import android.os.IBinder;
+import android.os.storage.IMountService;
 import android.os.storage.StorageManager;
 import android.os.storage.StorageEventListener;
-import android.os.storage.StorageResultCode;
-import android.os.Message;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.widget.ImageView;
 import android.widget.Button;
 import android.widget.TextView;
-import android.widget.Toast;
 import android.view.View;
 import android.util.Log;
 
@@ -43,7 +45,8 @@
  * on-demand (that is, when the USB cable is connected). It uses the alert
  * dialog style. It will be launched from a notification.
  */
-public class UsbStorageActivity extends Activity {
+public class UsbStorageActivity extends Activity
+        implements View.OnClickListener, OnCancelListener {
     private static final String TAG = "UsbStorageActivity";
     private Button mMountButton;
     private Button mUnmountButton;
@@ -51,6 +54,9 @@
     private TextView mMessage;
     private ImageView mIcon;
     private StorageManager mStorageManager = null;
+    private static final int DLG_CONFIRM_KILL_STORAGE_USERS = 1;
+    private static final int DLG_ERROR_SHARING = 2;
+    static final boolean localLOGV = false;
 
     /** Used to detect when the USB cable is unplugged, so we can call finish() */
     private BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() {
@@ -82,7 +88,6 @@
             if (mStorageManager == null) {
                 Log.w(TAG, "Failed to get StorageManager");
             }
-            mStorageManager.registerListener(mStorageListener);
         }
 
         setTitle(getString(com.android.internal.R.string.usb_storage_activity_title));
@@ -94,28 +99,9 @@
         mMessage = (TextView) findViewById(com.android.internal.R.id.message);
 
         mMountButton = (Button) findViewById(com.android.internal.R.id.mount_button);
-        mMountButton.setOnClickListener(
-            new View.OnClickListener() { 
-                 public void onClick(View v) {
-                     int rc = mStorageManager.enableUsbMassStorage();
-                     if (rc != StorageResultCode.OperationSucceeded) {
-                         Log.e(TAG, String.format("UMS enable failed (%d)", rc));
-                         showSharingError();
-                     }
-                 }
-            });
-
+        mMountButton.setOnClickListener(this);
         mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button);
-        mUnmountButton.setOnClickListener(
-            new View.OnClickListener() { 
-                 public void onClick(View v) {
-                     int rc = mStorageManager.disableUsbMassStorage();
-                     if (rc != StorageResultCode.OperationSucceeded) {
-                         Log.e(TAG, String.format("UMS disable failed (%d)", rc));
-                         showStoppingError();
-                     }
-                 }
-            });
+        mUnmountButton.setOnClickListener(this);
     }
 
     private void switchDisplay(boolean usbStorageInUse) {
@@ -138,6 +124,7 @@
     protected void onResume() {
         super.onResume();
 
+        mStorageManager.registerListener(mStorageListener);
         registerReceiver(mBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
         try {
             switchDisplay(mStorageManager.isUsbMassStorageEnabled());
@@ -151,6 +138,9 @@
         super.onPause();
         
         unregisterReceiver(mBatteryReceiver);
+        if (mStorageManager == null && mStorageListener != null) {
+            mStorageManager.unregisterListener(mStorageListener);
+        }
     }
 
     private void handleBatteryChanged(Intent intent) {
@@ -160,15 +150,81 @@
             finish();
         }
     }
-    
-    private void showSharingError() {
-        Toast.makeText(this, com.android.internal.R.string.usb_storage_error_message,
-                Toast.LENGTH_LONG).show();
+
+    private IMountService getMountService() {
+        IBinder service = ServiceManager.getService("mount");
+        if (service != null) {
+            return IMountService.Stub.asInterface(service);
+        }
+        return null;
     }
-    
-    private void showStoppingError() {
-        Toast.makeText(this, com.android.internal.R.string.usb_storage_stop_error_message,
-                Toast.LENGTH_LONG).show();
+
+    @Override
+    public Dialog onCreateDialog(int id, Bundle args) {
+        switch (id) {
+        case DLG_CONFIRM_KILL_STORAGE_USERS:
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.dlg_confirm_kill_storage_users_title)
+                    .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            mStorageManager.enableUsbMassStorage();
+                        }})
+                    .setNegativeButton(R.string.cancel, null)
+                    .setMessage(R.string.dlg_confirm_kill_storage_users_text)
+                    .setOnCancelListener(this)
+                    .create();
+        case DLG_ERROR_SHARING:
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.dlg_error_title)
+                    .setNeutralButton(R.string.dlg_ok, null)
+                    .setMessage(R.string.usb_storage_error_message)
+                    .setOnCancelListener(this)
+                    .create();
+        }
+        return null;
+    }
+
+    private void showDialogInner(int id) {
+        removeDialog(id);
+        showDialog(id);
+    }
+
+    private void checkStorageUsers() {
+        IMountService ims = getMountService();
+        if (ims == null) {
+            // Display error dialog
+            showDialogInner(DLG_ERROR_SHARING);
+        }
+        String path = Environment.getExternalStorageDirectory().getPath();
+        int stUsers[] = null;
+        try {
+            if (localLOGV) Log.i(TAG, "Checking getStorageUsers");
+            stUsers = ims.getStorageUsers(path);
+        } catch (RemoteException e) {
+            showDialogInner(DLG_ERROR_SHARING);
+        }
+        if (stUsers != null && stUsers.length > 0) {
+            // Display dialog to user
+            showDialogInner(DLG_CONFIRM_KILL_STORAGE_USERS);
+        } else {
+            if (localLOGV) Log.i(TAG, "Enabling UMS");
+            mStorageManager.enableUsbMassStorage();
+        }
+    }
+
+    public void onClick(View v) {
+        Log.i(TAG, "Clicked button");
+        if (v == mMountButton) {
+           // Check for list of storage users and display dialog if needed.
+            checkStorageUsers();
+        } else if (v == mUnmountButton) {
+            if (localLOGV) Log.i(TAG, "Disabling UMS");
+            mStorageManager.disableUsbMassStorage();
+        }
+    }
+
+    public void onCancel(DialogInterface dialog) {
+        finish();
     }
 
 }
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index d5f18e0..b5461bf 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -105,6 +105,7 @@
     private static final String[] mSupportedApnTypes = {
             Phone.APN_TYPE_DEFAULT,
             Phone.APN_TYPE_MMS,
+            Phone.APN_TYPE_DUN,
             Phone.APN_TYPE_HIPRI };
 
     // Possibly promoate to base class, the only difference is
diff --git a/test-runner/src/android/test/IsolatedContext.java b/test-runner/src/android/test/IsolatedContext.java
index 485e45c..f093598 100644
--- a/test-runner/src/android/test/IsolatedContext.java
+++ b/test-runner/src/android/test/IsolatedContext.java
@@ -3,7 +3,11 @@
 import com.google.android.collect.Lists;
 
 import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
 import android.accounts.OnAccountsUpdateListener;
+import android.accounts.OperationCanceledException;
 import android.accounts.Account;
 import android.content.ContextWrapper;
 import android.content.ContentResolver;
@@ -16,8 +20,13 @@
 import android.net.Uri;
 import android.os.Handler;
 
-import java.util.List;
 import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+import java.util.List;
+
 
 /**
      * A mock context which prevents its users from talking to the rest of the device while
@@ -105,7 +114,58 @@
         public Account[] getAccounts() {
             return new Account[]{};
         }
+
+        public AccountManagerFuture<Account[]> getAccountsByTypeAndFeatures(
+                final String type, final String[] features,
+                AccountManagerCallback<Account[]> callback, Handler handler) {
+            return new MockAccountManagerFuture<Account[]>(new Account[0]);
+        }
+
+        public String blockingGetAuthToken(Account account, String authTokenType,
+                boolean notifyAuthFailure)
+                throws OperationCanceledException, IOException, AuthenticatorException {
+            return null;
+        }
+
+
+        /**
+         * A very simple AccountManagerFuture class
+         * that returns what ever was passed in
+         */
+        private class MockAccountManagerFuture<T>
+                implements AccountManagerFuture<T> {
+
+            T mResult;
+
+            public MockAccountManagerFuture(T result) {
+                mResult = result;
+            }
+
+            public boolean cancel(boolean mayInterruptIfRunning) {
+                return false;
+            }
+
+            public boolean isCancelled() {
+                return false;
+            }
+
+            public boolean isDone() {
+                return true;
+            }
+
+            public T getResult()
+                    throws OperationCanceledException, IOException, AuthenticatorException {
+                return mResult;
+            }
+
+            public T getResult(long timeout, TimeUnit unit)
+                    throws OperationCanceledException, IOException, AuthenticatorException {
+                return getResult();
+            }
+        }
+
     }
+
     @Override
     public File getFilesDir() {
         return new File("/dev/null");
diff --git a/tests/DumpRenderTree/assets/run_layout_tests.py b/tests/DumpRenderTree/assets/run_layout_tests.py
index c3627bb..7f3ef2d 100755
--- a/tests/DumpRenderTree/assets/run_layout_tests.py
+++ b/tests/DumpRenderTree/assets/run_layout_tests.py
@@ -26,6 +26,7 @@
     --time-out-ms (default is 8000 millis) for each test
     --adb-options="-e" passes option string to adb
     --results-directory=..., (default is ./layout-test-results) directory name under which results are stored.
+    --js-engine the JavaScript engine currently in use, determines which set of Android-specific expected results we should use, should be 'jsc' or 'v8'
 """
 
 import logging
@@ -186,6 +187,16 @@
   run_layout_test_cmd_postfix = " -e path \"" + path + "\" -e timeout " + timeout_ms
   if options.rebaseline:
     run_layout_test_cmd_postfix += " -e rebaseline true"
+
+  # If the JS engine is not specified on the command line, try reading the
+  # JS_ENGINE environment  variable, which is used by the build system in
+  # external/webkit/Android.mk.
+  js_engine = options.js_engine
+  if not js_engine:
+    js_engine = os.environ['JS_ENGINE']
+  if js_engine:
+    run_layout_test_cmd_postfix += " -e jsengine " + js_engine
+
   run_layout_test_cmd_postfix += " -w com.android.dumprendertree/.LayoutTestsAutoRunner"
 
   # Call LayoutTestsAutoTest::startLayoutTests.
@@ -297,6 +308,9 @@
                            default=None,
                            dest="ref_directory",
                            help="directory where reference results are stored.")
+  option_parser.add_option("", "--js-engine",
+                           default=None,
+                           help="The JavaScript engine currently in use, which determines which set of Android-specific expected results we should use. Should be 'jsc' or 'v8'.");
 
   options, args = option_parser.parse_args();
   main(options, args)
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
index 6ceb0f9..191b5e9 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/FileFilter.java
@@ -84,7 +84,6 @@
         // This first block of tests are for HTML5 features, for which Android
         // should pass all tests. They are skipped only temporarily.
         // TODO: Fix these failing tests and remove them from this list.
-        ignoreResultList.add("fast/dom/Geolocation/callback-exception.html"); // exception output incorrect with V8
         ignoreResultList.add("http/tests/appcache/auth.html"); // file not found
         ignoreResultList.add("http/tests/appcache/deferred-events.html"); // file not found
         ignoreResultList.add("http/tests/appcache/deferred-events-delete-while-raising.html"); // file not found
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
index 539d551..e058f32 100755
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoRunner.java
@@ -79,14 +79,17 @@
 
         mSaveImagePath = (String) icicle.get("saveimage");
 
+        mJsEngine = (String) icicle.get("jsengine");
+
         super.onCreate(icicle);
     }
     
-    public String mTestPath = null;
-    public String mSaveImagePath = null;
-    public int mTimeoutInMillis = 0;
-    public int mDelay = 0;
-    public boolean mRebaseline = false;
-    public boolean mLogtime = false;
-    public boolean mGetDrawTime = false;
+    public String mTestPath;
+    public String mSaveImagePath;
+    public int mTimeoutInMillis;
+    public int mDelay;
+    public boolean mRebaseline;
+    public boolean mLogtime;
+    public boolean mGetDrawTime;
+    public String mJsEngine;
 }
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
index 634d683..d9ec3fa 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LayoutTestsAutoTest.java
@@ -147,6 +147,9 @@
     private MyTestRecorder mResultRecorder;
     private Vector<String> mTestList;
     private boolean mRebaselineResults;
+    // The JavaScript engine currently in use. This determines which set of Android-specific
+    // expected test results we use.
+    private String mJsEngine;
     private String mTestPathPrefix;
     private boolean mFinished;
 
@@ -214,14 +217,24 @@
         return shortName.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_RESULT_DIR) + "-result.txt";
     }
 
+    // Gets the file which contains WebKit's expected results for this test.
     private String getExpectedResultFile(String test) {
+        // The generic result is at <path>/<name>-expected.txt
+        // First try the Android-specific result at
+        // platform/android-<js-engine>/<path>/<name>-expected.txt
         int pos = test.lastIndexOf('.');
-        if(pos == -1)
+        if (pos == -1)
             return null;
-        String shortName = test.substring(0, pos);
-        return shortName + "-expected.txt";
+        String genericExpectedResult = test.substring(0, pos) + "-expected.txt";
+        String androidExpectedResultsDir = "platform/android-" + mJsEngine + "/";
+        String androidExpectedResult =
+            genericExpectedResult.replaceFirst(LAYOUT_TESTS_ROOT, LAYOUT_TESTS_ROOT + androidExpectedResultsDir);
+        File f = new File(androidExpectedResult);
+        return f.exists() ? androidExpectedResult : genericExpectedResult;
     }
 
+    // Gets the file which contains the actual results of running the test on
+    // Android, generated by a previous run which set a new baseline.
     private String getAndroidExpectedResultFile(String expectedResultFile) {
         return expectedResultFile.replaceFirst(LAYOUT_TESTS_ROOT, ANDROID_EXPECTED_RESULT_DIR);
     }
@@ -282,8 +295,8 @@
         });
 
         String resultFile = getResultFile(test);
-        if(resultFile == null) {
-            //simply ignore this test
+        if (resultFile == null) {
+            // Simply ignore this test.
             return;
         }
         if (mRebaselineResults) {
@@ -339,8 +352,10 @@
         this.mTestList = new Vector<String>();
 
         // Read settings
-        this.mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
-        this.mRebaselineResults = runner.mRebaseline;
+        mTestPathPrefix = (new File(LAYOUT_TESTS_ROOT + runner.mTestPath)).getAbsolutePath();
+        mRebaselineResults = runner.mRebaseline;
+        // JSC is the default JavaScript engine.
+        mJsEngine = runner.mJsEngine == null ? "jsc" : runner.mJsEngine;
 
         int timeout = runner.mTimeoutInMillis;
         if (timeout <= 0) {
diff --git a/tests/LotsOfApps/Android.mk b/tests/LotsOfApps/Android.mk
index 8d0cfa3..0ef9550 100644
--- a/tests/LotsOfApps/Android.mk
+++ b/tests/LotsOfApps/Android.mk
@@ -8,4 +8,6 @@
 LOCAL_PACKAGE_NAME := LotsOfApps
 LOCAL_CERTIFICATE := platform
 
+LOCAL_PROGUARD_ENABLED := disabled
+
 include $(BUILD_PACKAGE)
diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk
index 498ec40..31e2ec5 100644
--- a/tests/backup/Android.mk
+++ b/tests/backup/Android.mk
@@ -40,5 +40,7 @@
 
 LOCAL_PACKAGE_NAME := BackupTest
 
+LOCAL_PROGUARD_ENABLED := disabled
+
 include $(BUILD_PACKAGE)
     
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 69b2207..6e7a66d 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -1133,6 +1133,26 @@
     getNavigationName(navigation.string(), &params);
     getScreenSizeName(screenSize.string(), &params);
     getVersionName(version.string(), &params);
+    
+    // Fix up version number based on specified parameters.
+    int minSdk = 0;
+    if ((params.uiMode&ResTable_config::MASK_UI_MODE_TYPE)
+                != ResTable_config::UI_MODE_TYPE_ANY
+            ||  (params.uiMode&ResTable_config::MASK_UI_MODE_NIGHT)
+                != ResTable_config::UI_MODE_NIGHT_ANY) {
+        minSdk = SDK_FROYO;
+    } else if ((params.screenLayout&ResTable_config::MASK_SCREENSIZE)
+                != ResTable_config::SCREENSIZE_ANY
+            ||  (params.screenLayout&ResTable_config::MASK_SCREENLONG)
+                != ResTable_config::SCREENLONG_ANY
+            || params.density != ResTable_config::DENSITY_DEFAULT) {
+        minSdk = SDK_DONUT;
+    }
+    
+    if (minSdk > params.sdkVersion) {
+        params.sdkVersion = minSdk;
+    }
+    
     return params;
 }
 
diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h
index 9a848e4..eeb00c0 100644
--- a/tools/aapt/AaptAssets.h
+++ b/tools/aapt/AaptAssets.h
@@ -45,6 +45,15 @@
     AXIS_VERSION
 };
 
+enum {
+    SDK_CUPCAKE = 3,
+    SDK_DONUT = 4,
+    SDK_ECLAIR = 5,
+    SDK_ECLAIR_0_1 = 6,
+    SDK_MR1 = 7,
+    SDK_FROYO = 8,
+};
+
 /**
  * This structure contains a specific variation of a single file out
  * of all the variations it can have that we can have.
diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h
index 558b587..08530a0 100644
--- a/tools/aapt/Bundle.h
+++ b/tools/aapt/Bundle.h
@@ -38,7 +38,8 @@
           mUpdate(false), mExtending(false),
           mRequireLocalization(false), mPseudolocalize(false),
           mUTF8(false), mEncodingSpecified(false), mValues(false),
-          mCompressionMethod(0), mOutputAPKFile(NULL), mManifestPackageNameOverride(NULL),
+          mCompressionMethod(0), mOutputAPKFile(NULL),
+          mManifestPackageNameOverride(NULL), mInstrumentationPackageNameOverride(NULL),
           mAutoAddOverlay(false), mAssetSourceDir(NULL), mProguardFile(NULL),
           mAndroidManifestFile(NULL), mPublicOutputFile(NULL),
           mRClassDir(NULL), mResourceIntermediatesDir(NULL),
@@ -90,6 +91,8 @@
     void setOutputAPKFile(const char* val) { mOutputAPKFile = val; }
     const char* getManifestPackageNameOverride() const { return mManifestPackageNameOverride; }
     void setManifestPackageNameOverride(const char * val) { mManifestPackageNameOverride = val; }
+    const char* getInstrumentationPackageNameOverride() const { return mInstrumentationPackageNameOverride; }
+    void setInstrumentationPackageNameOverride(const char * val) { mInstrumentationPackageNameOverride = val; }
     bool getAutoAddOverlay() { return mAutoAddOverlay; }
     void setAutoAddOverlay(bool val) { mAutoAddOverlay = val; }
 
@@ -183,6 +186,7 @@
     bool        mJunkPath;
     const char* mOutputAPKFile;
     const char* mManifestPackageNameOverride;
+    const char* mInstrumentationPackageNameOverride;
     bool        mAutoAddOverlay;
     const char* mAssetSourceDir;
     const char* mProguardFile;
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index ee07415..537ae5e 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -525,6 +525,8 @@
             bool actWallpaperService = false;
             bool specCameraFeature = false;
             bool hasCameraPermission = false;
+            bool specGpsFeature = false;
+            bool hasGpsPermission = false;
             int targetSdk = 0;
             int smallScreen = 1;
             int normalScreen = 1;
@@ -719,6 +721,8 @@
                                     REQUIRED_ATTR, NULL, 1);
                             if (name == "android.hardware.camera") {
                                 specCameraFeature = true;
+                            } else if (name == "android.hardware.location.gps") {
+                                specGpsFeature = true;
                             }
                             printf("uses-feature%s:'%s'\n",
                                     req ? "" : "-not-required", name.string());
@@ -734,6 +738,8 @@
                         if (name != "" && error == "") {
                             if (name == "android.permission.CAMERA") {
                                 hasCameraPermission = true;
+                            } else if (name == "android.permission.ACCESS_FINE_LOCATION") {
+                                hasGpsPermission = true;
                             }
                             printf("uses-permission:'%s'\n", name.string());
                         } else {
@@ -859,6 +865,14 @@
                 printf("uses-feature:'android.hardware.camera.autofocus'\n");
             }
 
+            if (!specGpsFeature && hasGpsPermission) {
+                // For applications that have not explicitly stated their
+                // GPS feature requirements, but have requested the "fine" (GPS)
+                // permission, we are going to give them compatibility treatment
+                // of requiring the equivalent to original android devices.
+                printf("uses-feature:'android.hardware.location.gps'\n");
+            }
+
             if (hasMainActivity) {
                 printf("main\n");
             }
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 6d0a351..dd98c85 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -58,9 +58,10 @@
         " %s p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \\\n"
         "        [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \\\n"
         "        [--min-sdk-version VAL] [--target-sdk-version VAL] \\\n"
-        "        [--max-sdk-version VAL] [--app-version VAL] \\\n"
-        "        [--app-version-name TEXT] [--custom-package VAL] [--utf16] \\\n"
-        "        [--auto-add-overlay] \\\n"
+        "        [--app-version VAL] [--app-version-name TEXT] [--custom-package VAL] \\\n"
+        "        [--rename-manifest-package PACKAGE] \\\n"
+        "        [--rename-instrumentation-target-package PACKAGE] \\\n"
+        "        [--utf16] [--auto-add-overlay] \\\n"
         "        [-I base-package [-I base-package ...]] \\\n"
         "        [-A asset-source-dir]  [-G class-list-file] [-P public-definitions-file] \\\n"
         "        [-S resource-sources [-S resource-sources ...]] "
@@ -127,8 +128,6 @@
         "       higher, the default encoding for resources will be in UTF-8.\n"
         "   --target-sdk-version\n"
         "       inserts android:targetSdkVersion in to manifest.\n"
-        "   --max-sdk-version\n"
-        "       inserts android:maxSdkVersion in to manifest.\n"
         "   --values\n"
         "       when used with \"dump resources\" also includes resource values.\n"
         "   --version-code\n"
@@ -139,6 +138,16 @@
         "       generates R.java into a different package.\n"
         "   --auto-add-overlay\n"
         "       Automatically add resources that are only in overlays.\n"
+        "   --rename-manifest-package\n"
+        "       Rewrite the manifest so that its package name is the package name\n"
+        "       given here.  Relative class names (for example .Foo) will be\n"
+        "       changed to absolute names with the old package so that the code\n"
+        "       does not need to change.\n"
+        "   --rename-instrumentation-target-package\n"
+        "       Rewrite the manifest so that all of its instrumentation\n"
+        "       components target the given package.  Useful when used in\n"
+        "       conjunction with --rename-manifest-package to fix tests against\n"
+        "       a package that has been renamed.\n"
         "   --utf16\n"
         "       changes default encoding for resources to UTF-16.  Only useful when API\n"
         "       level is set to 7 or higher where the default encoding is UTF-8.\n");
@@ -448,6 +457,15 @@
                         goto bail;
                     }
                     bundle.setManifestPackageNameOverride(argv[0]);
+                } else if (strcmp(cp, "-rename-instrumentation-target-package") == 0) {
+                    argc--;
+                    argv++;
+                    if (!argc) {
+                        fprintf(stderr, "ERROR: No argument supplied for '--rename-instrumentation-target-package' option\n");
+                        wantUsage = true;
+                        goto bail;
+                    }
+                    bundle.setInstrumentationPackageNameOverride(argv[0]);
                 } else if (strcmp(cp, "-auto-add-overlay") == 0) {
                     bundle.setAutoAddOverlay(true);
                 } else {
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index ae4bd14..9fcb21c 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -562,9 +562,10 @@
     node->addAttribute(ns, attr, String16(value));
 }
 
-static void fullyQualifyClassName(String8& package, sp<XMLNode> node) {
+static void fullyQualifyClassName(const String8& package, sp<XMLNode> node,
+        const String16& attrName) {
     XMLNode::attribute_entry* attr = node->editAttribute(
-            String16("http://schemas.android.com/apk/res/android"), String16("name"));
+            String16("http://schemas.android.com/apk/res/android"), attrName);
     if (attr != NULL) {
         String8 name(attr->string);
 
@@ -635,19 +636,40 @@
         // Make class names fully qualified
         sp<XMLNode> application = root->getChildElement(String16(), String16("application"));
         if (application != NULL) {
-            fullyQualifyClassName(origPackage, application);
+            fullyQualifyClassName(origPackage, application, String16("name"));
 
             Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(application->getChildren());
             for (size_t i = 0; i < children.size(); i++) {
                 sp<XMLNode> child = children.editItemAt(i);
                 String8 tag(child->getElementName());
                 if (tag == "activity" || tag == "service" || tag == "receiver" || tag == "provider") {
-                    fullyQualifyClassName(origPackage, child);
+                    fullyQualifyClassName(origPackage, child, String16("name"));
+                } else if (tag == "activity-alias") {
+                    fullyQualifyClassName(origPackage, child, String16("name"));
+                    fullyQualifyClassName(origPackage, child, String16("targetActivity"));
                 }
             }
         }
     }
 
+    // Deal with manifest package name overrides
+    const char* instrumentationPackageNameOverride = bundle->getInstrumentationPackageNameOverride();
+    if (instrumentationPackageNameOverride != NULL) {
+        // Fix up instrumentation targets.
+        Vector<sp<XMLNode> >& children = const_cast<Vector<sp<XMLNode> >&>(root->getChildren());
+        for (size_t i = 0; i < children.size(); i++) {
+            sp<XMLNode> child = children.editItemAt(i);
+            String8 tag(child->getElementName());
+            if (tag == "instrumentation") {
+                XMLNode::attribute_entry* attr = child->editAttribute(
+                        String16("http://schemas.android.com/apk/res/android"), String16("targetPackage"));
+                if (attr != NULL) {
+                    attr->string.setTo(String16(instrumentationPackageNameOverride));
+                }
+            }
+        }
+    }
+    
     return NO_ERROR;
 }
 
@@ -1866,8 +1888,26 @@
     return NO_ERROR;
 }
 
+void
+addProguardKeepRule(ProguardKeepSet* keep, const String8& className,
+        const String8& srcName, int line)
+{
+    String8 rule("-keep class ");
+    rule += className;
+    rule += " { <init>(...); }";
+
+    String8 location("view ");
+    location += srcName;
+    char lineno[20];
+    sprintf(lineno, ":%d", line);
+    location += lineno;
+
+    keep->add(rule, location);
+}
+
 status_t
-writeProguardForLayout(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile)
+writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile,
+        const char* startTag, const char* altTag)
 {
     status_t err;
     ResXMLTree tree;
@@ -1881,6 +1921,23 @@
 
     tree.restart();
 
+    if (startTag != NULL) {
+        bool haveStart = false;
+        while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
+            if (code != ResXMLTree::START_TAG) {
+                continue;
+            }
+            String8 tag(tree.getElementName(&len));
+            if (tag == startTag) {
+                haveStart = true;
+            }
+            break;
+        }
+        if (!haveStart) {
+            return NO_ERROR;
+        }
+    }
+    
     while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) {
         if (code != ResXMLTree::START_TAG) {
             continue;
@@ -1889,17 +1946,19 @@
 
         // If there is no '.', we'll assume that it's one of the built in names.
         if (strchr(tag.string(), '.')) {
-            String8 rule("-keep class ");
-            rule += tag;
-            rule += " { <init>(...); }";
-
-            String8 location("view ");
-            location += layoutFile->getSourceFile();
-            char lineno[20];
-            sprintf(lineno, ":%d", tree.getLineNumber());
-            location += lineno;
-
-            keep->add(rule, location);
+            addProguardKeepRule(keep, tag,
+                    layoutFile->getPrintableSource(), tree.getLineNumber());
+        } else if (altTag != NULL && tag == altTag) {
+            ssize_t classIndex = tree.indexOfAttribute(NULL, "class");
+            if (classIndex < 0) {
+                fprintf(stderr, "%s:%d: <view> does not have class attribute.\n",
+                        layoutFile->getPrintableSource().string(), tree.getLineNumber());
+            } else {
+                size_t len;
+                addProguardKeepRule(keep,
+                        String8(tree.getAttributeStringValue(classIndex, &len)),
+                        layoutFile->getPrintableSource(), tree.getLineNumber());
+            }
         }
     }
 
@@ -1915,10 +1974,16 @@
     for (size_t k=0; k<K; k++) {
         const sp<AaptDir>& d = dirs.itemAt(k);
         const String8& dirName = d->getLeaf();
-        if ((dirName != String8("layout")) && (strncmp(dirName.string(), "layout-", 7) != 0)) {
+        const char* startTag = NULL;
+        const char* altTag = NULL;
+        if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) {
+            altTag = "view";
+        } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) {
+            startTag = "PreferenceScreen";
+        } else {
             continue;
         }
-
+        
         const KeyedVector<String8,sp<AaptGroup> > groups = d->getFiles();
         const size_t N = groups.size();
         for (size_t i=0; i<N; i++) {
@@ -1926,7 +1991,7 @@
             const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& files = group->getFiles();
             const size_t M = files.size();
             for (size_t j=0; j<M; j++) {
-                err = writeProguardForLayout(keep, files.valueAt(j));
+                err = writeProguardForXml(keep, files.valueAt(j), startTag, altTag);
                 if (err < 0) {
                     return err;
                 }