Merge snapshot variant of donut back into main tree
diff --git a/Android.mk b/Android.mk
index f32129e..038af0d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -67,10 +67,11 @@
 	core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \
   core/java/android/accessibilityservice/IEventListener.aidl \
 	core/java/android/accounts/IAccountsService.aidl \
+	core/java/android/app/IActivityController.aidl \
 	core/java/android/app/IActivityPendingResult.aidl \
 	core/java/android/app/IActivityWatcher.aidl \
 	core/java/android/app/IAlarmManager.aidl \
-        core/java/android/app/IBackupAgent.aidl \
+	core/java/android/app/IBackupAgent.aidl \
 	core/java/android/app/IInstrumentationWatcher.aidl \
 	core/java/android/app/INotificationManager.aidl \
 	core/java/android/app/ISearchManager.aidl \
@@ -88,12 +89,12 @@
 	core/java/android/bluetooth/IBluetoothDevice.aidl \
 	core/java/android/bluetooth/IBluetoothDeviceCallback.aidl \
 	core/java/android/bluetooth/IBluetoothHeadset.aidl \
-        core/java/android/content/IContentService.aidl \
+	core/java/android/content/IContentService.aidl \
 	core/java/android/content/IIntentReceiver.aidl \
 	core/java/android/content/IIntentSender.aidl \
 	core/java/android/content/ISyncAdapter.aidl \
 	core/java/android/content/ISyncContext.aidl \
-        core/java/android/content/ISyncStatusObserver.aidl \
+	core/java/android/content/ISyncStatusObserver.aidl \
 	core/java/android/content/pm/IPackageDataObserver.aidl \
 	core/java/android/content/pm/IPackageDeleteObserver.aidl \
 	core/java/android/content/pm/IPackageInstallObserver.aidl \
diff --git a/api/current.xml b/api/current.xml
index 78562f0..a1dc293 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -496,6 +496,17 @@
  visibility="public"
 >
 </field>
+<field name="GLOBAL_SEARCH"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.permission.GLOBAL_SEARCH&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="HARDWARE_TEST"
  type="java.lang.String"
  transient="false"
@@ -2275,6 +2286,17 @@
  visibility="public"
 >
 </field>
+<field name="autoUrlDetect"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="16843404"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="background"
  type="int"
  transient="false"
@@ -3386,17 +3408,6 @@
  visibility="public"
 >
 </field>
-<field name="donut_resource_pad20"
- type="int"
- transient="false"
- volatile="false"
- value="16843404"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
 <field name="donut_resource_pad3"
  type="int"
  transient="false"
@@ -23611,7 +23622,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="dialog" type="android.content.DialogInterface">
@@ -23624,7 +23635,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="dialog" type="android.content.DialogInterface">
@@ -23721,6 +23732,50 @@
  visibility="public"
 >
 </field>
+<field name="EXTRA_DATA_KEY"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;intent_extra_data_key&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="INTENT_ACTION_SEARCHABLES_CHANGED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.search.action.SEARCHABLES_CHANGED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="INTENT_ACTION_SEARCH_SETTINGS_CHANGED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.search.action.SETTINGS_CHANGED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="INTENT_ACTION_WEB_SEARCH_SETTINGS"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.search.action.WEB_SEARCH_SETTINGS&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="MENU_KEY"
  type="char"
  transient="false"
@@ -23754,6 +23809,17 @@
  visibility="public"
 >
 </field>
+<field name="SHORTCUT_MIME_TYPE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;vnd.android.cursor.item/vnd.android.search.suggest&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SUGGEST_COLUMN_FORMAT"
  type="java.lang.String"
  transient="false"
@@ -23820,6 +23886,17 @@
  visibility="public"
 >
 </field>
+<field name="SUGGEST_COLUMN_INTENT_EXTRA_DATA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;suggest_intent_extra_data&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SUGGEST_COLUMN_QUERY"
  type="java.lang.String"
  transient="false"
@@ -23831,6 +23908,28 @@
  visibility="public"
 >
 </field>
+<field name="SUGGEST_COLUMN_SHORTCUT_ID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;suggest_shortcut_id&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;suggest_spinner_while_refreshing&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SUGGEST_COLUMN_TEXT_1"
  type="java.lang.String"
  transient="false"
@@ -23864,6 +23963,17 @@
  visibility="public"
 >
 </field>
+<field name="SUGGEST_NEVER_MAKE_SHORTCUT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;_-1&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="SUGGEST_URI_PATH_QUERY"
  type="java.lang.String"
  transient="false"
@@ -23875,6 +23985,17 @@
  visibility="public"
 >
 </field>
+<field name="SUGGEST_URI_PATH_SHORTCUT"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;search_suggest_shortcut&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="USER_QUERY"
  type="java.lang.String"
  transient="false"
@@ -25945,6 +26066,17 @@
  visibility="public"
 >
 </method>
+<method name="getPathPermissions"
+ return="android.content.pm.PathPermission[]"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getReadPermission"
  return="java.lang.String"
  abstract="false"
@@ -26113,6 +26245,19 @@
 <parameter name="sortOrder" type="java.lang.String">
 </parameter>
 </method>
+<method name="setPathPermissions"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+<parameter name="permissions" type="android.content.pm.PathPermission[]">
+</parameter>
+</method>
 <method name="setReadPermission"
  return="void"
  abstract="false"
@@ -32138,6 +32283,39 @@
  visibility="public"
 >
 </field>
+<field name="ACTION_TTS_CHECK_TTS_DATA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.action.CHECK_TTS_DATA&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_TTS_INSTALL_TTS_DATA"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.action.INSTALL_TTS_DATA&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ACTION_TTS_QUEUE_PROCESSING_COMPLETED"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;android.intent.action.TTS_QUEUE_PROCESSING_COMPLETED&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="ACTION_UID_REMOVED"
  type="java.lang.String"
  transient="false"
@@ -37714,6 +37892,73 @@
 >
 </field>
 </class>
+<class name="PathPermission"
+ extends="android.os.PatternMatcher"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="PathPermission"
+ type="android.content.pm.PathPermission"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="pattern" type="java.lang.String">
+</parameter>
+<parameter name="type" type="int">
+</parameter>
+<parameter name="readPermission" type="java.lang.String">
+</parameter>
+<parameter name="writePermission" type="java.lang.String">
+</parameter>
+</constructor>
+<constructor name="PathPermission"
+ type="android.content.pm.PathPermission"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="src" type="android.os.Parcel">
+</parameter>
+</constructor>
+<method name="getReadPermission"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getWritePermission"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</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="PermissionGroupInfo"
  extends="android.content.pm.PackageItemInfo"
  abstract="false"
@@ -38043,6 +38288,17 @@
  visibility="public"
 >
 </field>
+<field name="pathPermissions"
+ type="android.content.pm.PathPermission[]"
+ transient="false"
+ volatile="false"
+ value="null"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="readPermission"
  type="java.lang.String"
  transient="false"
@@ -46736,6 +46992,1742 @@
 </method>
 </class>
 </package>
+<package name="android.gesture"
+>
+<class name="Gesture"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.os.Parcelable">
+</implements>
+<constructor name="Gesture"
+ type="android.gesture.Gesture"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="addStroke"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stroke" type="android.gesture.GestureStroke">
+</parameter>
+</method>
+<method name="describeContents"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getBoundingBox"
+ return="android.graphics.RectF"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getID"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getLength"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getStrokes"
+ return="java.util.ArrayList&lt;android.gesture.GestureStroke&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getStrokesCount"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="toBitmap"
+ return="android.graphics.Bitmap"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="edge" type="int">
+</parameter>
+<parameter name="numSample" type="int">
+</parameter>
+<parameter name="color" type="int">
+</parameter>
+</method>
+<method name="toBitmap"
+ return="android.graphics.Bitmap"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="inset" type="int">
+</parameter>
+<parameter name="color" type="int">
+</parameter>
+</method>
+<method name="toPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="toPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="path" type="android.graphics.Path">
+</parameter>
+</method>
+<method name="toPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="edge" type="int">
+</parameter>
+<parameter name="numSample" type="int">
+</parameter>
+</method>
+<method name="toPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="path" type="android.graphics.Path">
+</parameter>
+<parameter name="width" type="int">
+</parameter>
+<parameter name="height" type="int">
+</parameter>
+<parameter name="edge" type="int">
+</parameter>
+<parameter name="numSample" 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="out" 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="GestureLibraries"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="fromFile"
+ return="android.gesture.GestureLibrary"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="path" type="java.lang.String">
+</parameter>
+</method>
+<method name="fromFile"
+ return="android.gesture.GestureLibrary"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="path" type="java.io.File">
+</parameter>
+</method>
+<method name="fromPrivateFile"
+ return="android.gesture.GestureLibrary"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="name" type="java.lang.String">
+</parameter>
+</method>
+<method name="fromRawResource"
+ return="android.gesture.GestureLibrary"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="resourceId" type="int">
+</parameter>
+</method>
+</class>
+<class name="GestureLibrary"
+ extends="java.lang.Object"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="GestureLibrary"
+ type="android.gesture.GestureLibrary"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</constructor>
+<method name="addGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="getGestureEntries"
+ return="java.util.Set&lt;java.lang.String&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestures"
+ return="java.util.ArrayList&lt;android.gesture.Gesture&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+</method>
+<method name="getLearner"
+ return="android.gesture.Learner"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getOrientationStyle"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSequenceType"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isReadOnly"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="load"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="recognize"
+ return="java.util.ArrayList&lt;android.gesture.Prediction&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="removeEntry"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+</method>
+<method name="removeGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="save"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="setOrientationStyle"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="style" type="int">
+</parameter>
+</method>
+<method name="setSequenceType"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="type" type="int">
+</parameter>
+</method>
+<field name="mStore"
+ type="android.gesture.GestureStore"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="protected"
+>
+</field>
+</class>
+<class name="GestureOverlayView"
+ extends="android.widget.FrameLayout"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="GestureOverlayView"
+ type="android.gesture.GestureOverlayView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+</constructor>
+<constructor name="GestureOverlayView"
+ type="android.gesture.GestureOverlayView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+</constructor>
+<constructor name="GestureOverlayView"
+ type="android.gesture.GestureOverlayView"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="context" type="android.content.Context">
+</parameter>
+<parameter name="attrs" type="android.util.AttributeSet">
+</parameter>
+<parameter name="defStyle" type="int">
+</parameter>
+</constructor>
+<method name="addOnGestureListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener">
+</parameter>
+</method>
+<method name="addOnGesturePerformedListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener">
+</parameter>
+</method>
+<method name="addOnGesturingListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener">
+</parameter>
+</method>
+<method name="cancelClearAnimation"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="cancelGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="clear"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="animated" type="boolean">
+</parameter>
+</method>
+<method name="getCurrentStroke"
+ return="java.util.ArrayList&lt;android.gesture.GesturePoint&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getFadeOffset"
+ return="long"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGesture"
+ return="android.gesture.Gesture"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestureColor"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGesturePath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGesturePath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="path" type="android.graphics.Path">
+</parameter>
+</method>
+<method name="getGestureStrokeAngleThreshold"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestureStrokeLengthThreshold"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestureStrokeSquarenessTreshold"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestureStrokeType"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestureStrokeWidth"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getOrientation"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getUncertainGestureColor"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isEventsInterceptionEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isFadeEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isGestureVisible"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="isGesturing"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeAllOnGestureListeners"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeAllOnGesturePerformedListeners"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeAllOnGesturingListeners"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="removeOnGestureListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener">
+</parameter>
+</method>
+<method name="removeOnGesturePerformedListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener">
+</parameter>
+</method>
+<method name="removeOnGesturingListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener">
+</parameter>
+</method>
+<method name="setEventsInterceptionEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="enabled" type="boolean">
+</parameter>
+</method>
+<method name="setFadeEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="fadeEnabled" type="boolean">
+</parameter>
+</method>
+<method name="setFadeOffset"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="fadeOffset" type="long">
+</parameter>
+</method>
+<method name="setGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="setGestureColor"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="color" type="int">
+</parameter>
+</method>
+<method name="setGestureStrokeAngleThreshold"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gestureStrokeAngleThreshold" type="float">
+</parameter>
+</method>
+<method name="setGestureStrokeLengthThreshold"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gestureStrokeLengthThreshold" type="float">
+</parameter>
+</method>
+<method name="setGestureStrokeSquarenessTreshold"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gestureStrokeSquarenessTreshold" type="float">
+</parameter>
+</method>
+<method name="setGestureStrokeType"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gestureStrokeType" type="int">
+</parameter>
+</method>
+<method name="setGestureStrokeWidth"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gestureStrokeWidth" type="float">
+</parameter>
+</method>
+<method name="setGestureVisible"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="visible" type="boolean">
+</parameter>
+</method>
+<method name="setOrientation"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="orientation" type="int">
+</parameter>
+</method>
+<method name="setUncertainGestureColor"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="color" type="int">
+</parameter>
+</method>
+<field name="GESTURE_STROKE_TYPE_MULTIPLE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="GESTURE_STROKE_TYPE_SINGLE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ORIENTATION_HORIZONTAL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ORIENTATION_VERTICAL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<interface name="GestureOverlayView.OnGestureListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onGesture"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="onGestureCancelled"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="onGestureEnded"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+<method name="onGestureStarted"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+<parameter name="event" type="android.view.MotionEvent">
+</parameter>
+</method>
+</interface>
+<interface name="GestureOverlayView.OnGesturePerformedListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onGesturePerformed"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+</interface>
+<interface name="GestureOverlayView.OnGesturingListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onGesturingEnded"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+</method>
+<method name="onGesturingStarted"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="overlay" type="android.gesture.GestureOverlayView">
+</parameter>
+</method>
+</interface>
+<class name="GesturePoint"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="GesturePoint"
+ type="android.gesture.GesturePoint"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="x" type="float">
+</parameter>
+<parameter name="y" type="float">
+</parameter>
+<parameter name="t" type="long">
+</parameter>
+</constructor>
+<field name="timestamp"
+ type="long"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="x"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="y"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="GestureStore"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="GestureStore"
+ type="android.gesture.GestureStore"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<method name="addGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="getGestureEntries"
+ return="java.util.Set&lt;java.lang.String&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getGestures"
+ return="java.util.ArrayList&lt;android.gesture.Gesture&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+</method>
+<method name="getOrientationStyle"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSequenceType"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="hasChanged"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="load"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stream" type="java.io.InputStream">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="load"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stream" type="java.io.InputStream">
+</parameter>
+<parameter name="closeStream" type="boolean">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="recognize"
+ return="java.util.ArrayList&lt;android.gesture.Prediction&gt;"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="removeEntry"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+</method>
+<method name="removeGesture"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="entryName" type="java.lang.String">
+</parameter>
+<parameter name="gesture" type="android.gesture.Gesture">
+</parameter>
+</method>
+<method name="save"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stream" type="java.io.OutputStream">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="save"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="stream" type="java.io.OutputStream">
+</parameter>
+<parameter name="closeStream" type="boolean">
+</parameter>
+<exception name="IOException" type="java.io.IOException">
+</exception>
+</method>
+<method name="setOrientationStyle"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="style" type="int">
+</parameter>
+</method>
+<method name="setSequenceType"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="type" type="int">
+</parameter>
+</method>
+<field name="ORIENTATION_INVARIANT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="ORIENTATION_SENSITIVE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SEQUENCE_INVARIANT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SEQUENCE_SENSITIVE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="GestureStroke"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="GestureStroke"
+ type="android.gesture.GestureStroke"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="points" type="java.util.ArrayList&lt;android.gesture.GesturePoint&gt;">
+</parameter>
+</constructor>
+<method name="clearPath"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="computeOrientedBoundingBox"
+ return="android.gesture.OrientedBoundingBox"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="toPath"
+ return="android.graphics.Path"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="width" type="float">
+</parameter>
+<parameter name="height" type="float">
+</parameter>
+<parameter name="numSample" type="int">
+</parameter>
+</method>
+<field name="boundingBox"
+ type="android.graphics.RectF"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="length"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="points"
+ type="float[]"
+ transient="false"
+ volatile="false"
+ value="null"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="Learner"
+ extends="java.lang.Object"
+ abstract="true"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility=""
+>
+</class>
+<class name="OrientedBoundingBox"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<field name="centerX"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="centerY"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="height"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="orientation"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="squareness"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="width"
+ type="float"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="Prediction"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<field name="name"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="score"
+ type="double"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+</package>
 <package name="android.graphics"
 >
 <class name="AvoidXfermode"
@@ -47060,6 +49052,17 @@
  visibility="public"
 >
 </method>
+<method name="getDensityScale"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getHeight"
  return="int"
  abstract="false"
@@ -47133,6 +49136,58 @@
  visibility="public"
 >
 </method>
+<method name="getScaledHeight"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="canvas" type="android.graphics.Canvas">
+</parameter>
+</method>
+<method name="getScaledHeight"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="metrics" type="android.util.DisplayMetrics">
+</parameter>
+</method>
+<method name="getScaledWidth"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="canvas" type="android.graphics.Canvas">
+</parameter>
+</method>
+<method name="getScaledWidth"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="metrics" type="android.util.DisplayMetrics">
+</parameter>
+</method>
 <method name="getWidth"
  return="int"
  abstract="false"
@@ -47155,6 +49210,17 @@
  visibility="public"
 >
 </method>
+<method name="isAutoScalingEnabled"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="isMutable"
  return="boolean"
  abstract="false"
@@ -47199,6 +49265,32 @@
  visibility="public"
 >
 </method>
+<method name="setAutoScalingEnabled"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="autoScalingEnabled" type="boolean">
+</parameter>
+</method>
+<method name="setDensityScale"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="densityScale" type="float">
+</parameter>
+</method>
 <method name="setPixel"
  return="void"
  abstract="false"
@@ -47266,6 +49358,17 @@
  visibility="public"
 >
 </field>
+<field name="DENSITY_SCALE_UNKNOWN"
+ type="float"
+ transient="false"
+ volatile="false"
+ value="-1.0f"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </class>
 <class name="Bitmap.CompressFormat"
  extends="java.lang.Enum"
@@ -47485,6 +49588,27 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<parameter name="res" type="android.content.res.Resources">
+</parameter>
+<parameter name="value" type="android.util.TypedValue">
+</parameter>
+<parameter name="is" type="java.io.InputStream">
+</parameter>
+<parameter name="pad" type="android.graphics.Rect">
+</parameter>
+<parameter name="opts" type="android.graphics.BitmapFactory.Options">
+</parameter>
+</method>
+<method name="decodeStream"
+ return="android.graphics.Bitmap"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
 <parameter name="is" type="java.io.InputStream">
 </parameter>
 <parameter name="outPadding" type="android.graphics.Rect">
@@ -47533,6 +49657,16 @@
  visibility="public"
 >
 </method>
+<field name="inDensity"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="inDither"
  type="boolean"
  transient="false"
@@ -47593,6 +49727,16 @@
  visibility="public"
 >
 </field>
+<field name="inScaled"
+ type="boolean"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="inTempStorage"
  type="byte[]"
  transient="false"
@@ -48847,6 +50991,17 @@
  visibility="public"
 >
 </method>
+<method name="getDensityScale"
+ return="float"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getDrawFilter"
  return="android.graphics.DrawFilter"
  abstract="false"
@@ -49193,6 +51348,19 @@
 <parameter name="bitmap" type="android.graphics.Bitmap">
 </parameter>
 </method>
+<method name="setDensityScale"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="densityScale" type="float">
+</parameter>
+</method>
 <method name="setDrawFilter"
  return="void"
  abstract="false"
@@ -64967,6 +67135,17 @@
  visibility="public"
 >
 </method>
+<method name="getPremises"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getSubAdminArea"
  return="java.lang.String"
  abstract="false"
@@ -64978,6 +67157,28 @@
  visibility="public"
 >
 </method>
+<method name="getSubLocality"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getSubThoroughfare"
+ return="java.lang.String"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getThoroughfare"
  return="java.lang.String"
  abstract="false"
@@ -65167,6 +67368,19 @@
 <parameter name="postalCode" type="java.lang.String">
 </parameter>
 </method>
+<method name="setPremises"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="premises" type="java.lang.String">
+</parameter>
+</method>
 <method name="setSubAdminArea"
  return="void"
  abstract="false"
@@ -65180,6 +67394,32 @@
 <parameter name="subAdminArea" type="java.lang.String">
 </parameter>
 </method>
+<method name="setSubLocality"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="sublocality" type="java.lang.String">
+</parameter>
+</method>
+<method name="setSubThoroughfare"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="subthoroughfare" type="java.lang.String">
+</parameter>
+</method>
 <method name="setThoroughfare"
  return="void"
  abstract="false"
@@ -109153,6 +111393,38 @@
 <parameter name="listener" type="android.speech.tts.TextToSpeech.OnInitListener">
 </parameter>
 </constructor>
+<method name="addEarcon"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="earcon" type="java.lang.String">
+</parameter>
+<parameter name="packagename" type="java.lang.String">
+</parameter>
+<parameter name="resourceId" type="int">
+</parameter>
+</method>
+<method name="addEarcon"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="earcon" type="java.lang.String">
+</parameter>
+<parameter name="filename" type="java.lang.String">
+</parameter>
+</method>
 <method name="addSpeech"
  return="int"
  abstract="false"
@@ -109251,6 +111523,8 @@
 </parameter>
 <parameter name="queueMode" type="int">
 </parameter>
+<parameter name="params" type="java.util.HashMap&lt;java.lang.String, java.lang.String&gt;">
+</parameter>
 </method>
 <method name="setLanguage"
  return="int"
@@ -109265,6 +111539,19 @@
 <parameter name="loc" type="java.util.Locale">
 </parameter>
 </method>
+<method name="setOnUtteranceCompletedListener"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.speech.tts.TextToSpeech.OnUtteranceCompletedListener">
+</parameter>
+</method>
 <method name="setPitch"
  return="int"
  abstract="false"
@@ -109447,6 +111734,144 @@
 >
 </field>
 </class>
+<class name="TextToSpeech.Engine"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="TextToSpeech.Engine"
+ type="android.speech.tts.TextToSpeech.Engine"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</constructor>
+<field name="CHECK_VOICE_DATA_BAD_DATA"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="CHECK_VOICE_DATA_FAIL"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="CHECK_VOICE_DATA_MISSING_DATA"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="CHECK_VOICE_DATA_MISSING_VOLUME"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="-3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="CHECK_VOICE_DATA_PASS"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="TTS_DEFAULT_STREAM"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="TTS_KEY_PARAM_STREAM"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;streamType&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="TTS_KEY_PARAM_UTTERANCE_ID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;utteranceId&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="VOICE_DATA_FILES"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;dataFiles&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="VOICE_DATA_FILES_INFO"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;dataFilesInfo&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="VOICE_DATA_ROOT_DIRECTORY"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;dataRoot&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
 <interface name="TextToSpeech.OnInitListener"
  abstract="true"
  static="true"
@@ -109468,6 +111893,27 @@
 </parameter>
 </method>
 </interface>
+<interface name="TextToSpeech.OnUtteranceCompletedListener"
+ abstract="true"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<method name="onUtteranceCompleted"
+ return="void"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="utteranceId" type="java.lang.String">
+</parameter>
+</method>
+</interface>
 </package>
 <package name="android.telephony"
 >
@@ -130809,6 +133255,50 @@
  visibility="public"
 >
 </method>
+<field name="DENSITY_DEFAULT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="160"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DENSITY_HIGH"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="240"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DENSITY_LOW"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="120"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DENSITY_MEDIUM"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="160"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="density"
  type="float"
  transient="false"
@@ -132858,6 +135348,28 @@
  visibility="public"
 >
 </field>
+<field name="DENSITY_DEFAULT"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DENSITY_NONE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="65535"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="TYPE_ATTRIBUTE"
  type="int"
  transient="false"
@@ -133086,6 +135598,16 @@
  visibility="public"
 >
 </field>
+<field name="density"
+ type="int"
+ transient="false"
+ volatile="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="resourceId"
  type="int"
  transient="false"
@@ -169227,6 +171749,17 @@
 <parameter name="yOffset" type="int">
 </parameter>
 </method>
+<method name="getSoftInputMode"
+ 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"
@@ -169432,6 +171965,19 @@
 <parameter name="touchable" type="boolean">
 </parameter>
 </method>
+<method name="setSoftInputMode"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="mode" type="int">
+</parameter>
+</method>
 <method name="setTouchInterceptor"
  return="void"
  abstract="false"
diff --git a/awt/Android.mk b/awt/Android.mk
index c7480f53a..213c6ce 100644
--- a/awt/Android.mk
+++ b/awt/Android.mk
@@ -28,4 +28,4 @@
 
 LOCAL_DX_FLAGS := --core-library
 
-include $(BUILD_JAVA_LIBRARY)
+#include $(BUILD_JAVA_LIBRARY)
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp
index 022fe5a..e4b6791 100644
--- a/camera/libcameraservice/CameraService.cpp
+++ b/camera/libcameraservice/CameraService.cpp
@@ -504,8 +504,7 @@
     }
 
     // start recording mode
-    ret = mHardware->startRecording(recordingCallback,
-                                    mCameraService.get());
+    ret = mHardware->startRecording(recordingCallback, mCameraService.get());
     if (ret != NO_ERROR) {
         LOGE("mHardware->startRecording() failed with status %d", ret);
     }
@@ -798,7 +797,7 @@
 }
 
 // recording callback
-void CameraService::Client::recordingCallback(const sp<IMemory>& mem, void* user)
+void CameraService::Client::recordingCallback(nsecs_t timestamp, const sp<IMemory>& mem, void* user)
 {
     LOGV("recordingCallback");
     sp<Client> client = getClientFromCookie(user);
@@ -806,7 +805,7 @@
         return;
     }
     // The strong pointer guarantees the client will exist, but no lock is held.
-    client->postRecordingFrame(mem);
+    client->postRecordingFrame(timestamp, mem);
 }
 
 // take a picture - image is returned in callback
@@ -1072,14 +1071,14 @@
     mCameraClient->dataCallback(CAMERA_MSG_PREVIEW_FRAME, frame);
 }
 
-void CameraService::Client::postRecordingFrame(const sp<IMemory>& frame)
+void CameraService::Client::postRecordingFrame(nsecs_t timestamp, const sp<IMemory>& frame)
 {
     LOGV("postRecordingFrame");
     if (frame == 0) {
         LOGW("frame is a null pointer");
         return;
     }
-    mCameraClient->dataCallback(CAMERA_MSG_VIDEO_FRAME, frame);
+    mCameraClient->dataCallbackTimestamp(timestamp, CAMERA_MSG_VIDEO_FRAME, frame);
 }
 
 void CameraService::Client::postPreviewFrame(const sp<IMemory>& mem)
diff --git a/camera/libcameraservice/CameraService.h b/camera/libcameraservice/CameraService.h
index 0f07673..ea93789 100644
--- a/camera/libcameraservice/CameraService.h
+++ b/camera/libcameraservice/CameraService.h
@@ -132,7 +132,7 @@
 
                     status_t    checkPid();
 
-        static      void        recordingCallback(const sp<IMemory>& mem, void* user);
+        static      void        recordingCallback(nsecs_t timestamp, const sp<IMemory>& mem, void* user);
         static      void        previewCallback(const sp<IMemory>& mem, void* user);
         static      void        shutterCallback(void *user);
         static      void        yuvPictureCallback(const sp<IMemory>& mem, void* user);
@@ -144,7 +144,7 @@
                     void        postRaw(const sp<IMemory>& mem);
                     void        postJpeg(const sp<IMemory>& mem);
                     void        postPreviewFrame(const sp<IMemory>& mem);
-                    void        postRecordingFrame(const sp<IMemory>& frame);
+                    void        postRecordingFrame(nsecs_t timestamp, const sp<IMemory>& frame);
                     void        copyFrameAndPostCopiedFrame(sp<IMemoryHeap> heap, size_t offset, size_t size);
                     void        postError(status_t error);
                     void        postAutoFocus(bool focused);
diff --git a/cmds/keystore/keystore_get.h b/cmds/keystore/keystore_get.h
index a7fd9a5..7665e81 100644
--- a/cmds/keystore/keystore_get.h
+++ b/cmds/keystore/keystore_get.h
@@ -29,7 +29,7 @@
  * is returned. Otherwise it returns the value in dynamically allocated memory
  * and sets the size if the pointer is not NULL. One can release the memory by
  * calling free(). */
-static char *keystore_get(char *key, int *size)
+static char *keystore_get(const char *key, int *size)
 {
     char buffer[MAX_KEY_VALUE_LENGTH];
     char *value;
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index ca9632a..4ac3b9e 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -606,13 +606,13 @@
     private static final String SAVED_DIALOG_IDS_KEY = "android:savedDialogIds";
     private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
     private static final String SAVED_DIALOG_KEY_PREFIX = "android:dialog_";
-    private static final String SAVED_SEARCH_DIALOG_KEY = "android:search_dialog";
 
     private SparseArray<Dialog> mManagedDialogs;
 
     // set by the thread after the constructor and before onCreate(Bundle savedInstanceState) is called.
     private Instrumentation mInstrumentation;
     private IBinder mToken;
+    private int mIdent;
     /*package*/ String mEmbeddedID;
     private Application mApplication;
     /*package*/ Intent mIntent;
@@ -630,7 +630,6 @@
     /*package*/ int mConfigChangeFlags;
     /*package*/ Configuration mCurrentConfig;
     private SearchManager mSearchManager;
-    private Bundle mSearchDialogState = null;
 
     private Window mWindow;
 
@@ -791,9 +790,6 @@
     protected void onCreate(Bundle savedInstanceState) {
         mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
                 com.android.internal.R.styleable.Window_windowNoDisplay, true);
-        // uses super.getSystemService() since this.getSystemService() looks at the
-        // mSearchManager field.
-        mSearchManager = (SearchManager) super.getSystemService(Context.SEARCH_SERVICE);
         mCalled = true;
     }
 
@@ -808,13 +804,6 @@
     final void performRestoreInstanceState(Bundle savedInstanceState) {
         onRestoreInstanceState(savedInstanceState);
         restoreManagedDialogs(savedInstanceState);
-        
-        // Also restore the state of a search dialog (if any)
-        // TODO more generic than just this manager
-        Bundle searchState = savedInstanceState.getBundle(SAVED_SEARCH_DIALOG_KEY);
-        if (searchState != null) {
-            mSearchManager.restoreSearchDialog(searchState);
-        }
     }
 
     /**
@@ -866,7 +855,7 @@
             if (dialogState != null) {
                 // Calling onRestoreInstanceState() below will invoke dispatchOnCreate
                 // so tell createDialog() not to do it, otherwise we get an exception
-                final Dialog dialog = createDialog(dialogId, false);
+                final Dialog dialog = createDialog(dialogId, dialogState);
                 mManagedDialogs.put(dialogId, dialog);
                 onPrepareDialog(dialogId, dialog);
                 dialog.onRestoreInstanceState(dialogState);
@@ -874,13 +863,13 @@
         }
     }
 
-    private Dialog createDialog(Integer dialogId, boolean dispatchOnCreate) {
+    private Dialog createDialog(Integer dialogId, Bundle state) {
         final Dialog dialog = onCreateDialog(dialogId);
         if (dialog == null) {
             throw new IllegalArgumentException("Activity#onCreateDialog did "
                     + "not create a dialog for id " + dialogId);
         }
-        if (dispatchOnCreate) dialog.dispatchOnCreate(null);
+        dialog.dispatchOnCreate(state);
         return dialog;
     }
 
@@ -1030,14 +1019,6 @@
     final void performSaveInstanceState(Bundle outState) {
         onSaveInstanceState(outState);
         saveManagedDialogs(outState);
-
-        // Also save the state of a search dialog (if any)
-        // TODO more generic than just this manager
-        // onPause() should always be called before this method, so mSearchManagerState
-        // should be up to date.
-        if (mSearchDialogState != null) {
-            outState.putBundle(SAVED_SEARCH_DIALOG_KEY, mSearchDialogState);
-        }
     }
 
     /**
@@ -1317,10 +1298,6 @@
                 c.mCursor.close();
             }
         }
-
-        // Clear any search state saved in performPause(). If the state may be needed in the
-        // future, it will have been saved by performSaveInstanceState()
-        mSearchDialogState = null;
     }
 
     /**
@@ -1341,11 +1318,7 @@
      */
     public void onConfigurationChanged(Configuration newConfig) {
         mCalled = true;
-        
-        // also update search dialog if showing
-        // TODO more generic than just this manager
-        mSearchManager.onConfigurationChanged(newConfig);
-        
+
         if (mWindow != null) {
             // Pass the configuration changed event to the window
             mWindow.onConfigurationChanged(newConfig);
@@ -2432,7 +2405,7 @@
         }
         Dialog dialog = mManagedDialogs.get(id);
         if (dialog == null) {
-            dialog = createDialog(id, true);
+            dialog = createDialog(id, null);
             mManagedDialogs.put(id, dialog);
         }
         
@@ -2556,6 +2529,7 @@
      */
     public void startSearch(String initialQuery, boolean selectInitialQuery, 
             Bundle appSearchData, boolean globalSearch) {
+        ensureSearchManager();
         mSearchManager.startSearch(initialQuery, selectInitialQuery, getComponentName(),
                         appSearchData, globalSearch); 
     }
@@ -3266,6 +3240,24 @@
         return getSharedPreferences(getLocalClassName(), mode);
     }
     
+    private void ensureSearchManager() {
+        if (mSearchManager != null) {
+            return;
+        }
+        
+        // uses super.getSystemService() since this.getSystemService() looks at the
+        // mSearchManager field.
+        mSearchManager = (SearchManager) super.getSystemService(Context.SEARCH_SERVICE);
+        int ident = mIdent;
+        if (ident == 0) {
+            if (mParent != null) ident = mParent.mIdent;
+            if (ident == 0) {
+                throw new IllegalArgumentException("no ident");
+            }
+        }
+        mSearchManager.setIdent(ident);
+    }
+    
     @Override
     public Object getSystemService(String name) {
         if (getBaseContext() == null) {
@@ -3276,6 +3268,7 @@
         if (WINDOW_SERVICE.equals(name)) {
             return mWindowManager;
         } else if (SEARCH_SERVICE.equals(name)) {
+            ensureSearchManager();
             return mSearchManager;
         }
         return super.getSystemService(name);
@@ -3475,14 +3468,17 @@
             Application application, Intent intent, ActivityInfo info, CharSequence title, 
             Activity parent, String id, Object lastNonConfigurationInstance,
             Configuration config) {
-        attach(context, aThread, instr, token, application, intent, info, title, parent, id,
+        attach(context, aThread, instr, token, 0, application, intent, info, title, parent, id,
             lastNonConfigurationInstance, null, config);
     }
     
-    final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token,
-        Application application, Intent intent, ActivityInfo info, CharSequence title, 
-        Activity parent, String id, Object lastNonConfigurationInstance,
-        HashMap<String,Object> lastNonConfigurationChildInstances, Configuration config) {
+    final void attach(Context context, ActivityThread aThread,
+            Instrumentation instr, IBinder token, int ident,
+            Application application, Intent intent, ActivityInfo info,
+            CharSequence title, Activity parent, String id,
+            Object lastNonConfigurationInstance,
+            HashMap<String,Object> lastNonConfigurationChildInstances,
+            Configuration config) {
         attachBaseContext(context);
 
         mWindow = PolicyManager.makeNewWindow(this);
@@ -3495,6 +3491,7 @@
         mMainThread = aThread;
         mInstrumentation = instr;
         mToken = token;
+        mIdent = ident;
         mApplication = application;
         mIntent = intent;
         mComponent = intent.getComponent();
@@ -3575,21 +3572,10 @@
                 "Activity " + mComponent.toShortString() +
                 " did not call through to super.onPostResume()");
         }
-
-        // restore search dialog, if any
-        if (mSearchDialogState != null) {
-            mSearchManager.restoreSearchDialog(mSearchDialogState);
-        }
-        mSearchDialogState = null;
     }
 
     final void performPause() {
         onPause();
-
-        // save search dialog state if the search dialog is open,
-        // and then dismiss the search dialog
-        mSearchDialogState = mSearchManager.saveSearchDialog();
-        mSearchManager.stopSearch();
     }
     
     final void performUserLeaving() {
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index dfa8139..ba6cc32 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -881,11 +881,11 @@
             return true;
         }
 
-        case SET_ACTIVITY_WATCHER_TRANSACTION: {
+        case SET_ACTIVITY_CONTROLLER_TRANSACTION: {
             data.enforceInterface(IActivityManager.descriptor);
-            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
+            IActivityController watcher = IActivityController.Stub.asInterface(
                     data.readStrongBinder());
-            setActivityWatcher(watcher);
+            setActivityController(watcher);
             return true;
         }
 
@@ -1052,6 +1052,39 @@
             reply.writeNoException();
             return true;
         }
+        
+        case REGISTER_ACTIVITY_WATCHER_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
+                    data.readStrongBinder());
+            registerActivityWatcher(watcher);
+            return true;
+        }
+        
+        case UNREGISTER_ACTIVITY_WATCHER_TRANSACTION: {
+            data.enforceInterface(IActivityManager.descriptor);
+            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
+                    data.readStrongBinder());
+            unregisterActivityWatcher(watcher);
+            return true;
+        }
+        
+        case START_ACTIVITY_IN_PACKAGE_TRANSACTION:
+        {
+            data.enforceInterface(IActivityManager.descriptor);
+            int uid = data.readInt();
+            Intent intent = Intent.CREATOR.createFromParcel(data);
+            String resolvedType = data.readString();
+            IBinder resultTo = data.readStrongBinder();
+            String resultWho = data.readString();    
+            int requestCode = data.readInt();
+            boolean onlyIfNeeded = data.readInt() != 0;
+            int result = startActivityInPackage(uid, intent, resolvedType,
+                    resultTo, resultWho, requestCode, onlyIfNeeded);
+            reply.writeNoException();
+            reply.writeInt(result);
+            return true;
+        }
         }
         
         return super.onTransact(code, data, reply, flags);
@@ -2105,13 +2138,13 @@
         data.recycle();
         reply.recycle();
     }
-    public void setActivityWatcher(IActivityWatcher watcher) throws RemoteException
+    public void setActivityController(IActivityController watcher) throws RemoteException
     {
         Parcel data = Parcel.obtain();
         Parcel reply = Parcel.obtain();
         data.writeInterfaceToken(IActivityManager.descriptor);
         data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
-        mRemote.transact(SET_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
+        mRemote.transact(SET_ACTIVITY_CONTROLLER_TRANSACTION, data, reply, 0);
         reply.readException();
         data.recycle();
         reply.recycle();
@@ -2290,5 +2323,51 @@
         data.recycle();
     }
     
+    public void registerActivityWatcher(IActivityWatcher watcher)
+            throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
+        mRemote.transact(REGISTER_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+    
+    public void unregisterActivityWatcher(IActivityWatcher watcher)
+            throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
+        mRemote.transact(UNREGISTER_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
+        reply.readException();
+        data.recycle();
+        reply.recycle();
+    }
+    
+    public int startActivityInPackage(int uid,
+            Intent intent, String resolvedType, IBinder resultTo,
+            String resultWho, int requestCode, boolean onlyIfNeeded)
+            throws RemoteException {
+        Parcel data = Parcel.obtain();
+        Parcel reply = Parcel.obtain();
+        data.writeInterfaceToken(IActivityManager.descriptor);
+        data.writeInt(uid);
+        intent.writeToParcel(data, 0);
+        data.writeString(resolvedType);
+        data.writeStrongBinder(resultTo);
+        data.writeString(resultWho);
+        data.writeInt(requestCode);
+        data.writeInt(onlyIfNeeded ? 1 : 0);
+        mRemote.transact(START_ACTIVITY_IN_PACKAGE_TRANSACTION, data, reply, 0);
+        reply.readException();
+        int result = reply.readInt();
+        reply.recycle();
+        data.recycle();
+        return result;
+    }
+        
     private IBinder mRemote;
 }
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 5ee29ac..76b47f1 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -32,8 +32,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ServiceInfo;
-import android.content.pm.PackageParser.Component;
 import android.content.res.AssetManager;
+import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.sqlite.SQLiteDatabase;
@@ -166,43 +166,52 @@
         return metrics;
     }
 
-    Resources getTopLevelResources(String appDir, PackageInfo pkgInfo) {
+    /**
+     * Creates the top level Resources for applications with the given compatibility info.
+     *
+     * @param resDir the resource directory.
+     * @param compInfo the compability info. It will use the default compatibility info when it's
+     * null.
+     */
+    Resources getTopLevelResources(String resDir, CompatibilityInfo compInfo) {
         synchronized (mPackages) {
-            //Log.w(TAG, "getTopLevelResources: " + appDir);
-            WeakReference<Resources> wr = mActiveResources.get(appDir);
+            // Resources is app scale dependent.
+            ResourcesKey key = new ResourcesKey(resDir, compInfo.applicationScale);
+            //Log.w(TAG, "getTopLevelResources: " + resDir);
+            WeakReference<Resources> wr = mActiveResources.get(key);
             Resources r = wr != null ? wr.get() : null;
             if (r != null && r.getAssets().isUpToDate()) {
-                //Log.w(TAG, "Returning cached resources " + r + " " + appDir);
+                //Log.w(TAG, "Returning cached resources " + r + " " + resDir);
                 return r;
             }
 
             //if (r != null) {
             //    Log.w(TAG, "Throwing away out-of-date resources!!!! "
-            //            + r + " " + appDir);
+            //            + r + " " + resDir);
             //}
 
             AssetManager assets = new AssetManager();
-            if (assets.addAssetPath(appDir) == 0) {
+            if (assets.addAssetPath(resDir) == 0) {
                 return null;
             }
-            ApplicationInfo appInfo;
-            try {
-                appInfo = getPackageManager().getApplicationInfo(
-                        pkgInfo.getPackageName(),
-                        PackageManager.GET_SUPPORTS_DENSITIES);
-            } catch (RemoteException e) {
-                throw new AssertionError(e);
-            }
-            //Log.i(TAG, "Resource:" + appDir + ", display metrics=" + metrics);
+
+            //Log.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics);
             DisplayMetrics metrics = getDisplayMetricsLocked(false);
-            r = new Resources(assets, metrics, getConfiguration(), appInfo);
+            r = new Resources(assets, metrics, getConfiguration(), compInfo);
             //Log.i(TAG, "Created app resources " + r + ": " + r.getConfiguration());
             // XXX need to remove entries when weak references go away
-            mActiveResources.put(appDir, new WeakReference<Resources>(r));
+            mActiveResources.put(key, new WeakReference<Resources>(r));
             return r;
         }
     }
 
+    /**
+     * Creates the top level resources for the given package.
+     */
+    Resources getTopLevelResources(String resDir, PackageInfo pkgInfo) {
+        return getTopLevelResources(resDir, pkgInfo.mCompatibilityInfo);
+    }
+
     final Handler getHandler() {
         return mH;
     }
@@ -223,6 +232,7 @@
         private Resources mResources;
         private ClassLoader mClassLoader;
         private Application mApplication;
+        private CompatibilityInfo mCompatibilityInfo;
 
         private final HashMap<Context, HashMap<BroadcastReceiver, ReceiverDispatcher>> mReceivers
             = new HashMap<Context, HashMap<BroadcastReceiver, ReceiverDispatcher>>();
@@ -250,6 +260,7 @@
             mBaseClassLoader = baseLoader;
             mSecurityViolation = securityViolation;
             mIncludeCode = includeCode;
+            mCompatibilityInfo = new CompatibilityInfo(aInfo);
 
             if (mAppDir == null) {
                 if (mSystemContext == null) {
@@ -283,6 +294,7 @@
             mIncludeCode = true;
             mClassLoader = systemContext.getClassLoader();
             mResources = systemContext.getResources();
+            mCompatibilityInfo = new CompatibilityInfo(mApplicationInfo);
         }
 
         public String getPackageName() {
@@ -1077,6 +1089,7 @@
 
     private static final class ActivityRecord {
         IBinder token;
+        int ident;
         Intent intent;
         Bundle state;
         Activity activity;
@@ -1286,12 +1299,13 @@
 
         // we use token to identify this activity without having to send the
         // activity itself back to the activity manager. (matters more with ipc)
-        public final void scheduleLaunchActivity(Intent intent, IBinder token,
+        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                 ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
                 List<Intent> pendingNewIntents, boolean notResumed, boolean isForward) {
             ActivityRecord r = new ActivityRecord();
 
             r.token = token;
+            r.ident = ident;
             r.intent = intent;
             r.activityInfo = info;
             r.state = state;
@@ -1894,6 +1908,32 @@
         }
     }
 
+    private final static class ResourcesKey {
+        final private String mResDir;
+        final private float mScale;
+        final private int mHash;
+        
+        ResourcesKey(String resDir, float scale) {
+            mResDir = resDir;
+            mScale = scale;
+            mHash = mResDir.hashCode() << 2 + (int) (mScale * 2);
+        }
+        
+        @Override
+        public int hashCode() {
+            return mHash;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!(obj instanceof ResourcesKey)) {
+                return false;
+            }
+            ResourcesKey peer = (ResourcesKey) obj;
+            return mResDir.equals(peer.mResDir) && mScale == peer.mScale;
+        }
+    }
+
     static IPackageManager sPackageManager;
 
     final ApplicationThread mAppThread = new ApplicationThread();
@@ -1939,8 +1979,8 @@
         = new HashMap<String, WeakReference<PackageInfo>>();
     Display mDisplay = null;
     DisplayMetrics mDisplayMetrics = null;
-    HashMap<String, WeakReference<Resources> > mActiveResources
-        = new HashMap<String, WeakReference<Resources> >();
+    HashMap<ResourcesKey, WeakReference<Resources> > mActiveResources
+        = new HashMap<ResourcesKey, WeakReference<Resources> >();
 
     // The lock of mProviderMap protects the following variables.
     final HashMap<String, ProviderRecord> mProviderMap
@@ -2158,21 +2198,11 @@
     }
     
     public final Activity startActivityNow(Activity parent, String id,
-            Intent intent, IBinder token, Bundle state) {
-        ActivityInfo aInfo = resolveActivityInfo(intent);
-        return startActivityNow(parent, id, intent, aInfo, token, state);
-    }
-    
-    public final Activity startActivityNow(Activity parent, String id,
-            Intent intent, ActivityInfo activityInfo, IBinder token, Bundle state) {
-        return startActivityNow(parent, id, intent, activityInfo, token, state, null);
-    }
-
-    public final Activity startActivityNow(Activity parent, String id,
         Intent intent, ActivityInfo activityInfo, IBinder token, Bundle state,
         Object lastNonConfigurationInstance) {
         ActivityRecord r = new ActivityRecord();
             r.token = token;
+            r.ident = 0;
             r.intent = intent;
             r.state = state;
             r.parent = parent;
@@ -2296,10 +2326,10 @@
                 appContext.setOuterContext(activity);
                 CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
                 Configuration config = new Configuration(mConfiguration);
-                activity.attach(appContext, this, getInstrumentation(), r.token, app, 
-                        r.intent, r.activityInfo, title, r.parent, r.embeddedID,
-                        r.lastNonConfigurationInstance, r.lastNonConfigurationChildInstances,
-                        config);
+                activity.attach(appContext, this, getInstrumentation(), r.token,
+                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
+                        r.embeddedID, r.lastNonConfigurationInstance,
+                        r.lastNonConfigurationChildInstances, config);
                 
                 if (customIntent != null) {
                     activity.mIntent = customIntent;
@@ -2545,32 +2575,39 @@
             classname = "android.app.FullBackupAgent";
         }
         try {
-            java.lang.ClassLoader cl = packageInfo.getClassLoader();
-            agent = (BackupAgent) cl.loadClass(data.appInfo.backupAgentName).newInstance();
-        } catch (Exception e) {
-            throw new RuntimeException("Unable to instantiate backup agent "
-                    + data.appInfo.backupAgentName + ": " + e.toString(), e);
-        }
-        
-        // set up the agent's context
-        try {
-            if (DEBUG_BACKUP) Log.v(TAG, "Initializing BackupAgent "
-                    + data.appInfo.backupAgentName);
-            
-            ApplicationContext context = new ApplicationContext();
-            context.init(packageInfo, null, this);
-            context.setOuterContext(agent);
-            agent.attach(context);
-            agent.onCreate();
+            IBinder binder = null;
+            try {
+                java.lang.ClassLoader cl = packageInfo.getClassLoader();
+                agent = (BackupAgent) cl.loadClass(data.appInfo.backupAgentName).newInstance();
+
+                // set up the agent's context
+                if (DEBUG_BACKUP) Log.v(TAG, "Initializing BackupAgent "
+                        + data.appInfo.backupAgentName);
+
+                ApplicationContext context = new ApplicationContext();
+                context.init(packageInfo, null, this);
+                context.setOuterContext(agent);
+                agent.attach(context);
+
+                agent.onCreate();
+                binder = agent.onBind();
+                mBackupAgents.put(packageName, agent);
+            } catch (Exception e) {
+                // If this is during restore, fail silently; otherwise go
+                // ahead and let the user see the crash.
+                Log.e(TAG, "Agent threw during creation: " + e);
+                if (data.backupMode != IApplicationThread.BACKUP_MODE_RESTORE) {
+                    throw e;
+                }
+                // falling through with 'binder' still null
+            }
 
             // tell the OS that we're live now
-            IBinder binder = agent.onBind();
             try {
                 ActivityManagerNative.getDefault().backupAgentCreated(packageName, binder);
             } catch (RemoteException e) {
                 // nothing to do.
             }
-            mBackupAgents.put(packageName, agent);
         } catch (Exception e) {
             throw new RuntimeException("Unable to create BackupAgent "
                     + data.appInfo.backupAgentName + ": " + e.toString(), e);
diff --git a/core/java/android/app/ApplicationContext.java b/core/java/android/app/ApplicationContext.java
index 38ea686..afb2fe9 100644
--- a/core/java/android/app/ApplicationContext.java
+++ b/core/java/android/app/ApplicationContext.java
@@ -1341,21 +1341,8 @@
         if (pi != null) {
             ApplicationContext c = new ApplicationContext();
             c.mRestricted = (flags & CONTEXT_RESTRICTED) == CONTEXT_RESTRICTED;
-            c.init(pi, null, mMainThread);
+            c.init(pi, null, mMainThread, mResources);
             if (c.mResources != null) {
-                Resources newRes = c.mResources;
-                if (mResources.getCompatibilityInfo().applicationScale !=
-                    newRes.getCompatibilityInfo().applicationScale) {
-                    DisplayMetrics dm = mMainThread.getDisplayMetricsLocked(false);
-                    c.mResources = new Resources(newRes.getAssets(), dm,
-                            newRes.getConfiguration(),
-                            mResources.getCompatibilityInfo().copy());
-                    if (DEBUG) {
-                        Log.d(TAG, "loaded context has different scaling. Using container's" +
-                                " compatiblity info:" + mResources.getDisplayMetrics());
-                    }
-
-                }
                 return c;
             }
         }
@@ -1417,8 +1404,24 @@
 
     final void init(ActivityThread.PackageInfo packageInfo,
             IBinder activityToken, ActivityThread mainThread) {
+        init(packageInfo, activityToken, mainThread, null);
+    }
+
+    final void init(ActivityThread.PackageInfo packageInfo,
+                IBinder activityToken, ActivityThread mainThread,
+                Resources container) {
         mPackageInfo = packageInfo;
         mResources = mPackageInfo.getResources(mainThread);
+
+        if (container != null && container.getCompatibilityInfo().applicationScale !=
+            mResources.getCompatibilityInfo().applicationScale) {
+            if (DEBUG) {
+                Log.d(TAG, "loaded context has different scaling. Using container's" +
+                        " compatiblity info:" + container.getDisplayMetrics());
+            }
+            mResources = mainThread.getTopLevelResources(
+                    mPackageInfo.getResDir(), container.getCompatibilityInfo().copy());
+        }
         mMainThread = mainThread;
         mContentResolver = new ApplicationContentResolver(this, mainThread);
 
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index b052c99..a3c6325 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -119,13 +119,15 @@
             data.enforceInterface(IApplicationThread.descriptor);
             Intent intent = Intent.CREATOR.createFromParcel(data);
             IBinder b = data.readStrongBinder();
+            int ident = data.readInt();
             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
             Bundle state = data.readBundle();
             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
             boolean notResumed = data.readInt() != 0;
             boolean isForward = data.readInt() != 0;
-            scheduleLaunchActivity(intent, b, info, state, ri, pi, notResumed, isForward);
+            scheduleLaunchActivity(intent, b, ident, info, state, ri, pi,
+                    notResumed, isForward);
             return true;
         }
         
@@ -442,7 +444,7 @@
         data.recycle();
     }
 
-    public final void scheduleLaunchActivity(Intent intent, IBinder token,
+    public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
             ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
     		List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)
     		throws RemoteException {
@@ -450,6 +452,7 @@
         data.writeInterfaceToken(IApplicationThread.descriptor);
         intent.writeToParcel(data, 0);
         data.writeStrongBinder(token);
+        data.writeInt(ident);
         info.writeToParcel(data, 0);
         data.writeBundle(state);
         data.writeTypedList(pendingResults);
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 222fe75..444f222 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -20,6 +20,7 @@
 
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.ComponentName;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
@@ -86,6 +87,7 @@
 
     private Message mCancelMessage;
     private Message mDismissMessage;
+    private Message mShowMessage;
 
     /**
      * Whether to cancel the dialog when a touch is received outside of the
@@ -140,7 +142,7 @@
         w.setWindowManager(mWindowManager, null, null);
         w.setGravity(Gravity.CENTER);
         mUiThread = Thread.currentThread();
-        mDismissCancelHandler = new DismissCancelHandler(this);
+        mListenersHandler = new ListenersHandler(this);
     }
 
     /**
@@ -235,6 +237,8 @@
         }
         mWindowManager.addView(mDecor, l);
         mShowing = true;
+
+        sendShowMessage();
     }
     
     /**
@@ -289,11 +293,20 @@
         }
     }
 
+    private void sendShowMessage() {
+        if (mShowMessage != null) {
+            // Obtain a new message so this dialog can be re-used
+            Message.obtain(mShowMessage).sendToTarget();
+        }
+    }
+
     // internal method to make sure mcreated is set properly without requiring
     // users to call through to super in onCreate
     void dispatchOnCreate(Bundle savedInstanceState) {
-        onCreate(savedInstanceState);
-        mCreated = true;
+        if (!mCreated) {
+            onCreate(savedInstanceState);
+            mCreated = true;
+        }
     }
 
     /**
@@ -772,8 +785,17 @@
      * This hook is called when the user signals the desire to start a search.
      */
     public boolean onSearchRequested() {
-        // not during dialogs, no.
-        return false;
+        final SearchManager searchManager = (SearchManager) mContext
+                .getSystemService(Context.SEARCH_SERVICE);
+
+        // associate search with owner activity if possible (otherwise it will default to
+        // global search).
+        final ComponentName appName = mOwnerActivity == null ? null
+                : mOwnerActivity.getComponentName();
+        final boolean globalSearch = (appName == null);
+        searchManager.startSearch(null, false, appName, null, globalSearch);
+        dismiss();
+        return true;
     }
 
 
@@ -888,7 +910,7 @@
      */
     public void setOnCancelListener(final OnCancelListener listener) {
         if (listener != null) {
-            mCancelMessage = mDismissCancelHandler.obtainMessage(CANCEL, listener);
+            mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener);
         } else {
             mCancelMessage = null;
         }
@@ -909,13 +931,26 @@
      */
     public void setOnDismissListener(final OnDismissListener listener) {
         if (listener != null) {
-            mDismissMessage = mDismissCancelHandler.obtainMessage(DISMISS, listener);
+            mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);
         } else {
             mDismissMessage = null;
         }
     }
 
     /**
+     * Sets a listener to be invoked when the dialog is shown.
+     *
+     * @hide Pending API council approval
+     */
+    public void setOnShowListener(OnShowListener listener) {
+        if (listener != null) {
+            mShowMessage = mListenersHandler.obtainMessage(SHOW, listener);
+        } else {
+            mShowMessage = null;
+        }
+    }
+
+    /**
      * Set a message to be sent when the dialog is dismissed.
      * @param msg The msg to send when the dialog is dismissed.
      */
@@ -949,13 +984,14 @@
 
     private static final int DISMISS = 0x43;
     private static final int CANCEL = 0x44;
+    private static final int SHOW = 0x45;
 
-    private Handler mDismissCancelHandler;
+    private Handler mListenersHandler;
 
-    private static final class DismissCancelHandler extends Handler {
+    private static final class ListenersHandler extends Handler {
         private WeakReference<DialogInterface> mDialog;
 
-        public DismissCancelHandler(Dialog dialog) {
+        public ListenersHandler(Dialog dialog) {
             mDialog = new WeakReference<DialogInterface>(dialog);
         }
 
@@ -968,6 +1004,9 @@
                 case CANCEL:
                     ((OnCancelListener) msg.obj).onCancel(mDialog.get());
                     break;
+                case SHOW:
+                    ((OnShowListener) msg.obj).onShow(mDialog.get());
+                    break;
             }
         }
     }
diff --git a/core/java/android/app/IActivityController.aidl b/core/java/android/app/IActivityController.aidl
new file mode 100644
index 0000000..8f6b252
--- /dev/null
+++ b/core/java/android/app/IActivityController.aidl
@@ -0,0 +1,55 @@
+/*
+**
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License"); 
+** you may not use this file except in compliance with the License. 
+** You may obtain a copy of the License at 
+**
+**     http://www.apache.org/licenses/LICENSE-2.0 
+**
+** Unless required by applicable law or agreed to in writing, software 
+** distributed under the License is distributed on an "AS IS" BASIS, 
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+** See the License for the specific language governing permissions and 
+** limitations under the License.
+*/
+
+package android.app;
+
+import android.content.Intent;
+
+/**
+ * Testing interface to monitor what is happening in the activity manager
+ * while tests are running.  Not for normal application development.
+ * {@hide}
+ */
+interface IActivityController
+{
+    /**
+     * The system is trying to start an activity.  Return true to allow
+     * it to be started as normal, or false to cancel/reject this activity.
+     */
+    boolean activityStarting(in Intent intent, String pkg);
+    
+    /**
+     * The system is trying to return to an activity.  Return true to allow
+     * it to be resumed as normal, or false to cancel/reject this activity.
+     */
+    boolean activityResuming(String pkg);
+    
+    /**
+     * An application process has crashed (in Java).  Return true for the
+     * normal error recovery (app crash dialog) to occur, false to kill
+     * it immediately.
+     */
+    boolean appCrashed(String processName, int pid, String shortMsg,
+            String longMsg, in byte[] crashData);
+    
+    /**
+     * An application process is not responding.  Return 0 to show the "app
+     * not responding" dialog, 1 to continue waiting, or -1 to kill it
+     * immediately.
+     */
+    int appNotResponding(String processName, int pid, String processStats);
+}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 3ec7938..95b376c 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -216,7 +216,7 @@
         String packageName, boolean waitForDebugger, boolean persistent)
         throws RemoteException;
     public void setAlwaysFinish(boolean enabled) throws RemoteException;
-    public void setActivityWatcher(IActivityWatcher watcher)
+    public void setActivityController(IActivityController watcher)
         throws RemoteException;
 
     public void enterSafeMode() throws RemoteException;
@@ -257,6 +257,16 @@
     public void stopAppSwitches() throws RemoteException;
     public void resumeAppSwitches() throws RemoteException;
     
+    public void registerActivityWatcher(IActivityWatcher watcher)
+            throws RemoteException;
+    public void unregisterActivityWatcher(IActivityWatcher watcher)
+            throws RemoteException;
+
+    public int startActivityInPackage(int uid,
+            Intent intent, String resolvedType, IBinder resultTo,
+            String resultWho, int requestCode, boolean onlyIfNeeded)
+            throws RemoteException;
+        
     /*
      * Private non-Binder interfaces
      */
@@ -372,7 +382,7 @@
     int CHECK_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+53;
     int GRANT_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+54;
     int REVOKE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+55;
-    int SET_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+56;
+    int SET_ACTIVITY_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+56;
     int SHOW_WAITING_FOR_DEBUGGER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+57;
     int SIGNAL_PERSISTENT_PROCESSES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+58;
     int GET_RECENT_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+59;
@@ -408,4 +418,7 @@
     int START_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+89;
     int BACKUP_AGENT_CREATED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+90;
     int UNBIND_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+91;
+    int REGISTER_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+92;
+    int UNREGISTER_ACTIVITY_WATCHER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+93;
+    int START_ACTIVITY_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94;
 }
diff --git a/core/java/android/app/IActivityWatcher.aidl b/core/java/android/app/IActivityWatcher.aidl
index f13a385..5d36e3f 100644
--- a/core/java/android/app/IActivityWatcher.aidl
+++ b/core/java/android/app/IActivityWatcher.aidl
@@ -1,6 +1,6 @@
-/* //device/java/android/android/app/IInstrumentationWatcher.aidl
+/*
 **
-** Copyright 2007, The Android Open Source Project
+** Copyright 2009, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License"); 
 ** you may not use this file except in compliance with the License. 
@@ -17,39 +17,10 @@
 
 package android.app;
 
-import android.content.Intent;
-
 /**
- * Testing interface to monitor what is happening in the activity manager
- * while tests are running.  Not for normal application development.
+ * Callback interface to watch the user's traversal through activities.
  * {@hide}
  */
-interface IActivityWatcher
-{
-    /**
-     * The system is trying to start an activity.  Return true to allow
-     * it to be started as normal, or false to cancel/reject this activity.
-     */
-    boolean activityStarting(in Intent intent, String pkg);
-    
-    /**
-     * The system is trying to return to an activity.  Return true to allow
-     * it to be resumed as normal, or false to cancel/reject this activity.
-     */
-    boolean activityResuming(String pkg);
-    
-    /**
-     * An application process has crashed (in Java).  Return true for the
-     * normal error recovery (app crash dialog) to occur, false to kill
-     * it immediately.
-     */
-    boolean appCrashed(String processName, int pid, String shortMsg,
-            String longMsg, in byte[] crashData);
-    
-    /**
-     * An application process is not responding.  Return 0 to show the "app
-     * not responding" dialog, 1 to continue waiting, or -1 to kill it
-     * immediately.
-     */
-    int appNotResponding(String processName, int pid, String processStats);
+oneway interface IActivityWatcher {
+    void activityResuming(int activityId);
 }
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index c0bc2a0..c915770 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -49,7 +49,7 @@
     void scheduleWindowVisibility(IBinder token, boolean showWindow) throws RemoteException;
     void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException;
     void scheduleSendResult(IBinder token, List<ResultInfo> results) throws RemoteException;
-    void scheduleLaunchActivity(Intent intent, IBinder token,
+    void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
             ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
     		List<Intent> pendingNewIntents, boolean notResumed, boolean isForward)
     		throws RemoteException;
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index e8bd60a..bd72544 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -34,10 +34,8 @@
             in ComponentName launchActivity,
             in Bundle appSearchData,
             boolean globalSearch,
-            ISearchManagerCallback searchManagerCallback);
+            ISearchManagerCallback searchManagerCallback,
+            int ident);
     void stopSearch();
     boolean isVisible();
-    Bundle onSaveInstanceState();
-    void onRestoreInstanceState(in Bundle savedInstanceState);
-    void onConfigurationChanged(in Configuration newConfig);
 }
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index fdb619a..27c6376 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -19,22 +19,19 @@
 import static android.app.SuggestionsAdapter.getColumnString;
 
 import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.SystemClock;
@@ -92,14 +89,13 @@
     private static final String INSTANCE_KEY_STORED_APPDATA = "sData";
     private static final String INSTANCE_KEY_PREVIOUS_COMPONENTS = "sPrev";
     private static final String INSTANCE_KEY_USER_QUERY = "uQry";
+    
+    // The extra key used in an intent to the speech recognizer for in-app voice search.
+    private static final String EXTRA_CALLING_PACKAGE = "calling_package";
 
     private static final int SEARCH_PLATE_LEFT_PADDING_GLOBAL = 12;
     private static final int SEARCH_PLATE_LEFT_PADDING_NON_GLOBAL = 7;
-    
-    // interaction with runtime
-    private IntentFilter mCloseDialogsFilter;
-    private IntentFilter mPackageFilter;
-    
+
     // views & widgets
     private TextView mBadgeLabel;
     private ImageView mAppIcon;
@@ -143,8 +139,8 @@
     
     // A weak map of drawables we've gotten from other packages, so we don't load them
     // more than once.
-    private final WeakHashMap<String, Drawable> mOutsideDrawablesCache =
-            new WeakHashMap<String, Drawable>();
+    private final WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache =
+            new WeakHashMap<String, Drawable.ConstantState>();
 
     // Last known IME options value for the search edit text.
     private int mSearchAutoCompleteImeOptions;
@@ -210,15 +206,7 @@
 
         // Touching outside of the search dialog will dismiss it 
         setCanceledOnTouchOutside(true);
-        
-        // Set up broadcast filters
-        mCloseDialogsFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-        mPackageFilter = new IntentFilter();
-        mPackageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        mPackageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-        mPackageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-        mPackageFilter.addDataScheme("package");
-        
+
         // Save voice intent for later queries/launching
         mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
         mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -333,16 +321,14 @@
         if (!globalSearch && mSearchable == null) {
             globalSearch = true;
             mSearchable = searchManager.getSearchableInfo(componentName, globalSearch);
-            
-            // If we still get back null (i.e., there's not even a searchable info available
-            // for global search), then really give up.
-            if (mSearchable == null) {
-                // Unfortunately, we can't log here.  it would be logspam every time the user
-                // clicks the "search" key on a non-search app.
-                return false;
-            }
         }
-        
+
+        // If there's not even a searchable info available for global search, then really give up.
+        if (mSearchable == null) {
+            Log.w(LOG_TAG, "No global search provider.");
+            return false;
+        }
+
         mLaunchComponent = componentName;
         mAppSearchData = appSearchData;
         // Using globalSearch here is just an optimization, just calling
@@ -351,16 +337,7 @@
         mActivityContext = mSearchable.getActivityContext(getContext());
         
         // show the dialog. this will call onStart().
-        if (!isShowing()) {
-            // First make sure the keyboard is showing (if needed), so that we get the right height
-            // for the dropdown to respect the IME.
-            if (getContext().getResources().getConfiguration().hardKeyboardHidden ==
-                Configuration.HARDKEYBOARDHIDDEN_YES) {
-                InputMethodManager inputManager = (InputMethodManager)
-                getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
-                        inputManager.showSoftInputUnchecked(0, null);
-            }
-            
+        if (!isShowing()) {            
             // The Dialog uses a ContextThemeWrapper for the context; use this to change the
             // theme out from underneath us, between the global search theme and the in-app
             // search theme. They are identical except that the global search theme does not
@@ -377,20 +354,10 @@
             }
             show();
         }
-
         updateUI();
         
         return true;
     }
-    
-    @Override
-    protected void onStart() {
-        super.onStart();
-        
-        // receive broadcasts
-        getContext().registerReceiver(mBroadcastReceiver, mCloseDialogsFilter);
-        getContext().registerReceiver(mBroadcastReceiver, mPackageFilter);
-    }
 
     /**
      * The search dialog is being dismissed, so handle all of the local shutdown operations.
@@ -401,14 +368,7 @@
     @Override
     public void onStop() {
         super.onStop();
-        
-        // stop receiving broadcasts (throws exception if none registered)
-        try {
-            getContext().unregisterReceiver(mBroadcastReceiver);
-        } catch (RuntimeException e) {
-            // This is OK - it just means we didn't have any registered
-        }
-        
+
         closeSuggestionsAdapter();
         
         // dump extra memory we're hanging on to
@@ -455,12 +415,15 @@
     /**
      * Save the minimal set of data necessary to recreate the search
      * 
-     * @return A bundle with the state of the dialog.
+     * @return A bundle with the state of the dialog, or {@code null} if the search
+     *         dialog is not showing.
      */
     @Override
     public Bundle onSaveInstanceState() {
+        if (!isShowing()) return null;
+
         Bundle bundle = new Bundle();
-        
+
         // setup info so I can recreate this particular search       
         bundle.putParcelable(INSTANCE_KEY_COMPONENT, mLaunchComponent);
         bundle.putBundle(INSTANCE_KEY_APPDATA, mAppSearchData);
@@ -483,6 +446,8 @@
      */
     @Override
     public void onRestoreInstanceState(Bundle savedInstanceState) {
+        if (savedInstanceState == null) return;
+
         ComponentName launchComponent = savedInstanceState.getParcelable(INSTANCE_KEY_COMPONENT);
         Bundle appSearchData = savedInstanceState.getBundle(INSTANCE_KEY_APPDATA);
         boolean globalSearch = savedInstanceState.getBoolean(INSTANCE_KEY_GLOBALSEARCH);
@@ -509,7 +474,7 @@
     /**
      * Called after resources have changed, e.g. after screen rotation or locale change.
      */
-    public void onConfigurationChanged(Configuration newConfig) {
+    public void onConfigurationChanged() {
         if (isShowing()) {
             // Redraw (resources may have changed)
             updateSearchButton();
@@ -524,6 +489,7 @@
      */
     private void updateUI() {
         if (mSearchable != null) {
+            mDecor.setVisibility(View.VISIBLE);
             updateSearchAutoComplete();
             updateSearchButton();
             updateSearchAppIcon();
@@ -733,7 +699,10 @@
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (DBG) Log.d(LOG_TAG, "onKeyDown(" + keyCode + "," + event + ")");
-        
+        if (mSearchable == null) {
+            return false;
+        }
+
         // handle back key to go back to previous searchable, etc.
         if (handleBackKey(keyCode, event)) {
             return true;
@@ -769,6 +738,9 @@
             if (DBG_LOG_TIMING) {
                 dbgLogTiming("onTextChanged()");
             }
+            if (mSearchable == null) {
+                return;
+            }
             updateWidgetState();
             if (!mSearchAutoComplete.isPerformingCompletion()) {
                 // The user changed the query, remember it.
@@ -777,7 +749,10 @@
         }
 
         public void afterTextChanged(Editable s) {
-            if (!mSearchAutoComplete.isPerformingCompletion()) {
+            if (mSearchable == null) {
+                return;
+            }
+            if (mSearchable.autoUrlDetect() && !mSearchAutoComplete.isPerformingCompletion()) {
                 // The user changed the query, check if it is a URL and if so change the search
                 // button in the soft keyboard to the 'Go' button.
                 int options = (mSearchAutoComplete.getImeOptions() & (~EditorInfo.IME_MASK_ACTION));
@@ -878,11 +853,13 @@
      * @return A completely-configured intent ready to send to the voice search activity
      */
     private Intent createVoiceAppSearchIntent(Intent baseIntent) {
+        ComponentName searchActivity = mSearchable.getSearchActivity();
+        
         // create the necessary intent to set up a search-and-forward operation
         // in the voice search system.   We have to keep the bundle separate,
         // because it becomes immutable once it enters the PendingIntent
         Intent queryIntent = new Intent(Intent.ACTION_SEARCH);
-        queryIntent.setComponent(mSearchable.getSearchActivity());
+        queryIntent.setComponent(searchActivity);
         PendingIntent pending = PendingIntent.getActivity(
                 getContext(), 0, queryIntent, PendingIntent.FLAG_ONE_SHOT);
         
@@ -922,6 +899,8 @@
         voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, prompt);
         voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language);
         voiceIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, maxResults);
+        voiceIntent.putExtra(EXTRA_CALLING_PACKAGE,
+                searchActivity == null ? null : searchActivity.toShortString());
         
         // Add the values that configure forwarding the results
         voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT, pending);
@@ -987,10 +966,11 @@
                         && event.getAction() == KeyEvent.ACTION_UP) {
                     v.cancelLongPress();
 
-                    // If this is a url entered by the user and we displayed the 'Go' button which
+                    // If this is a url entered by the user & we displayed the 'Go' button which
                     // the user clicked, launch the url instead of using it as a search query.
-                    if ((mSearchAutoCompleteImeOptions & EditorInfo.IME_MASK_ACTION)
-                            == EditorInfo.IME_ACTION_GO) {
+                    if (mSearchable.autoUrlDetect() &&
+                        (mSearchAutoCompleteImeOptions & EditorInfo.IME_MASK_ACTION)
+                                == EditorInfo.IME_ACTION_GO) {
                         Uri uri = Uri.parse(fixUrl(mSearchAutoComplete.getText().toString()));
                         Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -1012,35 +992,11 @@
             return false;
         }
     };
-        
-    /**
-     * When the ACTION_CLOSE_SYSTEM_DIALOGS intent is received, we should close ourselves 
-     * immediately, in order to allow a higher-priority UI to take over
-     * (e.g. phone call received).
-     * 
-     * When a package is added, removed or changed, our current context
-     * may no longer be valid.  This would only happen if a package is installed/removed exactly
-     * when the search bar is open.  So for now we're just going to close the search
-     * bar.  
-     * Anything fancier would require some checks to see if the user's context was still valid.
-     * Which would be messier.
-     */
-    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
-                cancel();
-            } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)
-                    || Intent.ACTION_PACKAGE_REMOVED.equals(action)
-                    || Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
-                cancel();
-            }
-        }
-    };
 
     @Override
-    public void cancel() {
+    public void hide() {
+        if (!isShowing()) return;
+
         // We made sure the IME was displayed, so also make sure it is closed
         // when we go away.
         InputMethodManager imm = (InputMethodManager)getContext()
@@ -1049,10 +1005,10 @@
             imm.hideSoftInputFromWindow(
                     getWindow().getDecorView().getWindowToken(), 0);
         }
-        
-        super.cancel();
+
+        super.hide();
     }
-    
+
     /**
      * React to the user typing while in the suggestions list. First, check for action
      * keys. If not handled, try refocusing regular characters into the EditText. 
@@ -1086,6 +1042,8 @@
                 mSearchAutoComplete.setSelection(selPoint);
                 mSearchAutoComplete.setListSelection(0);
                 mSearchAutoComplete.clearListSelection();
+                mSearchAutoComplete.ensureImeVisible();
+                
                 return true;
             }
             
@@ -1276,8 +1234,8 @@
     }
 
     /**
-     * Launches an intent and dismisses the search dialog (unless the intent
-     * is one of the special intents that modifies the state of the search dialog).
+     * Launches an intent, including any special intent handling.  Doesn't dismiss the dialog
+     * since that will be handled in {@link SearchDialogWrapper#performActivityResuming}
      */
     private void launchIntent(Intent intent) {
         if (intent == null) {
@@ -1286,8 +1244,15 @@
         if (handleSpecialIntent(intent)){
             return;
         }
-        dismiss();
+        Log.d(LOG_TAG, "launching " + intent);
         getContext().startActivity(intent);
+
+        // in global search mode, SearchDialogWrapper#performActivityResuming will handle hiding
+        // the dialog when the next activity starts, but for in-app search, we still need to
+        // dismiss the dialog.
+        if (!mGlobalSearchMode) {
+            dismiss();
+        }
     }
     
     /**
@@ -1580,7 +1545,22 @@
         @Override
         public void performCompletion() {
         }
-        
+
+        /**
+         * We override this method to be sure and show the soft keyboard if appropriate when
+         * the TextView has focus.
+         */
+        @Override
+        public void onWindowFocusChanged(boolean hasWindowFocus) {
+            super.onWindowFocusChanged(hasWindowFocus);
+
+            if (hasWindowFocus) {
+                InputMethodManager inputManager = (InputMethodManager)
+                        getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+                inputManager.showSoftInput(this, 0);
+            }
+        }
+                
         /**
          * We override this method so that we can allow a threshold of zero, which ACTV does not.
          */
@@ -1595,6 +1575,9 @@
          */
         @Override
         public boolean onKeyPreIme(int keyCode, KeyEvent event) {
+            if (mSearchDialog.mSearchable == null) {
+                return false;
+            }
             if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
                 if (mSearchDialog.backToPreviousComponent()) {
                     return true;
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index e5ba6a4..c98d966 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -20,7 +20,6 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.res.Configuration;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
@@ -1189,8 +1188,6 @@
     /**
      * Intent extra data key: This key will be used for the extra populated by the
      * {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column.
-     *
-     * {@hide}
      */
     public final static String EXTRA_DATA_KEY = "intent_extra_data_key";
 
@@ -1270,16 +1267,12 @@
      * result indicates the shortcut refers to a no longer valid sugggestion.
      *
      * @see #SUGGEST_COLUMN_SHORTCUT_ID
-     * 
-     * @hide pending API council approval
      */
     public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut";
     
     /**
      * MIME type for shortcut validation.  You'll use this in your suggestions content provider
      * in the getType() function.
-     *
-     * @hide pending API council approval
      */
     public final static String SHORTCUT_MIME_TYPE = 
             "vnd.android.cursor.item/vnd.android.search.suggest";
@@ -1390,9 +1383,7 @@
      * this element exists at the given row, this is the data that will be used when
      * forming the suggestion's intent. If not provided, the Intent's extra data field will be null.
      * This column allows suggestions to provide additional arbitrary data which will be included as
-     * an extra under the key EXTRA_DATA_KEY.
-     *
-     * @hide Pending API council approval.
+     * an extra under the key {@link #EXTRA_DATA_KEY}.
      */
     public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
     /**
@@ -1426,8 +1417,6 @@
      * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut.
      * Otherwise, the shortcut id will be used to check back for validation via
      * {@link #SUGGEST_URI_PATH_SHORTCUT}.
-     *
-     * @hide Pending API council approval.
      */
     public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
 
@@ -1444,8 +1433,6 @@
      * Column name for suggestions cursor. <i>Optional.</i> This column is used to specify
      * that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion
      * is being refreshed.
-     * 
-     * @hide Pending API council approval.
      */
     public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING =
             "suggest_spinner_while_refreshing";
@@ -1453,8 +1440,6 @@
     /**
      * Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion
      * should not be stored as a shortcut in global search.
-     *
-     * @hide Pending API council approval.
      */
     public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
 
@@ -1501,8 +1486,6 @@
      * Intent action for starting a web search provider's settings activity.
      * Web search providers should handle this intent if they have provider-specific
      * settings to implement.
-     * 
-     * @hide Pending API council approval.
      */
     public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS
             = "android.search.action.WEB_SEARCH_SETTINGS";
@@ -1511,11 +1494,17 @@
      * Intent action broadcasted to inform that the searchables list or default have changed.
      * Components should handle this intent if they cache any searchable data and wish to stay
      * up to date on changes.
-     *
-     * @hide Pending API council approval.
      */
     public final static String INTENT_ACTION_SEARCHABLES_CHANGED
             = "android.search.action.SEARCHABLES_CHANGED";
+    
+    /**
+     * Intent action broadcasted to inform that the search settings have changed in some way.
+     * Either searchables have been enabled or disabled, or a different web search provider
+     * has been chosen.
+     */
+    public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED
+            = "android.search.action.SETTINGS_CHANGED";
 
     /**
      * If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
@@ -1532,8 +1521,9 @@
 
     private final Context mContext;
 
+    private int mIdent;
+    
     // package private since they are used by the inner class SearchManagerCallback
-    /* package */ boolean mIsShowing = false;
     /* package */ final Handler mHandler;
     /* package */ OnDismissListener mDismissListener = null;
     /* package */ OnCancelListener mCancelListener = null;
@@ -1547,6 +1537,13 @@
                 ServiceManager.getService(Context.SEARCH_SERVICE));
     }
     
+    /*package*/ void setIdent(int ident) {
+        if (mIdent != 0) {
+            throw new IllegalStateException("mIdent already set");
+        }
+        mIdent = ident;
+    }
+    
     /**
      * Launch search UI.
      *
@@ -1592,13 +1589,12 @@
                             ComponentName launchActivity,
                             Bundle appSearchData,
                             boolean globalSearch) {
-        if (DBG) debug("startSearch(), mIsShowing=" + mIsShowing);
-        if (mIsShowing) return;
+        if (mIdent == 0) throw new IllegalArgumentException(
+                "Called from outside of an Activity context");
         try {
-            mIsShowing = true;
             // activate the search manager and start it up!
             mService.startSearch(initialQuery, selectInitialQuery, launchActivity, appSearchData,
-                    globalSearch, mSearchManagerCallback);
+                    globalSearch, mSearchManagerCallback, mIdent);
         } catch (RemoteException ex) {
             Log.e(TAG, "startSearch() failed: " + ex);
         }
@@ -1616,15 +1612,10 @@
      * @see #startSearch
      */
     public void stopSearch() {
-        if (DBG) debug("stopSearch(), mIsShowing=" + mIsShowing);
-        if (!mIsShowing) return;
+        if (DBG) debug("stopSearch()");
         try {
             mService.stopSearch();
-            // onDismiss will also clear this, but we do it here too since onDismiss() is
-            // called asynchronously.
-            mIsShowing = false;
         } catch (RemoteException ex) {
-            Log.e(TAG, "stopSearch() failed: " + ex);
         }
     }
 
@@ -1638,8 +1629,13 @@
      * @hide
      */
     public boolean isVisible() {
-        if (DBG) debug("isVisible(), mIsShowing=" + mIsShowing);
-        return mIsShowing;
+        if (DBG) debug("isVisible()");
+        try {
+            return mService.isVisible();
+        } catch (RemoteException e) {
+            Log.e(TAG, "isVisible() failed: " + e);
+            return false;
+        }
     }
 
     /**
@@ -1691,7 +1687,6 @@
         private final Runnable mFireOnDismiss = new Runnable() {
             public void run() {
                 if (DBG) debug("mFireOnDismiss");
-                mIsShowing = false;
                 if (mDismissListener != null) {
                     mDismissListener.onDismiss();
                 }
@@ -1701,7 +1696,6 @@
         private final Runnable mFireOnCancel = new Runnable() {
             public void run() {
                 if (DBG) debug("mFireOnCancel");
-                // doesn't need to clear mIsShowing since onDismiss() always gets called too
                 if (mCancelListener != null) {
                     mCancelListener.onCancel();
                 }
@@ -1720,69 +1714,21 @@
 
     }
 
-    // TODO: remove the DialogInterface interfaces from SearchManager.
-    // This changes the public API, so I'll do it in a separate change.
+    /**
+     * @deprecated This method is an obsolete internal implementation detail. Do not use.
+     */
     public void onCancel(DialogInterface dialog) {
         throw new UnsupportedOperationException();
     }
+
+    /**
+     * @deprecated This method is an obsolete internal implementation detail. Do not use.
+     */
     public void onDismiss(DialogInterface dialog) {
         throw new UnsupportedOperationException();
     }
 
     /**
-     * Saves the state of the search UI.
-     *
-     * @return A Bundle containing the state of the search dialog, or {@code null}
-     *         if the search UI is not visible.
-     *
-     * @hide
-     */
-    public Bundle saveSearchDialog() {
-        if (DBG) debug("saveSearchDialog(), mIsShowing=" + mIsShowing);
-        if (!mIsShowing) return null;
-        try {
-            return mService.onSaveInstanceState();
-        } catch (RemoteException ex) {
-            Log.e(TAG, "onSaveInstanceState() failed: " + ex);
-            return null;
-        }
-    }
-
-    /**
-     * Restores the state of the search dialog.
-     *
-     * @param searchDialogState Bundle to read the state from.
-     *
-     * @hide
-     */
-    public void restoreSearchDialog(Bundle searchDialogState) {
-        if (DBG) debug("restoreSearchDialog(" + searchDialogState + ")");
-        if (searchDialogState == null) return;
-        try {
-            mService.onRestoreInstanceState(searchDialogState);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "onRestoreInstanceState() failed: " + ex);
-        }
-    }
-
-    /**
-     * Update the search dialog after a configuration change.
-     *
-     * @param newConfig The new configuration.
-     *
-     * @hide
-     */
-    public void onConfigurationChanged(Configuration newConfig) {
-        if (DBG) debug("onConfigurationChanged(" + newConfig + "), mIsShowing=" + mIsShowing);
-        if (!mIsShowing) return;
-        try {
-            mService.onConfigurationChanged(newConfig);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "onConfigurationChanged() failed:" + ex);
-        }
-    }
-
-    /**
      * Gets information about a searchable activity. This method is static so that it can
      * be used from non-Activity contexts.
      *
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 49c94d1..593b7b7 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -16,28 +16,31 @@
 
 package android.app;
 
+import android.app.SearchManager.DialogCursorProtocol;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.res.Resources.NotFoundException;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.Canvas;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.server.search.SearchableInfo;
 import android.text.Html;
 import android.text.TextUtils;
-import android.util.DisplayMetrics;
 import android.util.Log;
-import android.util.TypedValue;
+import android.util.SparseArray;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AbsListView;
 import android.widget.ImageView;
 import android.widget.ResourceCursorAdapter;
 import android.widget.TextView;
-
-import static android.app.SearchManager.DialogCursorProtocol;
+import android.widget.Filter;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -58,7 +61,8 @@
     private SearchDialog mSearchDialog;
     private SearchableInfo mSearchable;
     private Context mProviderContext;
-    private WeakHashMap<String, Drawable> mOutsideDrawablesCache;
+    private WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache;
+    private SparseArray<Drawable.ConstantState> mBackgroundsCache;
     private boolean mGlobalSearchMode;
 
     // Cached column indexes, updated when the cursor changes.
@@ -87,8 +91,16 @@
     private final Runnable mStartSpinnerRunnable;
     private final Runnable mStopSpinnerRunnable;
 
-    public SuggestionsAdapter(Context context, SearchDialog searchDialog, SearchableInfo searchable,
-            WeakHashMap<String, Drawable> outsideDrawablesCache, boolean globalSearchMode) {
+    /**
+     * The amount of time we delay in the filter when the user presses the delete key.
+     * @see Filter#setDelayer(android.widget.Filter.Delayer).
+     */
+    private static final long DELETE_KEY_POST_DELAY = 500L;
+
+    public SuggestionsAdapter(Context context, SearchDialog searchDialog,
+            SearchableInfo searchable,
+            WeakHashMap<String, Drawable.ConstantState> outsideDrawablesCache,
+            boolean globalSearchMode) {
         super(context,
                 com.android.internal.R.layout.search_dropdown_item_icons_2line,
                 null,   // no initial cursor
@@ -102,6 +114,7 @@
         mProviderContext = mSearchable.getProviderContext(mContext, activityContext);
 
         mOutsideDrawablesCache = outsideDrawablesCache;
+        mBackgroundsCache = new SparseArray<Drawable.ConstantState>();
         mGlobalSearchMode = globalSearchMode;
 
         mStartSpinnerRunnable = new Runnable() {
@@ -115,6 +128,18 @@
                 mSearchDialog.setWorking(false);
             }
         };
+
+        // delay 500ms when deleting
+        getFilter().setDelayer(new Filter.Delayer() {
+
+            private int mPreviousLength = 0;
+
+            public long getPostingDelay(CharSequence constraint) {
+                long delay = constraint.length() < mPreviousLength ? DELETE_KEY_POST_DELAY : 0;
+                mPreviousLength = constraint.length();
+                return delay;
+            }
+        });
     }
 
     /**
@@ -252,7 +277,7 @@
      */
     @Override
     public View newView(Context context, Cursor cursor, ViewGroup parent) {
-        View v = new SuggestionItemView(context, cursor);
+        View v = super.newView(context, cursor, parent);
         v.setTag(new ChildViewCache(v));
         return v;
     }
@@ -297,13 +322,46 @@
         if (mBackgroundColorCol != -1) {
             backgroundColor = cursor.getInt(mBackgroundColorCol);
         }
-        ((SuggestionItemView)view).setColor(backgroundColor);
+        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);
-        setViewIcon(cursor, views.mIcon1, mIconName1Col);
-        setViewIcon(cursor, views.mIcon2, mIconName2Col);
+
+        if (views.mIcon1 != null) {
+            setViewDrawable(views.mIcon1, getIcon1(cursor));
+        }
+        if (views.mIcon2 != null) {
+            setViewDrawable(views.mIcon2, getIcon2(cursor));
+        }
+    }
+
+    /**
+     * Gets a drawable with no color when selected or pressed, and the given color when
+     * neither selected nor pressed.
+     *
+     * @return A drawable, or {@code null} if the given color is transparent.
+     */
+    private Drawable getItemBackground(int backgroundColor) {
+        if (backgroundColor == 0) {
+            return null;
+        } else {
+            Drawable.ConstantState cachedBg = mBackgroundsCache.get(backgroundColor);
+            if (cachedBg != null) {
+                if (DBG) Log.d(LOG_TAG, "Background cache hit for color " + backgroundColor);
+                return cachedBg.newDrawable();
+            }
+            if (DBG) Log.d(LOG_TAG, "Creating new background for color " + backgroundColor);
+            ColorDrawable transparent = new ColorDrawable(0);
+            ColorDrawable background = new ColorDrawable(backgroundColor);
+            StateListDrawable newBg = new StateListDrawable();
+            newBg.addState(new int[]{android.R.attr.state_selected}, transparent);
+            newBg.addState(new int[]{android.R.attr.state_pressed}, transparent);
+            newBg.addState(new int[]{}, background);
+            mBackgroundsCache.put(backgroundColor, newBg.getConstantState());
+            return newBg;
+        }
     }
 
     private void setViewText(Cursor cursor, TextView v, int textCol, boolean isHtml) {
@@ -313,7 +371,11 @@
         CharSequence text = null;
         if (textCol >= 0) {
             String str = cursor.getString(textCol);
-            text = (str != null && isHtml) ? Html.fromHtml(str) : str;
+            if (isHtml && looksLikeHtml(str)) {
+                text = Html.fromHtml(str);
+            } else {
+                text = str;
+            }
         }
         // Set the text even if it's null, since we need to clear any previous text.
         v.setText(text);
@@ -325,15 +387,40 @@
         }
     }
 
-    private void setViewIcon(Cursor cursor, ImageView v, int iconNameCol) {
-        if (v == null) {
-            return;
+    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;
         }
-        if (iconNameCol < 0) {
-            return;
+        return false;
+    }
+
+    private Drawable getIcon1(Cursor cursor) {
+        if (mIconName1Col < 0) {
+            return null;
         }
-        String value = cursor.getString(iconNameCol);
+        String value = cursor.getString(mIconName1Col);
         Drawable drawable = getDrawableFromResourceValue(value);
+        if (drawable != null) {
+            return drawable;
+        }
+        return getDefaultIcon1(cursor);
+    }
+
+    private Drawable getIcon2(Cursor cursor) {
+        if (mIconName2Col < 0) {
+            return null;
+        }
+        String value = cursor.getString(mIconName2Col);
+        return getDrawableFromResourceValue(value);
+    }
+
+    /**
+     * Sets the drawable in an image view, makes sure the view is only visible if there
+     * is a drawable.
+     */
+    private void setViewDrawable(ImageView v, Drawable drawable) {
         // Set the icon even if the drawable is null, since we need to clear any
         // previous icon.
         v.setImageDrawable(drawable);
@@ -437,12 +524,13 @@
         }
 
         // First, check the cache.
-        Drawable drawable = mOutsideDrawablesCache.get(drawableId);
-        if (drawable != null) {
+        Drawable.ConstantState cached = mOutsideDrawablesCache.get(drawableId);
+        if (cached != null) {
             if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + drawableId);
-            return drawable;
+            return cached.newDrawable();
         }
 
+        Drawable drawable = null;
         try {
             // Not cached, try using it as a plain resource ID in the provider's context.
             int resourceId = Integer.parseInt(drawableId);
@@ -474,9 +562,9 @@
             // If we got a drawable for this resource id, then stick it in the
             // map so we don't do this lookup again.
             if (drawable != null) {
-                mOutsideDrawablesCache.put(drawableId, drawable);
+                mOutsideDrawablesCache.put(drawableId, drawable.getConstantState());
             }
-        } catch (NotFoundException nfe) {
+        } catch (Resources.NotFoundException nfe) {
             if (DBG) Log.d(LOG_TAG, "Icon resource not found: " + drawableId);
             // drawable = null;
         }
@@ -485,6 +573,90 @@
     }
 
     /**
+     * Gets the left-hand side icon that will be used for the current suggestion
+     * if the suggestion contains an icon column but no icon or a broken icon.
+     *
+     * @param cursor A cursor positioned at the current suggestion.
+     * @return A non-null drawable.
+     */
+    private Drawable getDefaultIcon1(Cursor cursor) {
+        // First check the component that the suggestion is originally from
+        String c = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_INTENT_COMPONENT_NAME);
+        if (c != null) {
+            ComponentName component = ComponentName.unflattenFromString(c);
+            if (component != null) {
+                Drawable drawable = getActivityIconWithCache(component);
+                if (drawable != null) {
+                    return drawable;
+                }
+            } else {
+                Log.w(LOG_TAG, "Bad component name: " + c);
+            }
+        }
+
+        // Then check the component that gave us the suggestion
+        Drawable drawable = getActivityIconWithCache(mSearchable.getSearchActivity());
+        if (drawable != null) {
+            return drawable;
+        }
+
+        // Fall back to a default icon
+        return mContext.getPackageManager().getDefaultActivityIcon();
+    }
+
+    /**
+     * Gets the activity or application icon for an activity.
+     * Uses the local icon cache for fast repeated lookups.
+     *
+     * @param component Name of an activity.
+     * @return A drawable, or {@code null} if neither the activity nor the application
+     *         has an icon set.
+     */
+    private Drawable getActivityIconWithCache(ComponentName component) {
+        // First check the icon cache
+        String componentIconKey = component.flattenToShortString();
+        // Using containsKey() since we also store null values.
+        if (mOutsideDrawablesCache.containsKey(componentIconKey)) {
+            Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey);
+            return cached == null ? null : cached.newDrawable();
+        }
+        // Then try the activity or application icon
+        Drawable drawable = getActivityIcon(component);
+        // Stick it in the cache so we don't do this lookup again.
+        Drawable.ConstantState toCache = drawable == null ? null : drawable.getConstantState();
+        mOutsideDrawablesCache.put(componentIconKey, toCache);
+        return drawable;
+    }
+
+    /**
+     * Gets the activity or application icon for an activity.
+     *
+     * @param component Name of an activity.
+     * @return A drawable, or {@code null} if neither the acitivy or the application
+     *         have an icon set.
+     */
+    private Drawable getActivityIcon(ComponentName component) {
+        PackageManager pm = mContext.getPackageManager();
+        final ActivityInfo activityInfo;
+        try {
+            activityInfo = pm.getActivityInfo(component, PackageManager.GET_META_DATA);
+        } catch (NameNotFoundException ex) {
+            Log.w(LOG_TAG, ex.toString());
+            return null;
+        }
+        int iconId = activityInfo.getIconResource();
+        if (iconId == 0) return null;
+        String pkg = component.getPackageName();
+        Drawable drawable = pm.getDrawable(pkg, iconId, activityInfo.applicationInfo);
+        if (drawable == null) {
+            Log.w(LOG_TAG, "Invalid icon resource " + iconId + " for "
+                    + component.flattenToShortString());
+            return null;
+        }
+        return drawable;
+    }
+
+    /**
      * Gets the value of a string column by name.
      *
      * @param cursor Cursor to read the value from.
@@ -500,69 +672,4 @@
         return cursor.getString(col);
     }
 
-    /**
-     * A parent viewgroup class which holds the actual suggestion item as a child.
-     *
-     * The sole purpose of this class is to draw the given background color when the item is in
-     * normal state and not draw the background color when it is pressed, so that when pressed the
-     * list view's selection highlight will be displayed properly (if we draw our background it
-     * draws on top of the list view selection highlight).
-     */
-    private class SuggestionItemView extends ViewGroup {
-        private int mBackgroundColor;  // the background color to draw in normal state.
-        private View mView;  // the suggestion item's view.
-
-        protected SuggestionItemView(Context context, Cursor cursor) {
-            // Initialize ourselves
-            super(context);
-            mBackgroundColor = 0;  // transparent by default.
-
-            // For our layout use the default list item height from the current theme.
-            TypedValue lineHeight = new TypedValue();
-            context.getTheme().resolveAttribute(
-                    com.android.internal.R.attr.searchResultListItemHeight, lineHeight, true);
-            DisplayMetrics metrics = new DisplayMetrics();
-            metrics.setToDefaults();
-            AbsListView.LayoutParams layout = new AbsListView.LayoutParams(
-                    AbsListView.LayoutParams.FILL_PARENT,
-                    (int)lineHeight.getDimension(metrics));
-
-            setLayoutParams(layout);
-
-            // Initialize the child view
-            mView = SuggestionsAdapter.super.newView(context, cursor, this);
-            if (mView != null) {
-                addView(mView, layout.width, layout.height);
-                mView.setVisibility(View.VISIBLE);
-            }
-        }
-
-        public void setColor(int backgroundColor) {
-            mBackgroundColor = backgroundColor;
-        }
-
-        @Override
-        public void dispatchDraw(Canvas canvas) {
-            if (mBackgroundColor != 0 && !isPressed() && !isSelected()) {
-                canvas.drawColor(mBackgroundColor);
-            }
-            super.dispatchDraw(canvas);
-        }
-
-        @Override
-        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-            if (mView != null) {
-                mView.measure(widthMeasureSpec, heightMeasureSpec);
-            }
-        }
-
-        @Override
-        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-            if (mView != null) {
-                mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight());
-            }
-        }
-    }
-
 }
diff --git a/core/java/android/appwidget/AppWidgetProvider.java b/core/java/android/appwidget/AppWidgetProvider.java
index 26712a1..f1bbede 100755
--- a/core/java/android/appwidget/AppWidgetProvider.java
+++ b/core/java/android/appwidget/AppWidgetProvider.java
@@ -64,11 +64,9 @@
         }
         else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
             Bundle extras = intent.getExtras();
-            if (extras != null) {
-                int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
-                if (appWidgetIds != null && appWidgetIds.length > 0) {
-                    this.onDeleted(context, appWidgetIds);
-                }
+            if (extras != null && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
+                final int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
+                this.onDeleted(context, new int[] { appWidgetId });
             }
         }
         else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 8530c35..a2e0ba0a 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -57,6 +57,9 @@
      *
      * <p>This field corresponds to the <code>android:updatePeriodMillis</code> attribute in
      * the AppWidget meta-data file.
+     *
+     * <p class="note"><b>Note:</b> Updates requested with <code>updatePeriodMillis</code>
+     * will not be delivered more than once every 30 minutes.</p>
      */
     public int updatePeriodMillis;
 
diff --git a/core/java/android/backup/BackupManager.java b/core/java/android/backup/BackupManager.java
index 34a1a0c..c52fcd2d 100644
--- a/core/java/android/backup/BackupManager.java
+++ b/core/java/android/backup/BackupManager.java
@@ -42,6 +42,9 @@
 public class BackupManager {
     private static final String TAG = "BackupManager";
 
+    /** @hide TODO: REMOVE THIS */
+    public static final boolean EVEN_THINK_ABOUT_DOING_RESTORE = false;
+
     private Context mContext;
     private static IBackupManager sService;
 
@@ -70,6 +73,9 @@
      * {@link android.app.BackupAgent} subclass will be scheduled when you call this method.
      */
     public void dataChanged() {
+        if (!EVEN_THINK_ABOUT_DOING_RESTORE) {
+            return;
+        }
         checkServiceBinder();
         if (sService != null) {
             try {
@@ -89,6 +95,9 @@
      * permission if the package named in the argument is not the caller's own.
      */
     public static void dataChanged(String packageName) {
+        if (!EVEN_THINK_ABOUT_DOING_RESTORE) {
+            return;
+        }
         checkServiceBinder();
         if (sService != null) {
             try {
@@ -107,6 +116,9 @@
      * {@hide}
      */
     public IRestoreSession beginRestoreSession(String transport) {
+        if (!EVEN_THINK_ABOUT_DOING_RESTORE) {
+            return null;
+        }
         IRestoreSession binder = null;
         checkServiceBinder();
         if (sService != null) {
diff --git a/core/java/android/content/AbstractTableMerger.java b/core/java/android/content/AbstractTableMerger.java
index 9c760d9..9f609a3 100644
--- a/core/java/android/content/AbstractTableMerger.java
+++ b/core/java/android/content/AbstractTableMerger.java
@@ -369,30 +369,33 @@
                 // An existing server item has changed
                 // If serverSyncVersion is null, there is no edit URL;
                 // server won't let this change be written.
-                // Just hold onto it, I guess, in case the server permissions
-                // change later.
-                if (serverSyncVersion != null) {
-                    boolean recordChanged = (localSyncVersion == null) ||
-                            !serverSyncVersion.equals(localSyncVersion);
-                    if (recordChanged) {
-                        if (localSyncDirty) {
-                            if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                                Log.v(TAG, "remote record " + serverSyncId
-                                        + " conflicts with local _sync_id " + localSyncID
-                                        + ", local _id " + localRowId);
-                            }
-                            conflict = true;
-                        } else {
-                            if (Log.isLoggable(TAG, Log.VERBOSE)) {
-                                Log.v(TAG,
-                                        "remote record " +
-                                                serverSyncId +
-                                                " updates local _sync_id " +
-                                                localSyncID + ", local _id " +
-                                                localRowId);
-                            }
-                            update = true;
+                boolean recordChanged = (localSyncVersion == null) ||
+                        (serverSyncVersion == null) ||
+                        !serverSyncVersion.equals(localSyncVersion);
+                if (recordChanged) {
+                    if (localSyncDirty) {
+                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                            Log.v(TAG, "remote record " + serverSyncId
+                                    + " conflicts with local _sync_id " + localSyncID
+                                    + ", local _id " + localRowId);
                         }
+                        conflict = true;
+                    } else {
+                        if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                            Log.v(TAG,
+                                    "remote record " +
+                                            serverSyncId +
+                                            " updates local _sync_id " +
+                                            localSyncID + ", local _id " +
+                                            localRowId);
+                        }
+                        update = true;
+                    }
+                } else {
+                    if (Log.isLoggable(TAG, Log.VERBOSE)) {
+                        Log.v(TAG,
+                                "Skipping update: localSyncVersion: " + localSyncVersion +
+                                ", serverSyncVersion: " + serverSyncVersion);
                     }
                 }
             } else {
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 5cc5730..6b50405 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -17,6 +17,7 @@
 package android.content;
 
 import android.content.pm.PackageManager;
+import android.content.pm.PathPermission;
 import android.content.pm.ProviderInfo;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Configuration;
@@ -29,6 +30,7 @@
 import android.net.Uri;
 import android.os.Binder;
 import android.os.ParcelFileDescriptor;
+import android.os.Process;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -65,8 +67,10 @@
  */
 public abstract class ContentProvider implements ComponentCallbacks {
     private Context mContext = null;
+    private int mMyUid;
     private String mReadPermission;
     private String mWritePermission;
+    private PathPermission[] mPathPermissions;
 
     private Transport mTransport = new Transport();
 
@@ -108,24 +112,20 @@
         public IBulkCursor bulkQuery(Uri uri, String[] projection,
                 String selection, String[] selectionArgs, String sortOrder,
                 IContentObserver observer, CursorWindow window) {
-            checkReadPermission(uri);
+            enforceReadPermission(uri);
             Cursor cursor = ContentProvider.this.query(uri, projection,
                     selection, selectionArgs, sortOrder);
             if (cursor == null) {
                 return null;
             }
-            String wperm = getWritePermission();
             return new CursorToBulkCursorAdaptor(cursor, observer,
                     ContentProvider.this.getClass().getName(),
-                    wperm == null ||
-                    getContext().checkCallingOrSelfPermission(getWritePermission())
-                            == PackageManager.PERMISSION_GRANTED,
-                    window);
+                    hasWritePermission(uri), window);
         }
 
         public Cursor query(Uri uri, String[] projection,
                 String selection, String[] selectionArgs, String sortOrder) {
-            checkReadPermission(uri);
+            enforceReadPermission(uri);
             return ContentProvider.this.query(uri, projection, selection,
                     selectionArgs, sortOrder);
         }
@@ -136,55 +136,84 @@
 
 
         public Uri insert(Uri uri, ContentValues initialValues) {
-            checkWritePermission(uri);
+            enforceWritePermission(uri);
             return ContentProvider.this.insert(uri, initialValues);
         }
 
         public int bulkInsert(Uri uri, ContentValues[] initialValues) {
-            checkWritePermission(uri);
+            enforceWritePermission(uri);
             return ContentProvider.this.bulkInsert(uri, initialValues);
         }
 
         public int delete(Uri uri, String selection, String[] selectionArgs) {
-            checkWritePermission(uri);
+            enforceWritePermission(uri);
             return ContentProvider.this.delete(uri, selection, selectionArgs);
         }
 
         public int update(Uri uri, ContentValues values, String selection,
                 String[] selectionArgs) {
-            checkWritePermission(uri);
+            enforceWritePermission(uri);
             return ContentProvider.this.update(uri, values, selection, selectionArgs);
         }
 
         public ParcelFileDescriptor openFile(Uri uri, String mode)
                 throws FileNotFoundException {
-            if (mode != null && mode.startsWith("rw")) checkWritePermission(uri);
-            else checkReadPermission(uri);
+            if (mode != null && mode.startsWith("rw")) enforceWritePermission(uri);
+            else enforceReadPermission(uri);
             return ContentProvider.this.openFile(uri, mode);
         }
 
         public AssetFileDescriptor openAssetFile(Uri uri, String mode)
                 throws FileNotFoundException {
-            if (mode != null && mode.startsWith("rw")) checkWritePermission(uri);
-            else checkReadPermission(uri);
+            if (mode != null && mode.startsWith("rw")) enforceWritePermission(uri);
+            else enforceReadPermission(uri);
             return ContentProvider.this.openAssetFile(uri, mode);
         }
 
         public ISyncAdapter getSyncAdapter() {
-            checkWritePermission(null);
+            enforceWritePermission(null);
             SyncAdapter sa = ContentProvider.this.getSyncAdapter();
             return sa != null ? sa.getISyncAdapter() : null;
         }
 
-        private void checkReadPermission(Uri uri) {
+        private void enforceReadPermission(Uri uri) {
+            final int uid = Binder.getCallingUid();
+            if (uid == mMyUid) {
+                return;
+            }
+            
+            final Context context = getContext();
             final String rperm = getReadPermission();
             final int pid = Binder.getCallingPid();
-            final int uid = Binder.getCallingUid();
-            if (getContext().checkUriPermission(uri, rperm, null, pid, uid,
+            if (rperm == null
+                    || context.checkPermission(rperm, pid, uid)
+                    == PackageManager.PERMISSION_GRANTED) {
+                return;
+            }
+            
+            PathPermission[] pps = getPathPermissions();
+            if (pps != null) {
+                final String path = uri.getPath();
+                int i = pps.length;
+                while (i > 0) {
+                    i--;
+                    final PathPermission pp = pps[i];
+                    final String pprperm = pp.getReadPermission();
+                    if (pprperm != null && pp.match(path)) {
+                        if (context.checkPermission(pprperm, pid, uid)
+                                == PackageManager.PERMISSION_GRANTED) {
+                            return;
+                        }
+                    }
+                }
+            }
+            
+            if (context.checkUriPermission(uri, pid, uid,
                     Intent.FLAG_GRANT_READ_URI_PERMISSION)
                     == PackageManager.PERMISSION_GRANTED) {
                 return;
             }
+            
             String msg = "Permission Denial: reading "
                     + ContentProvider.this.getClass().getName()
                     + " uri " + uri + " from pid=" + Binder.getCallingPid()
@@ -193,20 +222,57 @@
             throw new SecurityException(msg);
         }
 
-        private void checkWritePermission(Uri uri) {
+        private boolean hasWritePermission(Uri uri) {
+            final int uid = Binder.getCallingUid();
+            if (uid == mMyUid) {
+                return true;
+            }
+            
+            final Context context = getContext();
             final String wperm = getWritePermission();
             final int pid = Binder.getCallingPid();
-            final int uid = Binder.getCallingUid();
-            if (getContext().checkUriPermission(uri, null, wperm, pid, uid,
+            if (wperm == null
+                    || context.checkPermission(wperm, pid, uid)
+                    == PackageManager.PERMISSION_GRANTED) {
+                return true;
+            }
+            
+            PathPermission[] pps = getPathPermissions();
+            if (pps != null) {
+                final String path = uri.getPath();
+                int i = pps.length;
+                while (i > 0) {
+                    i--;
+                    final PathPermission pp = pps[i];
+                    final String ppwperm = pp.getWritePermission();
+                    if (ppwperm != null && pp.match(path)) {
+                        if (context.checkPermission(ppwperm, pid, uid)
+                                == PackageManager.PERMISSION_GRANTED) {
+                            return true;
+                        }
+                    }
+                }
+            }
+            
+            if (context.checkUriPermission(uri, pid, uid,
                     Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                     == PackageManager.PERMISSION_GRANTED) {
+                return true;
+            }
+            
+            return false;
+        }
+        
+        private void enforceWritePermission(Uri uri) {
+            if (hasWritePermission(uri)) {
                 return;
             }
+            
             String msg = "Permission Denial: writing "
                     + ContentProvider.this.getClass().getName()
                     + " uri " + uri + " from pid=" + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid()
-                    + " requires " + wperm;
+                    + " requires " + getWritePermission();
             throw new SecurityException(msg);
         }
     }
@@ -266,6 +332,28 @@
     }
 
     /**
+     * Change the path-based permission required to read and/or write data in
+     * the content provider.  This is normally set for you from its manifest
+     * information when the provider is first created.
+     *
+     * @param permissions Array of path permission descriptions.
+     */
+    protected final void setPathPermissions(PathPermission[] permissions) {
+        mPathPermissions = permissions;
+    }
+
+    /**
+     * Return the path-based permissions required for read and/or write access to
+     * this content provider.  This method can be called from multiple
+     * threads, as described in
+     * <a href="{@docRoot}guide/topics/fundamentals.html#procthread">Application Fundamentals:
+     * Processes and Threads</a>.
+     */
+    public final PathPermission[] getPathPermissions() {
+        return mPathPermissions;
+    }
+
+    /**
      * Called when the provider is being started.
      *
      * @return true if the provider was successfully loaded, false otherwise
@@ -600,9 +688,11 @@
          */
         if (mContext == null) {
             mContext = context;
+            mMyUid = Process.myUid();
             if (info != null) {
                 setReadPermission(info.readPermission);
                 setWritePermission(info.writePermission);
+                setPathPermissions(info.pathPermissions);
             }
             ContentProvider.this.onCreate();
         }
diff --git a/core/java/android/content/DialogInterface.java b/core/java/android/content/DialogInterface.java
index 4afa294..9f1036e 100644
--- a/core/java/android/content/DialogInterface.java
+++ b/core/java/android/content/DialogInterface.java
@@ -92,6 +92,21 @@
     }
 
     /**
+     * Interface used to allow the creator of a dialog to run some code when the
+     * dialog is shown.
+     * @hide Pending API council approval
+     */
+    interface OnShowListener {
+        /**
+         * This method will be invoked when the dialog is shown.
+         *
+         * @param dialog The dialog that was shown will be passed into the
+         *            method.
+         */
+        public void onShow(DialogInterface dialog);
+    }
+
+    /**
      * Interface used to allow the creator of a dialog to run some code when an
      * item on the dialog is clicked..
      */
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 263f927..b0dbfcb 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1112,11 +1112,17 @@
 
     /**
      * Broadcast Action: Sent after the screen turns off.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF";
     /**
      * Broadcast Action: Sent after the screen turns on.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON";
@@ -1124,6 +1130,9 @@
     /**
      * Broadcast Action: Sent when the user is present after device wakes up (e.g when the
      * keyguard is gone).
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_USER_PRESENT= "android.intent.action.USER_PRESENT";
@@ -1134,6 +1143,9 @@
      * in manifests, only by exlicitly registering for it with
      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
      * Context.registerReceiver()}.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_TIME_TICK = "android.intent.action.TIME_TICK";
@@ -1152,6 +1164,9 @@
      * <ul>
      *   <li><em>time-zone</em> - The java.util.TimeZone.getID() value identifying the new time zone.</li>
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_TIMEZONE_CHANGED = "android.intent.action.TIMEZONE_CHANGED";
@@ -1177,6 +1192,9 @@
      * such as installing alarms.  You must hold the
      * {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission
      * in order to receive this broadcast.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
@@ -1190,6 +1208,9 @@
      * Broadcast Action: Trigger the download and eventual installation
      * of a package.
      * <p>Input: {@link #getData} is the URI of the package file to download.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL";
@@ -1203,6 +1224,9 @@
      * <li> {@link #EXTRA_REPLACING} is set to true if this is following
      * an {@link #ACTION_PACKAGE_REMOVED} broadcast for the same package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED";
@@ -1214,6 +1238,9 @@
      * <ul>
      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the new package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED";
@@ -1229,6 +1256,9 @@
      * <li> {@link #EXTRA_REPLACING} is set to true if this will be followed
      * by an {@link #ACTION_PACKAGE_ADDED} broadcast for the same package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
@@ -1238,6 +1268,9 @@
      * <ul>
      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED";
@@ -1251,6 +1284,9 @@
      * <ul>
      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED";
@@ -1263,12 +1299,18 @@
      * <ul>
      * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package.
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED";
     /**
      * Broadcast Action: A user ID has been removed from the system.  The user
      * ID number is stored in the extra data under {@link #EXTRA_UID}.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_UID_REMOVED = "android.intent.action.UID_REMOVED";
@@ -1287,6 +1329,9 @@
      * application to make sure it sees the new changes.  Some system code that
      * can not be restarted will need to watch for this action and handle it
      * appropriately.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      *
      * @see android.content.res.Configuration
      */
@@ -1298,15 +1343,21 @@
      *
      * <p class="note">
      * You can <em>not</em> receive this through components declared
-     * in manifests, only by exlicitly registering for it with
+     * in manifests, only by explicitly registering for it with
      * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)
      * Context.registerReceiver()}.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
     /**
      * Broadcast Action:  Indicates low battery condition on the device.
      * This broadcast corresponds to the "Low battery warning" system dialog.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
@@ -1314,6 +1365,9 @@
      * Broadcast Action:  Indicates the battery is now okay after being low.
      * This will be sent after {@link #ACTION_BATTERY_LOW} once the battery has
      * gone back up to an okay state.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
@@ -1323,6 +1377,9 @@
      * Unlike ACTION_BATTERY_CHANGED, applications will be woken for this and so do not have to
      * stay active to receive this notification.  This action can be used to implement actions
      * that wait until power is available to trigger.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_POWER_CONNECTED = "android.intent.action.ACTION_POWER_CONNECTED";
@@ -1332,6 +1389,9 @@
      * Unlike ACTION_BATTERY_CHANGED, applications will be woken for this and so do not have to
      * stay active to receive this notification.  This action can be used to implement actions
      * that wait until power is available to trigger.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_POWER_DISCONNECTED = "android.intent.action.ACTION_POWER_DISCONNECTED";
@@ -1341,16 +1401,25 @@
      * off, not sleeping).  Once the broadcast is complete, the final shutdown
      * will proceed and all unsaved data lost.  Apps will not normally need
      * to handle this, since the forground activity will be paused as well.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_SHUTDOWN = "android.intent.action.ACTION_SHUTDOWN";
     /**
      * Broadcast Action:  Indicates low memory condition on the device
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_DEVICE_STORAGE_LOW = "android.intent.action.DEVICE_STORAGE_LOW";
     /**
      * Broadcast Action:  Indicates low memory condition on the device no longer exists
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_DEVICE_STORAGE_OK = "android.intent.action.DEVICE_STORAGE_OK";
@@ -1515,6 +1584,9 @@
      *   then cell radio and possibly other radios such as bluetooth or WiFi may have also been
      *   turned off</li>
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_AIRPLANE_MODE_CHANGED = "android.intent.action.AIRPLANE_MODE";
@@ -1593,6 +1665,9 @@
      * <p>You must hold the
      * {@link android.Manifest.permission#PROCESS_OUTGOING_CALLS}
      * permission to receive this Intent.</p>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_NEW_OUTGOING_CALL =
@@ -1601,14 +1676,54 @@
     /**
      * Broadcast Action: Have the device reboot.  This is only for use by
      * system code.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     public static final String ACTION_REBOOT =
             "android.intent.action.REBOOT";
+    /**
+     * Broadcast Action: Triggers the platform Text-To-Speech engine to
+     * start the activity that installs the resource files on the device
+     * that are required for TTS to be operational. Since the installation
+     * of the data can be interrupted or declined by the user, the application
+     * shouldn't expect successful installation upon return from that intent,
+     * and if need be, should check installation status with 
+     * {@link #ACTION_TTS_CHECK_TTS_DATA}.
+     */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_TTS_INSTALL_TTS_DATA =
+            "android.intent.action.INSTALL_TTS_DATA";
 
     /**
-     * @hide
-     * TODO: This will be unhidden in a later CL.
+     * Broadcast Action: Starts the activity from the platform Text-To-Speech
+     * engine to verify the proper installation and availability of the
+     * resource files on the system. Upon completion, the activity will
+     * return one of the following codes: 
+     * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_PASS},
+     * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_FAIL},
+     * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_BAD_DATA},
+     * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_MISSING_DATA}, or
+     * {@link android.speech.tts.TextToSpeech.Engine#CHECK_VOICE_DATA_MISSING_VOLUME}.
+     * <p> Moreover, the data received in the activity result will contain the following
+     * fields:
+     * <ul>
+     *   <li>{@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_ROOT_DIRECTORY} which
+     *       indicates the path to the location of the resource files</li>,
+     *   <li>{@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_FILES} which contains
+     *       the list of all the resource files</li>,
+     *   <li>and {@link android.speech.tts.TextToSpeech.Engine#VOICE_DATA_FILES_INFO} which
+     *       contains, for each resource file, the description of the language covered by
+     *       the file in the xxx-YYY format, where xxx is the 3-letter ISO language code,
+     *       and YYY is the 3-letter ISO country code.</li>
+     * </ul>
+     */
+    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+    public static final String ACTION_TTS_CHECK_TTS_DATA =
+            "android.intent.action.CHECK_TTS_DATA";
+
+    /**
      * Broadcast Action: The TextToSpeech synthesizer has completed processing 
      * all of the text in the speech queue.
      */
diff --git a/core/java/android/content/SyncStorageEngine.java b/core/java/android/content/SyncStorageEngine.java
index f781e0d0..756f35c 100644
--- a/core/java/android/content/SyncStorageEngine.java
+++ b/core/java/android/content/SyncStorageEngine.java
@@ -338,6 +338,7 @@
                 }
                 reports.add(mChangeListeners.getBroadcastItem(i));
             }
+            mChangeListeners.finishBroadcast();
         }
         
         if (DEBUG) Log.v(TAG, "reportChange " + which + " to: " + reports);
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index bcf95b6..28a77a5 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -173,7 +173,7 @@
      * {@hide}
      */
     public static final int ANY_DENSITY = -1;
-    private static final int[] ANY_DENSITIES_ARRAY = { ANY_DENSITY };
+    static final int[] ANY_DENSITIES_ARRAY = { ANY_DENSITY };
 
     /**
      * Flags associated with the application.  Any combination of
@@ -399,7 +399,8 @@
      * @hide
      */
     public void disableCompatibilityMode() {
-        flags |= FLAG_SUPPORTS_LARGE_SCREENS;
+        flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
+                FLAG_SUPPORTS_SMALL_SCREENS);
         supportsDensities = ANY_DENSITIES_ARRAY;
     }
 }
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index bf2a895..e587ca7 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -71,6 +71,8 @@
     
     void removePermission(String name);
     
+    boolean isProtectedBroadcast(String actionName);
+    
     int checkSignatures(String pkg1, String pkg2);
     
     String[] getPackagesForUid(int uid);
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 558b0c3..39c27aa9 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -92,6 +92,8 @@
     private static final Object mSync = new Object();
     private static WeakReference<byte[]> mReadBuffer;
 
+    private static boolean sCompatibilityModeEnabled = true; 
+
     static class ParsePackageItemArgs {
         final Package owner;
         final String[] outError;
@@ -720,7 +722,7 @@
                 sa.recycle();
 
                 if (name != null && !pkg.requestedPermissions.contains(name)) {
-                    pkg.requestedPermissions.add(name);
+                    pkg.requestedPermissions.add(name.intern());
                 }
 
                 XmlUtils.skipCurrentTag(parser);
@@ -851,21 +853,6 @@
 
                 XmlUtils.skipCurrentTag(parser);
 
-            } else if (tagName.equals("instrumentation")) {
-                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
-                    return null;
-                }
-            } else if (tagName.equals("eat-comment")) {
-                // Just skip this tag
-                XmlUtils.skipCurrentTag(parser);
-                continue;
-            } else if (RIGID_PARSER) {
-                outError[0] = "Bad element under <manifest>: "
-                    + parser.getName();
-                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
-                return null;
-
-
             } else if (tagName.equals("supports-density")) {
                 sa = res.obtainAttributes(attrs,
                         com.android.internal.R.styleable.AndroidManifestSupportsDensity);
@@ -900,6 +887,43 @@
                 sa.recycle();
                 
                 XmlUtils.skipCurrentTag(parser);
+                
+            } else if (tagName.equals("protected-broadcast")) {
+                sa = res.obtainAttributes(attrs,
+                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast);
+
+                String name = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name);
+
+                sa.recycle();
+
+                if (name != null && (flags&PARSE_IS_SYSTEM) != 0) {
+                    if (pkg.protectedBroadcasts == null) {
+                        pkg.protectedBroadcasts = new ArrayList<String>();
+                    }
+                    if (!pkg.protectedBroadcasts.contains(name)) {
+                        pkg.protectedBroadcasts.add(name.intern());
+                    }
+                }
+
+                XmlUtils.skipCurrentTag(parser);
+                
+            } else if (tagName.equals("instrumentation")) {
+                if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) {
+                    return null;
+                }
+                
+            } else if (tagName.equals("eat-comment")) {
+                // Just skip this tag
+                XmlUtils.skipCurrentTag(parser);
+                continue;
+                
+            } else if (RIGID_PARSER) {
+                outError[0] = "Bad element under <manifest>: "
+                    + parser.getName();
+                mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
+                return null;
+
             } else {
                 Log.w(TAG, "Bad element under <manifest>: "
                       + parser.getName());
@@ -945,15 +969,25 @@
                         >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) {
             pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS;
         }
-        
+        int densities[] = null;
         int size = pkg.supportsDensityList.size();
         if (size > 0) {
-            int densities[] = pkg.supportsDensities = new int[size];
+            densities = pkg.supportsDensities = new int[size];
             List<Integer> densityList = pkg.supportsDensityList;
             for (int i = 0; i < size; i++) {
                 densities[i] = densityList.get(i);
             }
         }
+        /**
+         * TODO: enable this before code freeze. b/1967935
+         * *
+        if ((densities == null || densities.length == 0)
+                && (pkg.applicationInfo.targetSdkVersion
+                        >= android.os.Build.VERSION_CODES.CUR_DEVELOPMENT)) {
+            pkg.supportsDensities = ApplicationInfo.ANY_DENSITIES_ARRAY;
+        }
+         */
+
         return pkg;
     }
 
@@ -1419,7 +1453,7 @@
                 sa.recycle();
 
                 if (lname != null && !owner.usesLibraries.contains(lname)) {
-                    owner.usesLibraries.add(lname);
+                    owner.usesLibraries.add(lname.intern());
                 }
 
                 XmlUtils.skipCurrentTag(parser);
@@ -1908,6 +1942,7 @@
                         outInfo.metaData, outError)) == null) {
                     return false;
                 }
+                
             } else if (parser.getName().equals("grant-uri-permission")) {
                 TypedArray sa = res.obtainAttributes(attrs,
                         com.android.internal.R.styleable.AndroidManifestGrantUriPermission);
@@ -1931,7 +1966,7 @@
                 if (str != null) {
                     pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB);
                 }
-
+                
                 sa.recycle();
 
                 if (pa != null) {
@@ -1946,6 +1981,101 @@
                         outInfo.info.uriPermissionPatterns = newp;
                     }
                     outInfo.info.grantUriPermissions = true;
+                } else {
+                    if (!RIGID_PARSER) {
+                        Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
+                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>");
+                        XmlUtils.skipCurrentTag(parser);
+                        continue;
+                    }
+                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
+                    return false;
+                }
+                XmlUtils.skipCurrentTag(parser);
+
+            } else if (parser.getName().equals("path-permission")) {
+                TypedArray sa = res.obtainAttributes(attrs,
+                        com.android.internal.R.styleable.AndroidManifestPathPermission);
+
+                PathPermission pa = null;
+
+                String permission = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_permission);
+                String readPermission = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission);
+                if (readPermission == null) {
+                    readPermission = permission;
+                }
+                String writePermission = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission);
+                if (writePermission == null) {
+                    writePermission = permission;
+                }
+                
+                boolean havePerm = false;
+                if (readPermission != null) {
+                    readPermission = readPermission.intern();
+                    havePerm = true;
+                }
+                if (writePermission != null) {
+                    writePermission = readPermission.intern();
+                    havePerm = true;
+                }
+
+                if (!havePerm) {
+                    if (!RIGID_PARSER) {
+                        Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
+                        Log.w(TAG, "No readPermission or writePermssion for <path-permission>");
+                        XmlUtils.skipCurrentTag(parser);
+                        continue;
+                    }
+                    outError[0] = "No readPermission or writePermssion for <path-permission>";
+                    return false;
+                }
+                
+                String path = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_path);
+                if (path != null) {
+                    pa = new PathPermission(path,
+                            PatternMatcher.PATTERN_LITERAL, readPermission, writePermission);
+                }
+
+                path = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix);
+                if (path != null) {
+                    pa = new PathPermission(path,
+                            PatternMatcher.PATTERN_PREFIX, readPermission, writePermission);
+                }
+
+                path = sa.getNonResourceString(
+                        com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern);
+                if (path != null) {
+                    pa = new PathPermission(path,
+                            PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission);
+                }
+
+                sa.recycle();
+
+                if (pa != null) {
+                    if (outInfo.info.pathPermissions == null) {
+                        outInfo.info.pathPermissions = new PathPermission[1];
+                        outInfo.info.pathPermissions[0] = pa;
+                    } else {
+                        final int N = outInfo.info.pathPermissions.length;
+                        PathPermission[] newp = new PathPermission[N+1];
+                        System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N);
+                        newp[N] = pa;
+                        outInfo.info.pathPermissions = newp;
+                    }
+                } else {
+                    if (!RIGID_PARSER) {
+                        Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":");
+                        Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>");
+                        XmlUtils.skipCurrentTag(parser);
+                        continue;
+                    }
+                    outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>";
+                    return false;
                 }
                 XmlUtils.skipCurrentTag(parser);
 
@@ -2104,8 +2234,8 @@
             return null;
         }
 
-        boolean success = true;
-
+        name = name.intern();
+        
         TypedValue v = sa.peekValue(
                 com.android.internal.R.styleable.AndroidManifestMetaData_resource);
         if (v != null && v.resourceId != 0) {
@@ -2118,7 +2248,7 @@
             if (v != null) {
                 if (v.type == TypedValue.TYPE_STRING) {
                     CharSequence cs = v.coerceToString();
-                    data.putString(name, cs != null ? cs.toString() : null);
+                    data.putString(name, cs != null ? cs.toString().intern() : null);
                 } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) {
                     data.putBoolean(name, v.data != 0);
                 } else if (v.type >= TypedValue.TYPE_FIRST_INT
@@ -2299,6 +2429,8 @@
 
         public final ArrayList<String> requestedPermissions = new ArrayList<String>();
 
+        public ArrayList<String> protectedBroadcasts;
+        
         public final ArrayList<String> usesLibraries = new ArrayList<String>();
         public String[] usesLibraryFiles = null;
 
@@ -2499,6 +2631,11 @@
     public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
         if (p == null) return null;
         if (!copyNeeded(flags, p, null)) {
+            // CompatibilityMode is global state. It's safe to modify the instance
+            // of the package.
+            if (!sCompatibilityModeEnabled) {
+                p.applicationInfo.disableCompatibilityMode();
+            }
             return p.applicationInfo;
         }
 
@@ -2513,6 +2650,9 @@
         if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
             ai.supportsDensities = p.supportsDensities;
         }
+        if (!sCompatibilityModeEnabled) {
+            ai.disableCompatibilityMode();
+        }
         return ai;
     }
 
@@ -2697,4 +2837,11 @@
                 + " " + service.info.name + "}";
         }
     }
+
+    /**
+     * @hide
+     */
+    public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
+        sCompatibilityModeEnabled = compatibilityModeEnabled;
+    }
 }
diff --git a/core/java/android/content/pm/PathPermission.java b/core/java/android/content/pm/PathPermission.java
new file mode 100644
index 0000000..7e49d7d
--- /dev/null
+++ b/core/java/android/content/pm/PathPermission.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.PatternMatcher;
+
+/**
+ * Description of permissions needed to access a particular path
+ * in a {@link ProviderInfo}.
+ */
+public class PathPermission extends PatternMatcher {
+    private final String mReadPermission;
+    private final String mWritePermission;
+    
+    public PathPermission(String pattern, int type, String readPermission,
+            String writePermission) {
+        super(pattern, type);
+        mReadPermission = readPermission;
+        mWritePermission = writePermission;
+    }
+    
+    public String getReadPermission() {
+        return mReadPermission;
+    }
+    
+    public String getWritePermission() {
+        return mWritePermission;
+    }
+    
+    public void writeToParcel(Parcel dest, int flags) {
+        super.writeToParcel(dest, flags);
+        dest.writeString(mReadPermission);
+        dest.writeString(mWritePermission);
+    }
+    
+    public PathPermission(Parcel src) {
+        super(src);
+        mReadPermission = src.readString();
+        mWritePermission = src.readString();
+    }
+    
+    public static final Parcelable.Creator<PathPermission> CREATOR
+            = new Parcelable.Creator<PathPermission>() {
+        public PathPermission createFromParcel(Parcel source) {
+            return new PathPermission(source);
+        }
+
+        public PathPermission[] newArray(int size) {
+            return new PathPermission[size];
+        }
+    };
+}
\ No newline at end of file
diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java
index b67ddf6..d01460e 100644
--- a/core/java/android/content/pm/ProviderInfo.java
+++ b/core/java/android/content/pm/ProviderInfo.java
@@ -28,6 +28,7 @@
  */
 public final class ProviderInfo extends ComponentInfo
         implements Parcelable {
+    
     /** The name provider is published under content:// */
     public String authority = null;
     
@@ -56,6 +57,14 @@
      */
     public PatternMatcher[] uriPermissionPatterns = null;
     
+    /**
+     * If non-null, these are path-specific permissions that are allowed for
+     * accessing the provider.  Any permissions listed here will allow a
+     * holding client to access the provider, and the provider will check
+     * the URI it provides when making calls against the patterns here.
+     */
+    public PathPermission[] pathPermissions = null;
+    
     /** If true, this content provider allows multiple instances of itself
      *  to run in different process.  If false, a single instances is always
      *  run in {@link #processName}. */
@@ -78,6 +87,7 @@
         writePermission = orig.writePermission;
         grantUriPermissions = orig.grantUriPermissions;
         uriPermissionPatterns = orig.uriPermissionPatterns;
+        pathPermissions = orig.pathPermissions;
         multiprocess = orig.multiprocess;
         initOrder = orig.initOrder;
         isSyncable = orig.isSyncable;
@@ -94,6 +104,7 @@
         out.writeString(writePermission);
         out.writeInt(grantUriPermissions ? 1 : 0);
         out.writeTypedArray(uriPermissionPatterns, parcelableFlags);
+        out.writeTypedArray(pathPermissions, parcelableFlags);
         out.writeInt(multiprocess ? 1 : 0);
         out.writeInt(initOrder);
         out.writeInt(isSyncable ? 1 : 0);
@@ -122,6 +133,7 @@
         writePermission = in.readString();
         grantUriPermissions = in.readInt() != 0;
         uriPermissionPatterns = in.createTypedArray(PatternMatcher.CREATOR);
+        pathPermissions = in.createTypedArray(PathPermission.CREATOR);
         multiprocess = in.readInt() != 0;
         initOrder = in.readInt();
         isSyncable = in.readInt() != 0;
diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java
index dfe304d..6e34cc8 100644
--- a/core/java/android/content/res/CompatibilityInfo.java
+++ b/core/java/android/content/res/CompatibilityInfo.java
@@ -38,7 +38,12 @@
     private static final String TAG = "CompatibilityInfo";
     
     /** default compatibility info object for compatible applications */
-    public static final CompatibilityInfo DEFAULT_COMPATIBILITY_INFO = new CompatibilityInfo(); 
+    public static final CompatibilityInfo DEFAULT_COMPATIBILITY_INFO = new CompatibilityInfo() {
+        @Override
+        public void setExpandable(boolean expandable) {
+            throw new UnsupportedOperationException("trying to change default compatibility info");
+        }
+    };
 
     /**
      * The default width of the screen in portrait mode. 
@@ -51,18 +56,6 @@
     public static final int DEFAULT_PORTRAIT_HEIGHT = 480;
 
     /**
-     * The x-shift mode that controls the position of the content or the window under
-     * compatibility mode.
-     * {@see getTranslator}
-     * {@see Translator#mShiftMode}
-     */
-    private static final int X_SHIFT_NONE = 0;
-    private static final int X_SHIFT_CONTENT = 1;
-    private static final int X_SHIFT_AND_CLIP_CONTENT = 2;
-    private static final int X_SHIFT_WINDOW = 3;
-
-
-    /**
      *  A compatibility flags
      */
     private int mCompatibilityFlags;
@@ -92,6 +85,11 @@
     private static final int SCALING_EXPANDABLE_MASK = SCALING_REQUIRED | EXPANDABLE;
 
     /**
+     * The effective screen density we have selected for this application.
+     */
+    public final int applicationDensity;
+    
+    /**
      * Application's scale.
      */
     public final float applicationScale;
@@ -106,20 +104,6 @@
      */
     public final int appFlags;
     
-    /**
-     * Window size in Compatibility Mode, in real pixels. This is updated by
-     * {@link DisplayMetrics#updateMetrics}.
-     */
-    private int mWidth;
-    private int mHeight;
-    
-    /**
-     * The x offset to center the window content. In X_SHIFT_WINDOW mode, the offset is added
-     * to the window's layout. In X_SHIFT_CONTENT/X_SHIFT_AND_CLIP_CONTENT mode, the offset
-     * is used to translate the Canvas.
-     */
-    private int mXOffset;
-
     public CompatibilityInfo(ApplicationInfo appInfo) {
         appFlags = appInfo.flags;
         
@@ -128,40 +112,49 @@
         }
         
         float packageDensityScale = -1.0f;
+        int packageDensity = 0;
         if (appInfo.supportsDensities != null) {
             int minDiff = Integer.MAX_VALUE;
             for (int density : appInfo.supportsDensities) {
-                if (density == ApplicationInfo.ANY_DENSITY) { 
+                if (density == ApplicationInfo.ANY_DENSITY) {
+                    packageDensity = DisplayMetrics.DENSITY_DEVICE;
                     packageDensityScale = 1.0f;
                     break;
                 }
-                int tmpDiff = Math.abs(DisplayMetrics.DEVICE_DENSITY - density);
+                int tmpDiff = Math.abs(DisplayMetrics.DENSITY_DEVICE - density);
                 if (tmpDiff == 0) {
+                    packageDensity = DisplayMetrics.DENSITY_DEVICE;
                     packageDensityScale = 1.0f;
                     break;
                 }
                 // prefer higher density (appScale>1.0), unless that's only option.
                 if (tmpDiff < minDiff && packageDensityScale < 1.0f) {
-                    packageDensityScale = DisplayMetrics.DEVICE_DENSITY / (float) density;
+                    packageDensity = density;
+                    packageDensityScale = DisplayMetrics.DENSITY_DEVICE / (float) density;
                     minDiff = tmpDiff;
                 }
             }
         }
         if (packageDensityScale > 0.0f) {
+            applicationDensity = packageDensity;
             applicationScale = packageDensityScale;
         } else {
+            applicationDensity = DisplayMetrics.DENSITY_DEFAULT;
             applicationScale =
-                    DisplayMetrics.DEVICE_DENSITY / (float) DisplayMetrics.DEFAULT_DENSITY;
+                    DisplayMetrics.DENSITY_DEVICE / (float) DisplayMetrics.DENSITY_DEFAULT;
         }
+
         applicationInvertedScale = 1.0f / applicationScale;
         if (applicationScale != 1.0f) {
             mCompatibilityFlags |= SCALING_REQUIRED;
         }
     }
 
-    private CompatibilityInfo(int appFlags, int compFlags, float scale, float invertedScale) {
+    private CompatibilityInfo(int appFlags, int compFlags,
+            int dens, float scale, float invertedScale) {
         this.appFlags = appFlags;
         mCompatibilityFlags = compFlags;
+        applicationDensity = dens;
         applicationScale = scale;
         applicationInvertedScale = invertedScale;
     }
@@ -171,6 +164,7 @@
                 | ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS
                 | ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS,
                 EXPANDABLE | CONFIGURED_EXPANDABLE,
+                DisplayMetrics.DENSITY_DEVICE,
                 1.0f,
                 1.0f);
     }
@@ -180,24 +174,11 @@
      */
     public CompatibilityInfo copy() {
         CompatibilityInfo info = new CompatibilityInfo(appFlags, mCompatibilityFlags,
-                applicationScale, applicationInvertedScale);
-        info.setVisibleRect(mXOffset, mWidth, mHeight);
+                applicationDensity, applicationScale, applicationInvertedScale);
         return info;
     }
  
     /**
-     * Sets the application's visible rect in compatibility mode.
-     * @param xOffset the application's x offset that is added to center the content.
-     * @param widthPixels the application's width in real pixels on the screen.
-     * @param heightPixels the application's height in real pixels on the screen.
-     */
-    public void setVisibleRect(int xOffset, int widthPixels, int heightPixels) {
-        this.mXOffset = xOffset; 
-        mWidth = widthPixels;
-        mHeight = heightPixels;
-    }
-    
-    /**
      * Sets expandable bit in the compatibility flag.
      */
     public void setExpandable(boolean expandable) {
@@ -222,30 +203,19 @@
         return (mCompatibilityFlags & SCALING_REQUIRED) != 0;
     }
     
+    public boolean supportsScreen() {
+        return (mCompatibilityFlags & CompatibilityInfo.EXPANDABLE) != 0;
+    }
+    
     @Override
     public String toString() {
         return "CompatibilityInfo{scale=" + applicationScale +
-                ", compatibility flag=" + mCompatibilityFlags + "}"; 
+                ", supports screen=" + supportsScreen() + "}";
     }
 
     /**
      * Returns the translator which can translate the coordinates of the window.
      * There are five different types of Translator.
-     * 
-     * 1) {@link CompatibilityInfo#X_SHIFT_AND_CLIP_CONTENT}
-     *   Shift and clip the content of the window at drawing time. Used for activities'
-     *   main window (with no gravity).
-     * 2) {@link CompatibilityInfo#X_SHIFT_CONTENT}
-     *   Shift the content of the window at drawing time. Used for windows that is created by
-     *   an application and expected to be aligned with the application window.
-     * 3) {@link CompatibilityInfo#X_SHIFT_WINDOW}
-     *   Create the window with adjusted x- coordinates. This is typically used 
-     *   in popup window, where it has to be placed relative to main window.
-     * 4) {@link CompatibilityInfo#X_SHIFT_NONE}
-     *   No adjustment required, such as dialog.
-     * 5) Same as X_SHIFT_WINDOW, but no scaling. This is used by {@link SurfaceView}, which
-     *  does not require scaling, but its window's location has to be adjusted.
-     * 
      * @param params the window's parameter
      */
     public Translator getTranslator(WindowManager.LayoutParams params) {
@@ -254,35 +224,10 @@
             if (DBG) Log.d(TAG, "no translation required");
             return null;
         }
-        
-        if ((mCompatibilityFlags & CompatibilityInfo.EXPANDABLE) == 0) {
-            if ((params.flags & WindowManager.LayoutParams.FLAG_NO_COMPATIBILITY_SCALING) != 0) {
-                if (DBG) Log.d(TAG, "translation for surface view selected");
-                return new Translator(X_SHIFT_WINDOW, false, 1.0f, 1.0f);
-            } else {
-                int shiftMode;
-                if (params.gravity == Gravity.NO_GRAVITY) {
-                    // For Regular Application window
-                    shiftMode = X_SHIFT_AND_CLIP_CONTENT;
-                    if (DBG) Log.d(TAG, "shift and clip translator");
-                } else if (params.width == WindowManager.LayoutParams.FILL_PARENT) {
-                    // For Regular Application window
-                    shiftMode = X_SHIFT_CONTENT;
-                    if (DBG) Log.d(TAG, "shift content translator");
-                } else if ((params.gravity & Gravity.LEFT) != 0 && params.x > 0) {
-                    shiftMode = X_SHIFT_WINDOW;
-                    if (DBG) Log.d(TAG, "shift window translator");
-                } else {
-                    shiftMode = X_SHIFT_NONE;
-                    if (DBG) Log.d(TAG, "no content/window translator");
-                }
-                return new Translator(shiftMode);
-            }
-        } else if (isScalingRequired()) {
-            return new Translator();
-        } else {
+        if (!isScalingRequired()) {
             return null;
         }
+        return new Translator();
     }
 
     /**
@@ -290,97 +235,48 @@
      * @hide
      */
     public class Translator {
-        final private int mShiftMode;
-        final public boolean scalingRequired;
         final public float applicationScale;
         final public float applicationInvertedScale;
         
         private Rect mContentInsetsBuffer = null;
-        private Rect mVisibleInsets = null;
+        private Rect mVisibleInsetsBuffer = null;
         
-        Translator(int shiftMode, boolean scalingRequired, float applicationScale,
-                float applicationInvertedScale) {
-            mShiftMode = shiftMode;
-            this.scalingRequired = scalingRequired;
+        Translator(float applicationScale, float applicationInvertedScale) {
             this.applicationScale = applicationScale;
             this.applicationInvertedScale = applicationInvertedScale;
         }
 
-        Translator(int shiftMode) {
-            this(shiftMode,
-                    isScalingRequired(),
-                    CompatibilityInfo.this.applicationScale,
-                    CompatibilityInfo.this.applicationInvertedScale);
-        }
-        
         Translator() {
-            this(X_SHIFT_NONE);
+            this(CompatibilityInfo.this.applicationScale,
+                    CompatibilityInfo.this.applicationInvertedScale);
         }
 
         /**
          * Translate the screen rect to the application frame.
          */
         public void translateRectInScreenToAppWinFrame(Rect rect) {
-            if (rect.isEmpty()) return; // skip if the window size is empty.
-            switch (mShiftMode) {
-                case X_SHIFT_AND_CLIP_CONTENT:
-                    rect.intersect(0, 0, mWidth, mHeight);
-                    break;
-                case X_SHIFT_CONTENT:
-                    rect.intersect(0, 0, mWidth + mXOffset, mHeight);
-                    break;
-                case X_SHIFT_WINDOW:
-                case X_SHIFT_NONE:
-                    break;
-            }
-            if (scalingRequired) {
-                rect.scale(applicationInvertedScale);
-            }
+            rect.scale(applicationInvertedScale);
         }
 
         /**
          * Translate the region in window to screen. 
          */
         public void translateRegionInWindowToScreen(Region transparentRegion) {
-            switch (mShiftMode) {
-                case X_SHIFT_AND_CLIP_CONTENT:
-                case X_SHIFT_CONTENT:
-                    transparentRegion.scale(applicationScale);
-                    transparentRegion.translate(mXOffset, 0);
-                    break;
-                case X_SHIFT_WINDOW:
-                case X_SHIFT_NONE:
-                    transparentRegion.scale(applicationScale);
-            }
+            transparentRegion.scale(applicationScale);
         }
 
         /**
          * Apply translation to the canvas that is necessary to draw the content.
          */
         public void translateCanvas(Canvas canvas) {
-            if (mShiftMode == X_SHIFT_CONTENT ||
-                    mShiftMode == X_SHIFT_AND_CLIP_CONTENT) {
-                // TODO: clear outside when rotation is changed.
-
-                // Translate x-offset only when the content is shifted.
-                canvas.translate(mXOffset, 0);
-            }
-            if (scalingRequired) {
-                canvas.scale(applicationScale, applicationScale);
-            }
+            canvas.scale(applicationScale, applicationScale);
         }
 
         /**
          * Translate the motion event captured on screen to the application's window.
          */
         public void translateEventInScreenToAppWindow(MotionEvent event) {
-            if (mShiftMode == X_SHIFT_CONTENT ||
-                    mShiftMode == X_SHIFT_AND_CLIP_CONTENT) {
-                event.translate(-mXOffset, 0);
-            }
-            if (scalingRequired) {
-                event.scale(applicationInvertedScale);
-            }
+            event.scale(applicationInvertedScale);
         }
 
         /**
@@ -388,62 +284,21 @@
          * Screen's view.
          */
         public void translateWindowLayout(WindowManager.LayoutParams params) {
-            switch (mShiftMode) {
-                case X_SHIFT_NONE:
-                case X_SHIFT_AND_CLIP_CONTENT:
-                case X_SHIFT_CONTENT:
-                    params.scale(applicationScale);
-                    break;
-                case X_SHIFT_WINDOW:
-                    params.scale(applicationScale);
-                    params.x += mXOffset;
-                    break;
-            }
+            params.scale(applicationScale);
         }
         
         /**
          * Translate a Rect in application's window to screen.
          */
         public void translateRectInAppWindowToScreen(Rect rect) {
-            // TODO Auto-generated method stub
-            if (scalingRequired) {
-                rect.scale(applicationScale);
-            }
-            switch(mShiftMode) {
-                case X_SHIFT_NONE:
-                case X_SHIFT_WINDOW:
-                    break;
-                case X_SHIFT_CONTENT:
-                case X_SHIFT_AND_CLIP_CONTENT:
-                    rect.offset(mXOffset, 0);
-                    break;
-            }
+            rect.scale(applicationScale);
         }
  
         /**
          * Translate a Rect in screen coordinates into the app window's coordinates.
          */
         public void translateRectInScreenToAppWindow(Rect rect) {
-            switch (mShiftMode) {
-                case X_SHIFT_NONE:
-                case X_SHIFT_WINDOW:
-                    break;
-                case X_SHIFT_CONTENT: {
-                    rect.intersects(mXOffset, 0, rect.right, rect.bottom);
-                    int dx = Math.min(mXOffset, rect.left);
-                    rect.offset(-dx, 0);
-                    break;
-                }
-                case X_SHIFT_AND_CLIP_CONTENT: {
-                    rect.intersects(mXOffset, 0, mWidth + mXOffset, mHeight);
-                    int dx = Math.min(mXOffset, rect.left);
-                    rect.offset(-dx, 0);
-                    break;
-                }
-            }
-            if (scalingRequired) {
-                rect.scale(applicationInvertedScale);
-            }
+            rect.scale(applicationInvertedScale);
         }
 
         /**
@@ -451,19 +306,7 @@
          * @param params
          */
         public void translateLayoutParamsInAppWindowToScreen(LayoutParams params) {
-            if (scalingRequired) {
-                params.scale(applicationScale);
-            }
-            switch (mShiftMode) {
-                // the window location on these mode does not require adjustmenet.
-                case X_SHIFT_NONE:
-                case X_SHIFT_WINDOW:
-                    break;
-                case X_SHIFT_CONTENT:
-                case X_SHIFT_AND_CLIP_CONTENT:
-                    params.x += mXOffset;
-                    break;
-            }
+            params.scale(applicationScale);
         }
 
         /**
@@ -482,10 +325,31 @@
          * the internal buffer for content insets to avoid extra object allocation.
          */
         public Rect getTranslatedVisbileInsets(Rect visibleInsets) {
-            if (mVisibleInsets == null) mVisibleInsets = new Rect();
-            mVisibleInsets.set(visibleInsets);
-            translateRectInAppWindowToScreen(mVisibleInsets);
-            return mVisibleInsets;
+            if (mVisibleInsetsBuffer == null) mVisibleInsetsBuffer = new Rect();
+            mVisibleInsetsBuffer.set(visibleInsets);
+            translateRectInAppWindowToScreen(mVisibleInsetsBuffer);
+            return mVisibleInsetsBuffer;
+        }
+    }
+
+    /**
+     * Returns the frame Rect for applications runs under compatibility mode.
+     *
+     * @param dm the display metrics used to compute the frame size.
+     * @param orientation the orientation of the screen.
+     * @param outRect the output parameter which will contain the result.
+     */
+    public static void updateCompatibleScreenFrame(DisplayMetrics dm, int orientation,
+            Rect outRect) {
+        int width = dm.widthPixels;
+        int portraitHeight = (int) (DEFAULT_PORTRAIT_HEIGHT * dm.density);
+        int portraitWidth = (int) (DEFAULT_PORTRAIT_WIDTH * dm.density);
+        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            int xOffset = (width - portraitHeight) / 2 ;
+            outRect.set(xOffset, 0, xOffset + portraitHeight, portraitWidth);
+        } else {
+            int xOffset = (width - portraitWidth) / 2 ;
+            outRect.set(xOffset, 0, xOffset + portraitWidth, portraitHeight);
         }
     }
 }
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 49ad656..2354519 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -34,6 +34,7 @@
 import android.util.SparseArray;
 import android.util.TypedValue;
 import android.util.LongSparseArray;
+import android.view.Display;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -86,7 +87,8 @@
     /*package*/ final DisplayMetrics mMetrics = new DisplayMetrics();
     PluralRules mPluralRule;
     
-    private final CompatibilityInfo mCompatibilityInfo;
+    private CompatibilityInfo mCompatibilityInfo;
+    private Display mDefaultDisplay;
 
     private static final LongSparseArray<Object> EMPTY_ARRAY = new LongSparseArray<Object>() {
         @Override
@@ -129,53 +131,30 @@
      */
     public Resources(AssetManager assets, DisplayMetrics metrics,
             Configuration config) {
-        this(assets, metrics, config, (ApplicationInfo) null);
+        this(assets, metrics, config, (CompatibilityInfo) null);
     }
 
     /**
-     * Creates a new Resources object with ApplicationInfo.
+     * Creates a new Resources object with CompatibilityInfo.
      * 
      * @param assets Previously created AssetManager. 
      * @param metrics Current display metrics to consider when 
      *                selecting/computing resource values.
      * @param config Desired device configuration to consider when 
      *               selecting/computing resource values (optional).
-     * @param appInfo this resource's application info.
+     * @param compInfo this resource's compatibility info. It will use the default compatibility
+     *  info when it's null.
      * @hide
      */
     public Resources(AssetManager assets, DisplayMetrics metrics,
-            Configuration config, ApplicationInfo appInfo) {
+            Configuration config, CompatibilityInfo compInfo) {
         mAssets = assets;
-        mConfiguration.setToDefaults();
         mMetrics.setToDefaults();
-        if (appInfo != null) {
-            mCompatibilityInfo = new CompatibilityInfo(appInfo);
-            if (DEBUG_CONFIG) {
-                Log.d(TAG, "compatibility for " + appInfo.packageName + " : " + mCompatibilityInfo);
-            }
-        } else {
+        if (compInfo == null) {
             mCompatibilityInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO;
-        }
-        updateConfiguration(config, metrics);
-        assets.ensureStringBlocks();
-        if (mCompatibilityInfo.isScalingRequired()) {
-            mPreloadedDrawables = emptySparseArray();
         } else {
-            mPreloadedDrawables = sPreloadedDrawables;
+            mCompatibilityInfo = compInfo;
         }
-    }
-
-    /**
-     * Creates a new resources that uses the given compatibility info. Used to create
-     * a context for widgets using the container's compatibility info.
-     * {@see ApplicationContext#createPackageCotnext}.
-     * @hide
-     */
-    public Resources(AssetManager assets, DisplayMetrics metrics,
-            Configuration config, CompatibilityInfo info) {
-        mAssets = assets;
-        mMetrics.setToDefaults();
-        mCompatibilityInfo = info;
         updateConfiguration(config, metrics);
         assets.ensureStringBlocks();
         if (mCompatibilityInfo.isScalingRequired()) {
@@ -1407,6 +1386,15 @@
     }
 
     /**
+     * This is just for testing.
+     * @hide
+     */
+    public void setCompatibilityInfo(CompatibilityInfo ci) {
+        mCompatibilityInfo = ci;
+        updateConfiguration(mConfiguration, mMetrics);
+    }
+    
+    /**
      * Return a resource identifier for the given resource name.  A fully
      * qualified resource name is of the form "package:type/entry".  The first
      * two components (package and type) are optional if defType and
@@ -1938,6 +1926,24 @@
                 + Integer.toHexString(id));
     }
 
+    /**
+     * Returns the display adjusted for the Resources' metrics.
+     * @hide
+     */
+    public Display getDefaultDisplay(Display defaultDisplay) {
+        if (mDefaultDisplay == null) {
+            if (!mCompatibilityInfo.isScalingRequired() && mCompatibilityInfo.supportsScreen()) {
+                // the app supports the display. just use the default one.
+                mDefaultDisplay = defaultDisplay;
+            } else {
+                // display needs adjustment.
+                mDefaultDisplay = Display.createMetricsBasedDisplay(
+                        defaultDisplay.getDisplayId(), mMetrics);
+            }
+        }
+        return mDefaultDisplay;
+    }
+
     private TypedArray getCachedStyledAttributes(int len) {
         synchronized (mTmpValue) {
             TypedArray attrs = mCachedStyledAttributes;
diff --git a/core/java/android/gesture/Gesture.java b/core/java/android/gesture/Gesture.java
index 2262477..62330e1 100755
--- a/core/java/android/gesture/Gesture.java
+++ b/core/java/android/gesture/Gesture.java
@@ -31,6 +31,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
 import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * A gesture can have a single or multiple strokes
@@ -44,7 +45,7 @@
     private static final boolean BITMAP_RENDERING_ANTIALIAS = true;
     private static final boolean BITMAP_RENDERING_DITHER = true;
 
-    private static int sGestureCount = 0;
+    private static final AtomicInteger sGestureCount = new AtomicInteger(0);
 
     private final RectF mBoundingBox = new RectF();
 
@@ -54,12 +55,7 @@
     private final ArrayList<GestureStroke> mStrokes = new ArrayList<GestureStroke>();
 
     public Gesture() {
-        mGestureID = GESTURE_ID_BASE + sGestureCount++;
-    }
-
-    void recycle() {
-        mStrokes.clear();
-        mBoundingBox.setEmpty();
+        mGestureID = GESTURE_ID_BASE + sGestureCount.incrementAndGet();
     }
 
     /**
@@ -162,20 +158,6 @@
     }
 
     /**
-     * draw the gesture
-     * 
-     * @param canvas
-     */
-    void draw(Canvas canvas, Paint paint) {
-        final ArrayList<GestureStroke> strokes = mStrokes;
-        final int count = strokes.size();
-
-        for (int i = 0; i < count; i++) {
-            strokes.get(i).draw(canvas, paint);
-        }
-    }
-
-    /**
      * Create a bitmap of the gesture with a transparent background
      * 
      * @param width width of the target bitmap
diff --git a/core/java/android/gesture/package.html b/core/java/android/gesture/package.html
index a54a0171..32c44d2 100644
--- a/core/java/android/gesture/package.html
+++ b/core/java/android/gesture/package.html
@@ -1,5 +1,5 @@
 <HTML>
 <BODY>
-@hide
+Provides classes to create, recognize, load and save gestures.
 </BODY>
 </HTML>
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index c23df21..421d013 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -105,6 +105,18 @@
     private static final String LOG = Uri.class.getSimpleName();
 
     /**
+     * NOTE: EMPTY accesses this field during its own initialization, so this
+     * field *must* be initialized first, or else EMPTY will see a null value!
+     *
+     * Placeholder for strings which haven't been cached. This enables us
+     * to cache null. We intentionally create a new String instance so we can
+     * compare its identity and there is no chance we will confuse it with
+     * user data.
+     */
+    @SuppressWarnings("RedundantStringConstructorCall")
+    private static final String NOT_CACHED = new String("NOT CACHED");
+
+    /**
      * The empty URI, equivalent to "".
      */
     public static final Uri EMPTY = new HierarchicalUri(null, Part.NULL,
@@ -350,15 +362,6 @@
     private final static int NOT_CALCULATED = -2;
 
     /**
-     * Placeholder for strings which haven't been cached. This enables us
-     * to cache null. We intentionally create a new String instance so we can
-     * compare its identity and there is no chance we will confuse it with
-     * user data.
-     */
-    @SuppressWarnings("RedundantStringConstructorCall")
-    private static final String NOT_CACHED = new String("NOT CACHED");
-
-    /**
      * Error message presented when a user tries to treat an opaque URI as
      * hierarchical.
      */
@@ -1080,7 +1083,7 @@
         /** Used in parcelling. */
         static final int TYPE_ID = 3;
 
-        private final String scheme;
+        private final String scheme; // can be null
         private final Part authority;
         private final PathPart path;
         private final Part query;
@@ -1089,10 +1092,10 @@
         private HierarchicalUri(String scheme, Part authority, PathPart path,
                 Part query, Part fragment) {
             this.scheme = scheme;
-            this.authority = authority;
-            this.path = path;
-            this.query = query;
-            this.fragment = fragment;
+            this.authority = Part.nonNull(authority);
+            this.path = path == null ? PathPart.NULL : path;
+            this.query = Part.nonNull(query);
+            this.fragment = Part.nonNull(fragment);
         }
 
         static Uri readFrom(Parcel parcel) {
@@ -1155,21 +1158,18 @@
         }
 
         private void appendSspTo(StringBuilder builder) {
-            if (authority != null) {
-                String encodedAuthority = authority.getEncoded();
-                if (encodedAuthority != null) {
-                    // Even if the authority is "", we still want to append "//".
-                    builder.append("//").append(encodedAuthority);
-                }
+            String encodedAuthority = authority.getEncoded();
+            if (encodedAuthority != null) {
+                // Even if the authority is "", we still want to append "//".
+                builder.append("//").append(encodedAuthority);
             }
 
-            // path is never null.
             String encodedPath = path.getEncoded();
             if (encodedPath != null) {
                 builder.append(encodedPath);
             }
 
-            if (query != null && !query.isEmpty()) {
+            if (!query.isEmpty()) {
                 builder.append('?').append(query.getEncoded());
             }
         }
@@ -1229,7 +1229,7 @@
 
             appendSspTo(builder);
 
-            if (fragment != null && !fragment.isEmpty()) {
+            if (!fragment.isEmpty()) {
                 builder.append('#').append(fragment.getEncoded());
             }
 
@@ -1503,7 +1503,7 @@
             throw new UnsupportedOperationException(NOT_HIERARCHICAL);
         }
 
-        String query = getQuery();
+        String query = getEncodedQuery();
         if (query == null) {
             return Collections.emptyList();
         }
@@ -1566,7 +1566,7 @@
             throw new UnsupportedOperationException(NOT_HIERARCHICAL);
         }
 
-        String query = getQuery();
+        String query = getEncodedQuery();
 
         if (query == null) {
             return null;
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 528def5..e203fd5 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -508,6 +508,19 @@
     public abstract long getBatteryUptime(long curTime);
 
     /**
+     * @deprecated use getRadioDataUptime
+     */
+    public long getRadioDataUptimeMs() {
+        return getRadioDataUptime() / 1000;
+    }
+
+    /**
+     * Returns the time that the radio was on for data transfers.
+     * @return the uptime in microseconds while unplugged
+     */
+    public abstract long getRadioDataUptime();
+
+    /**
      * Returns the current battery realtime in microseconds.
      *
      * @param curTime the amount of elapsed realtime in microseconds.
@@ -1128,7 +1141,14 @@
         }
         if (!didOne) sb.append("No activity");
         pw.println(sb.toString());
-        
+
+        sb.setLength(0);
+        sb.append(prefix);
+        sb.append("  Radio data uptime when unplugged: ");
+        sb.append(getRadioDataUptime() / 1000);
+        sb.append(" ms");
+        pw.println(sb.toString());
+
         sb.setLength(0);
         sb.append(prefix);
                 sb.append("  Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 1214abc..4805193 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -68,6 +68,18 @@
     public static final int PHONE_UID = 1001;
 
     /**
+     * Defines the UID/GID for the user shell.
+     * @hide
+     */
+    public static final int SHELL_UID = 2000;
+
+    /**
+     * Defines the UID/GID for the WIFI supplicant process.
+     * @hide
+     */
+    public static final int WIFI_UID = 1010;
+
+    /**
      * Defines the start of a range of UIDs (and GIDs), going from this
      * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
      * to applications.
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index 23c0a7bf..584224f 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -50,6 +50,7 @@
     /*package*/ HashMap<IBinder, Callback> mCallbacks
             = new HashMap<IBinder, Callback>();
     private Object[] mActiveBroadcast;
+    private int mBroadcastCount = -1;
     private boolean mKilled = false;
     
     private final class Callback implements IBinder.DeathRecipient {
@@ -195,15 +196,16 @@
      * This creates a copy of the callback list, which you can retrieve items
      * from using {@link #getBroadcastItem}.  Note that only one broadcast can
      * be active at a time, so you must be sure to always call this from the
-     * same thread (usually by scheduling with {@link Handler} or
+     * same thread (usually by scheduling with {@link Handler}) or
      * do your own synchronization.  You must call {@link #finishBroadcast}
      * when done.
      * 
      * <p>A typical loop delivering a broadcast looks like this:
      * 
      * <pre>
-     * final int N = callbacks.beginBroadcast();
-     * for (int i=0; i<N; i++) {
+     * int i = callbacks.beginBroadcast();
+     * while (i > 0) {
+     *     i--;
      *     try {
      *         callbacks.getBroadcastItem(i).somethingHappened();
      *     } catch (RemoteException e) {
@@ -222,7 +224,12 @@
      */
     public int beginBroadcast() {
         synchronized (mCallbacks) {
-            final int N = mCallbacks.size();
+            if (mBroadcastCount > 0) {
+                throw new IllegalStateException(
+                        "beginBroadcast() called while already in a broadcast");
+            }
+            
+            final int N = mBroadcastCount = mCallbacks.size();
             if (N <= 0) {
                 return 0;
             }
@@ -281,12 +288,19 @@
      * @see #beginBroadcast
      */
     public void finishBroadcast() {
+        if (mBroadcastCount < 0) {
+            throw new IllegalStateException(
+                    "finishBroadcast() called outside of a broadcast");
+        }
+        
         Object[] active = mActiveBroadcast;
         if (active != null) {
-            final int N = active.length;
+            final int N = mBroadcastCount;
             for (int i=0; i<N; i++) {
                 active[i] = null;
             }
         }
+        
+        mBroadcastCount = -1;
     }
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index aa583ac..b5440f2 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1328,7 +1328,7 @@
          * boolean (1 or 0).
          */
         public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled";
-        
+
         /**
          * Whether live web suggestions while the user types into search dialogs are
          * enabled. Browsers and other search UIs should respect this, as it allows
@@ -2300,7 +2300,7 @@
          * @hide
          */
         public static final String BACKUP_TRANSPORT = "backup_transport";
-        
+
         /**
          * Version for which the setup wizard was last shown.  Bumped for
          * each release when there is new setup information to show.
@@ -2508,11 +2508,17 @@
         public static final String CHECKIN_EVENTS = "checkin_events";
 
         /**
-         * Event tags for list of services to upload during checkin.
+         * Comma-separated list of service names to dump and upload during checkin.
          */
         public static final String CHECKIN_DUMPSYS_LIST = "checkin_dumpsys_list";
 
         /**
+         * Comma-separated list of packages to specify for each service that is
+         * dumped (currently only meaningful for user activity).
+         */
+        public static final String CHECKIN_PACKAGE_LIST = "checkin_package_list";
+
+        /**
          * The interval (in seconds) between periodic checkin attempts.
          */
         public static final String CHECKIN_INTERVAL = "checkin_interval";
@@ -2692,6 +2698,12 @@
         public static final String GMAIL_NUM_RETRY_UPHILL_OP = "gmail_discard_error_uphill_op";
 
         /**
+         * Controls if the protocol buffer version of the protocol will use a multipart request for
+         * attachment uploads. Value must be an integer where non-zero means true. Defaults to 0.
+         */
+        public static final String GMAIL_USE_MULTIPART_PROTOBUF = "gmail_use_multipart_protobuf";
+
+        /**
          * the transcoder URL for mobile devices.
          */
         public static final String TRANSCODER_URL = "mobile_transcoder_url";
@@ -2954,6 +2966,13 @@
                 "vending_pd_resend_frequency_ms";
 
         /**
+         * Frequency in milliseconds at which we should cycle through the promoted applications
+         * on the home screen or the categories page.
+         */
+        public static final String VENDING_PROMO_REFRESH_FREQUENCY_MS =
+                "vending_promo_refresh_freq_ms";
+
+        /**
          * URL that points to the legal terms of service to display in Settings.
          * <p>
          * This should be a https URL. For a pretty user-friendly URL, use
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 4078fa6..c292c53 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -44,7 +44,7 @@
  */
 public final class Telephony {
     private static final String TAG = "Telephony";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = true;
     private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
 
     // Constructor
@@ -241,7 +241,7 @@
             if (uri == null) {
                 return false;
             }
-            
+
             boolean markAsUnread = false;
             boolean markAsRead = false;
             switch(folder) {
@@ -268,7 +268,7 @@
             } else if (markAsRead) {
                 values.put(READ, Integer.valueOf(1));
             }
-            
+
             return 1 == SqliteWrapper.update(context, context.getContentResolver(),
                             uri, values, null, null);
         }
@@ -1136,8 +1136,14 @@
             }
 
             Uri uri = uriBuilder.build();
+            if (DEBUG) {
+                Log.v(TAG, "getOrCreateThreadId uri: " + uri);
+            }
             Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(),
                     uri, ID_PROJECTION, null, null, null);
+            if (DEBUG) {
+                Log.v(TAG, "getOrCreateThreadId cursor cnt: " + cursor.getCount());
+            }
             if (cursor != null) {
                 try {
                     if (cursor.moveToFirst()) {
@@ -1620,6 +1626,9 @@
          *
          * It is recommended to display <em>plmn</em> before / above <em>spn</em> if
          * both are displayed.
+         *
+         * <p>Note this is a protected intent that can only be sent
+         * by the system.
          */
         public static final String SPN_STRINGS_UPDATED_ACTION =
                 "android.provider.Telephony.SPN_STRINGS_UPDATED";
diff --git a/core/java/android/server/search/SearchDialogWrapper.java b/core/java/android/server/search/SearchDialogWrapper.java
new file mode 100644
index 0000000..d3ef5de
--- /dev/null
+++ b/core/java/android/server/search/SearchDialogWrapper.java
@@ -0,0 +1,387 @@
+/*
+ * 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.server.search;
+
+import android.app.ISearchManagerCallback;
+import android.app.SearchDialog;
+import android.app.SearchManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.DeadObjectException;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.text.TextUtils;
+import android.util.Log;
+
+/**
+ * Runs an instance of {@link SearchDialog} on its own thread.
+ */
+class SearchDialogWrapper
+implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
+
+    private static final String TAG = "SearchManagerService";
+    private static final boolean DBG = false;
+
+    private static final String SEARCH_UI_THREAD_NAME = "SearchDialog";
+    private static final int SEARCH_UI_THREAD_PRIORITY =
+        android.os.Process.THREAD_PRIORITY_DEFAULT;
+
+    // Takes no arguments
+    private static final int MSG_INIT = 0;
+    // Takes these arguments:
+    // arg1: selectInitialQuery, 0 = false, 1 = true
+    // arg2: globalSearch, 0 = false, 1 = true
+    // obj: searchManagerCallback
+    // data[KEY_INITIAL_QUERY]: initial query
+    // data[KEY_LAUNCH_ACTIVITY]: launch activity
+    // data[KEY_APP_SEARCH_DATA]: app search data
+    private static final int MSG_START_SEARCH = 1;
+    // Takes no arguments
+    private static final int MSG_STOP_SEARCH = 2;
+    // arg1 is activity id
+    private static final int MSG_ACTIVITY_RESUMING = 3;
+
+    private static final String KEY_INITIAL_QUERY = "q";
+    private static final String KEY_LAUNCH_ACTIVITY = "a";
+    private static final String KEY_APP_SEARCH_DATA = "d";
+    private static final String KEY_IDENT= "i";
+
+    // Context used for getting search UI resources
+    private final Context mContext;
+
+    // Handles messages on the search UI thread.
+    private final SearchDialogHandler mSearchUiThread;
+
+    // The search UI
+    SearchDialog mSearchDialog;
+
+    // If the search UI is visible, this is the callback for the client that showed it.
+    ISearchManagerCallback mCallback = null;
+
+    // Identity of last activity that started search.
+    private int mStartedIdent = 0;
+    
+    // Identity of currently resumed activity.
+    private int mResumedIdent = 0;
+
+    // True if we have registered our receivers.
+    private boolean mReceiverRegistered;
+
+    private volatile boolean mVisible = false;
+    
+    /**
+     * Creates a new search dialog wrapper and a search UI thread. The search dialog itself will
+     * be created some asynchronously on the search UI thread.
+     *
+     * @param context Context used for getting search UI resources.
+     */
+    public SearchDialogWrapper(Context context) {
+        mContext = context;
+
+        // Create the search UI thread
+        HandlerThread t = new HandlerThread(SEARCH_UI_THREAD_NAME, SEARCH_UI_THREAD_PRIORITY);
+        t.start();
+        mSearchUiThread = new SearchDialogHandler(t.getLooper());
+
+        // Create search UI on the search UI thread
+        mSearchUiThread.sendEmptyMessage(MSG_INIT);
+    }
+
+    public boolean isVisible() {
+        return mVisible;
+    }
+
+    /**
+     * Initializes the search UI.
+     * Must be called from the search UI thread.
+     */
+    private void init() {
+        mSearchDialog = new SearchDialog(mContext);
+        mSearchDialog.setOnCancelListener(this);
+        mSearchDialog.setOnDismissListener(this);
+    }
+
+    private void registerBroadcastReceiver() {
+        if (!mReceiverRegistered) {
+            IntentFilter filter = new IntentFilter(
+                    Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+            filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+            mContext.registerReceiver(mBroadcastReceiver, filter, null,
+                    mSearchUiThread);
+            mReceiverRegistered = true;
+        }
+    }
+
+    private void unregisterBroadcastReceiver() {
+        if (mReceiverRegistered) {
+            mContext.unregisterReceiver(mBroadcastReceiver);
+            mReceiverRegistered = false;
+        }
+    }
+
+    /**
+     * Closes the search dialog when requested by the system (e.g. when a phone call comes in).
+     */
+    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
+                if (!"search".equals(intent.getStringExtra("reason"))) {
+                    if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+                    performStopSearch();
+                }
+            } else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
+                if (DBG) debug(Intent.ACTION_CONFIGURATION_CHANGED);
+                performOnConfigurationChanged();
+            }
+        }
+    };
+
+    //
+    // External API
+    //
+
+    /**
+     * Launches the search UI.
+     * Can be called from any thread.
+     *
+     * @see SearchManager#startSearch(String, boolean, ComponentName, Bundle, boolean)
+     */
+    public void startSearch(final String initialQuery,
+            final boolean selectInitialQuery,
+            final ComponentName launchActivity,
+            final Bundle appSearchData,
+            final boolean globalSearch,
+            final ISearchManagerCallback searchManagerCallback,
+            int ident) {
+        if (DBG) debug("startSearch()");
+        Message msg = Message.obtain();
+        msg.what = MSG_START_SEARCH;
+        msg.arg1 = selectInitialQuery ? 1 : 0;
+        msg.arg2 = globalSearch ? 1 : 0;
+        msg.obj = searchManagerCallback;
+        Bundle msgData = msg.getData();
+        msgData.putString(KEY_INITIAL_QUERY, initialQuery);
+        msgData.putParcelable(KEY_LAUNCH_ACTIVITY, launchActivity);
+        msgData.putBundle(KEY_APP_SEARCH_DATA, appSearchData);
+        msgData.putInt(KEY_IDENT, ident);
+        mSearchUiThread.sendMessage(msg);
+    }
+
+    /**
+     * Cancels the search dialog.
+     * Can be called from any thread.
+     */
+    public void stopSearch() {
+        if (DBG) debug("stopSearch()");
+        mSearchUiThread.sendEmptyMessage(MSG_STOP_SEARCH);
+    }
+
+    /**
+     * Updates the currently resumed activity.
+     * Can be called from any thread.
+     */
+    public void activityResuming(int ident) {
+        if (DBG) debug("activityResuming(ident=" + ident + ")");
+        Message msg = Message.obtain();
+        msg.what = MSG_ACTIVITY_RESUMING;
+        msg.arg1 = ident;
+        mSearchUiThread.sendMessage(msg);
+    }
+
+    //
+    // Implementation methods that run on the search UI thread
+    //
+
+    private class SearchDialogHandler extends Handler {
+
+        public SearchDialogHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_INIT:
+                    init();
+                    break;
+                case MSG_START_SEARCH:
+                    handleStartSearchMessage(msg);
+                    break;
+                case MSG_STOP_SEARCH:
+                    performStopSearch();
+                    break;
+                case MSG_ACTIVITY_RESUMING:
+                    performActivityResuming(msg.arg1);
+                    break;
+            }
+        }
+
+        private void handleStartSearchMessage(Message msg) {
+            Bundle msgData = msg.getData();
+            String initialQuery = msgData.getString(KEY_INITIAL_QUERY);
+            boolean selectInitialQuery = msg.arg1 != 0;
+            ComponentName launchActivity =
+                    (ComponentName) msgData.getParcelable(KEY_LAUNCH_ACTIVITY);
+            Bundle appSearchData = msgData.getBundle(KEY_APP_SEARCH_DATA);
+            boolean globalSearch = msg.arg2 != 0;
+            ISearchManagerCallback searchManagerCallback = (ISearchManagerCallback) msg.obj;
+            int ident = msgData.getInt(KEY_IDENT);
+            performStartSearch(initialQuery, selectInitialQuery, launchActivity,
+                    appSearchData, globalSearch, searchManagerCallback, ident);
+        }
+
+    }
+
+    /**
+     * Actually launches the search UI.
+     * This must be called on the search UI thread.
+     */
+    void performStartSearch(String initialQuery,
+            boolean selectInitialQuery,
+            ComponentName launchActivity,
+            Bundle appSearchData,
+            boolean globalSearch,
+            ISearchManagerCallback searchManagerCallback,
+            int ident) {
+        if (DBG) debug("performStartSearch()");
+
+        registerBroadcastReceiver();
+        mCallback = searchManagerCallback;
+
+        // clean up any hidden dialog that we were waiting to resume
+        if (mStartedIdent != 0) {
+            mSearchDialog.dismiss();
+        }
+
+        mStartedIdent = ident;
+        if (DBG) Log.v(TAG, "******************* DIALOG: start");
+
+        mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
+                globalSearch);
+        mVisible = true;
+    }
+
+    /**
+     * Actually cancels the search UI.
+     * This must be called on the search UI thread.
+     */
+    void performStopSearch() {
+        if (DBG) debug("performStopSearch()");
+        if (DBG) Log.v(TAG, "******************* DIALOG: cancel");
+        mSearchDialog.cancel();
+        mVisible = false;
+        mStartedIdent = 0;
+    }
+
+    /**
+     * Updates the resumed activity
+     * This must be called on the search UI thread.
+     */
+    void performActivityResuming(int ident) {
+        if (DBG) debug("performResumingActivity(): mStartedIdent="
+                + mStartedIdent + ", resuming: " + ident);
+        this.mResumedIdent = ident;
+        if (mStartedIdent != 0) {
+            if (mStartedIdent == mResumedIdent) {
+                // we are resuming into the activity where we previously hid the dialog, bring it
+                // back
+                if (DBG) Log.v(TAG, "******************* DIALOG: show");
+                mSearchDialog.show();
+                mVisible = true;
+            } else {
+                // resuming into some other activity; hide ourselves in case we ever come back
+                // so we can show ourselves quickly again
+                if (DBG) Log.v(TAG, "******************* DIALOG: hide");
+                mSearchDialog.hide();
+                mVisible = false;
+            }
+        }
+    }
+
+    /**
+     * Must be called from the search UI thread.
+     */
+    void performOnConfigurationChanged() {
+        if (DBG) debug("performOnConfigurationChanged()");
+        mSearchDialog.onConfigurationChanged();
+    }
+
+    /**
+     * Called by {@link SearchDialog} when it goes away.
+     */
+    public void onDismiss(DialogInterface dialog) {
+        if (DBG) debug("onDismiss()");
+        mStartedIdent = 0;
+        mVisible = false;
+        callOnDismiss();
+
+        // we don't need the callback anymore, release it
+        mCallback = null;
+        unregisterBroadcastReceiver();
+    }
+
+
+    /**
+     * Called by {@link SearchDialog} when the user or activity cancels search.
+     * Whenever this method is called, {@link #onDismiss} is always called afterwards.
+     */
+    public void onCancel(DialogInterface dialog) {
+        if (DBG) debug("onCancel()");
+        callOnCancel();
+    }
+
+    private void callOnDismiss() {
+        if (mCallback == null) return;
+        try {
+            // should be safe to do on the search UI thread, since it's a oneway interface
+            mCallback.onDismiss();
+        } catch (DeadObjectException ex) {
+            // The process that hosted the callback has died, do nothing
+        } catch (RemoteException ex) {
+            Log.e(TAG, "onDismiss() failed: " + ex);
+        }
+    }
+
+    private void callOnCancel() {
+        if (mCallback != null) {
+            try {
+                // should be safe to do on the search UI thread, since it's a oneway interface
+                mCallback.onCancel();
+            } catch (DeadObjectException ex) {
+                // The process that hosted the callback has died, do nothing
+            } catch (RemoteException ex) {
+                Log.e(TAG, "onCancel() failed: " + ex);
+            }
+        }
+    }
+
+    private static void debug(String msg) {
+        Thread thread = Thread.currentThread();
+        Log.d(TAG, msg + " (" + thread.getName() + "-" + thread.getId() + ")");
+    }
+}
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index 373e61f..fdeb8f9 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -16,54 +16,43 @@
 
 package android.server.search;
 
+import android.app.ActivityManagerNative;
+import android.app.IActivityWatcher;
 import android.app.ISearchManager;
 import android.app.ISearchManagerCallback;
-import android.app.SearchDialog;
 import android.app.SearchManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.text.TextUtils;
 import android.util.Log;
 
 import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
 
 /**
- * This is a simplified version of the Search Manager service.  It no longer handles
- * presentation (UI).  Its function is to maintain the map & list of "searchable"
- * items, which provides a mapping from individual activities (where a user might have
- * invoked search) to specific searchable activities (where the search will be dispatched).
+ * The search manager service handles the search UI, and maintains a registry of searchable
+ * activities.
  */
-public class SearchManagerService extends ISearchManager.Stub
-        implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener
-{
-        // general debugging support
+public class SearchManagerService extends ISearchManager.Stub {
+
+    // general debugging support
     private static final String TAG = "SearchManagerService";
     private static final boolean DBG = false;
 
-        // class maintenance and general shared data
+    // Context that the service is running in.
     private final Context mContext;
-    private final Handler mHandler;
-    private boolean mSearchablesDirty;
-    private final Searchables mSearchables;
 
-    final SearchDialog mSearchDialog;
-    ISearchManagerCallback mCallback = null;
+    // This field is initialized in ensureSearchablesCreated(), and then never modified.
+    // Only accessed by ensureSearchablesCreated() and getSearchables()
+    private Searchables mSearchables;
 
-    private final boolean mDisabledOnBoot;
-
-    private static final String DISABLE_SEARCH_PROPERTY = "dev.disablesearchdialog";
+    // This field is initialized in ensureSearchDialogCreated(), and then never modified.
+    // Only accessed by ensureSearchDialogCreated() and getSearchDialog()
+    private SearchDialogWrapper mSearchDialog;
 
     /**
      * Initializes the Search Manager service in the provided system context.
@@ -73,82 +62,98 @@
      */
     public SearchManagerService(Context context)  {
         mContext = context;
-        mHandler = new Handler();
-        mSearchablesDirty = true;
-        mSearchables = new Searchables(context);
-        mSearchDialog = new SearchDialog(context);
-        mSearchDialog.setOnCancelListener(this);
-        mSearchDialog.setOnDismissListener(this);
-
-        // Setup the infrastructure for updating and maintaining the list
-        // of searchable activities.
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-        filter.addDataScheme("package");
-        mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
-
-        // After startup settles down, preload the searchables list,
-        // which will reduce the delay when the search UI is invoked.
-        mHandler.post(mRunUpdateSearchable);
-
-        // allows disabling of search dialog for stress testing runs
-        mDisabledOnBoot = !TextUtils.isEmpty(SystemProperties.get(DISABLE_SEARCH_PROPERTY));
+        // call initialize() after all pending actions on the main system thread have finished
+        new Handler().post(new Runnable() {
+            public void run() {
+                initialize();
+            }
+        });
     }
 
     /**
-     * Listens for intent broadcasts.
-     *
-     * The primary purpose here is to refresh the "searchables" list
-     * if packages are added/removed.
+     * Initializes the list of searchable activities and the search UI.
      */
-    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+    void initialize() {
+        try {
+            ActivityManagerNative.getDefault().registerActivityWatcher(
+                    mActivityWatcher);
+        } catch (RemoteException e) {
+        }
+    }
+
+    private synchronized void ensureSearchablesCreated() {
+        if (mSearchables != null) return;  // already created
+
+        mSearchables = new Searchables(mContext);
+        mSearchables.buildSearchableList();
+
+        IntentFilter packageFilter = new IntentFilter();
+        packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+        packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+        packageFilter.addDataScheme("package");
+        mContext.registerReceiver(mPackageChangedReceiver, packageFilter);
+    }
+
+    private synchronized void ensureSearchDialogCreated() {
+        if (mSearchDialog != null) return;
+
+        mSearchDialog = new SearchDialogWrapper(mContext);
+    }
+
+    private synchronized Searchables getSearchables() {
+        ensureSearchablesCreated();
+        return mSearchables;
+    }
+
+    private synchronized SearchDialogWrapper getSearchDialog() {
+        ensureSearchDialogCreated();
+        return mSearchDialog;
+    }
+
+    /**
+     * Refreshes the "searchables" list when packages are added/removed.
+     */
+    private BroadcastReceiver mPackageChangedReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
 
-            // First, test for intents that matter at any time
-            if (action.equals(Intent.ACTION_PACKAGE_ADDED) ||
-                action.equals(Intent.ACTION_PACKAGE_REMOVED) ||
-                action.equals(Intent.ACTION_PACKAGE_CHANGED)) {
-                mSearchablesDirty = true;
-                mHandler.post(mRunUpdateSearchable);
-                return;
+            if (Intent.ACTION_PACKAGE_ADDED.equals(action) ||
+                    Intent.ACTION_PACKAGE_REMOVED.equals(action) ||
+                    Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
+                if (DBG) Log.d(TAG, "Got " + action);
+                // Dismiss search dialog, since the search context may no longer be valid
+                getSearchDialog().stopSearch();
+                // Update list of searchable activities
+                getSearchables().buildSearchableList();
+                broadcastSearchablesChanged();
             }
         }
     };
 
-    /**
-     * This runnable (for the main handler / UI thread) will update the searchables list.
-     */
-    private Runnable mRunUpdateSearchable = new Runnable() {
-        public void run() {
-            updateSearchablesIfDirty();
+    private IActivityWatcher.Stub mActivityWatcher = new IActivityWatcher.Stub() {
+        public void activityResuming(int activityId) throws RemoteException {
+            if (DBG) Log.i("foo", "********************** resuming: " + activityId);
+            if (mSearchDialog == null) return;
+            mSearchDialog.activityResuming(activityId);
         }
     };
-
+    
     /**
-     * Updates the list of searchables, either at startup or in response to
-     * a package add/remove broadcast message.
+     * Informs all listeners that the list of searchables has been updated.
      */
-    private void updateSearchables() {
-        if (DBG) debug("updateSearchables()");
-        mSearchables.buildSearchableList();
-        mSearchablesDirty = false;
+    void broadcastSearchablesChanged() {
+        mContext.sendBroadcast(
+                new Intent(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED));
     }
 
-    /**
-     * Updates the list of searchables if needed.
-     */
-    private void updateSearchablesIfDirty() {
-        if (mSearchablesDirty) {
-            updateSearchables();
-        }
-    }
+    //
+    // Searchable activities API
+    //
 
     /**
-     * Returns the SearchableInfo for a given activity
+     * Returns the SearchableInfo for a given activity.
      *
      * @param launchActivity The activity from which we're launching this search.
      * @param globalSearch If false, this will only launch the search that has been specifically
@@ -158,226 +163,83 @@
      * @return Returns a SearchableInfo record describing the parameters of the search,
      * or null if no searchable metadata was available.
      */
-    public SearchableInfo getSearchableInfo(ComponentName launchActivity, boolean globalSearch) {
-        updateSearchablesIfDirty();
-        SearchableInfo si = null;
+    public SearchableInfo getSearchableInfo(final ComponentName launchActivity,
+            final boolean globalSearch) {
         if (globalSearch) {
-            si = mSearchables.getDefaultSearchable();
+            return getSearchables().getDefaultSearchable();
         } else {
             if (launchActivity == null) {
                 Log.e(TAG, "getSearchableInfo(), activity == null");
                 return null;
             }
-            si = mSearchables.getSearchableInfo(launchActivity);
+            return getSearchables().getSearchableInfo(launchActivity);
         }
-
-        return si;
     }
 
     /**
      * Returns a list of the searchable activities that can be included in global search.
      */
     public List<SearchableInfo> getSearchablesInGlobalSearch() {
-        updateSearchablesIfDirty();
-        return mSearchables.getSearchablesInGlobalSearchList();
-    }
-    /**
-     * Launches the search UI on the main thread of the service.
-     *
-     * @see SearchManager#startSearch(String, boolean, ComponentName, Bundle, boolean)
-     */
-    public void startSearch(final String initialQuery,
-            final boolean selectInitialQuery,
-            final ComponentName launchActivity,
-            final Bundle appSearchData,
-            final boolean globalSearch,
-            final ISearchManagerCallback searchManagerCallback) {
-        if (DBG) debug("startSearch()");
-        Runnable task = new Runnable() {
-            public void run() {
-                performStartSearch(initialQuery,
-                        selectInitialQuery,
-                        launchActivity,
-                        appSearchData,
-                        globalSearch,
-                        searchManagerCallback);
-            }
-        };
-        mHandler.post(task);
+        return getSearchables().getSearchablesInGlobalSearchList();
     }
 
     /**
-     * Actually launches the search. This must be called on the service UI thread.
+     * Returns a list of the searchable activities that handle web searches.
+     * Can be called from any thread.
      */
-    /*package*/ void performStartSearch(String initialQuery,
+    public List<SearchableInfo> getSearchablesForWebSearch() {
+        return getSearchables().getSearchablesForWebSearchList();
+    }
+
+    /**
+     * Returns the default searchable activity for web searches.
+     * Can be called from any thread.
+     */
+    public SearchableInfo getDefaultSearchableForWebSearch() {
+        return getSearchables().getDefaultSearchableForWebSearch();
+    }
+
+    /**
+     * Sets the default searchable activity for web searches.
+     * Can be called from any thread.
+     */
+    public void setDefaultWebSearch(final ComponentName component) {
+        getSearchables().setDefaultWebSearch(component);
+        broadcastSearchablesChanged();
+    }
+
+    // Search UI API
+
+    /**
+     * Launches the search UI. Can be called from any thread.
+     *
+     * @see SearchManager#startSearch(String, boolean, ComponentName, Bundle, boolean)
+     */
+    public void startSearch(String initialQuery,
             boolean selectInitialQuery,
             ComponentName launchActivity,
             Bundle appSearchData,
             boolean globalSearch,
-            ISearchManagerCallback searchManagerCallback) {
-        if (DBG) debug("performStartSearch()");
-
-        if (mDisabledOnBoot) {
-            Log.d(TAG, "ignoring start search request because " + DISABLE_SEARCH_PROPERTY
-                    + " system property is set.");
-            return;
-        }
-
-        mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
-                globalSearch);
-        if (searchManagerCallback != null) {
-            mCallback = searchManagerCallback;
-        }
+            ISearchManagerCallback searchManagerCallback,
+            int ident) {
+        getSearchDialog().startSearch(initialQuery,
+                selectInitialQuery,
+                launchActivity,
+                appSearchData,
+                globalSearch,
+                searchManagerCallback,
+                ident);
     }
 
     /**
      * Cancels the search dialog. Can be called from any thread.
      */
     public void stopSearch() {
-        if (DBG) debug("stopSearch()");
-        mHandler.post(new Runnable() {
-            public void run() {
-                performStopSearch();
-            }
-        });
+        getSearchDialog().stopSearch();
     }
 
-    /**
-     * Cancels the search dialog. Must be called from the service UI thread.
-     */
-    /*package*/ void performStopSearch() {
-        if (DBG) debug("performStopSearch()");
-        mSearchDialog.cancel();
-    }
-
-    /**
-     * Determines if the Search UI is currently displayed.
-     *
-     * @see SearchManager#isVisible()
-     */
     public boolean isVisible() {
-        return postAndWait(mIsShowing, false, "isShowing()");
-    }
-
-    private final Callable<Boolean> mIsShowing = new Callable<Boolean>() {
-        public Boolean call() {
-            return mSearchDialog.isShowing();
-        }
-    };
-
-    public Bundle onSaveInstanceState() {
-        return postAndWait(mOnSaveInstanceState, null, "onSaveInstanceState()");
-    }
-
-    private final Callable<Bundle> mOnSaveInstanceState = new Callable<Bundle>() {
-        public Bundle call() {
-            if (mSearchDialog.isShowing()) {
-                return mSearchDialog.onSaveInstanceState();
-            } else {
-                return null;
-            }
-        }
-    };
-
-    public void onRestoreInstanceState(final Bundle searchDialogState) {
-        if (searchDialogState != null) {
-            mHandler.post(new Runnable() {
-                public void run() {
-                    mSearchDialog.onRestoreInstanceState(searchDialogState);
-                }
-            });
-        }
-    }
-
-    public void onConfigurationChanged(final Configuration newConfig) {
-        mHandler.post(new Runnable() {
-            public void run() {
-                if (mSearchDialog.isShowing()) {
-                    mSearchDialog.onConfigurationChanged(newConfig);
-                }
-            }
-        });
-    }
-
-    /**
-     * Called by {@link SearchDialog} when it goes away.
-     */
-    public void onDismiss(DialogInterface dialog) {
-        if (DBG) debug("onDismiss()");
-        if (mCallback != null) {
-            try {
-                mCallback.onDismiss();
-            } catch (RemoteException ex) {
-                Log.e(TAG, "onDismiss() failed: " + ex);
-            }
-        }
-    }
-
-    /**
-     * Called by {@link SearchDialog} when the user or activity cancels search.
-     * When this is called, {@link #onDismiss} is called too.
-     */
-    public void onCancel(DialogInterface dialog) {
-        if (DBG) debug("onCancel()");
-        if (mCallback != null) {
-            try {
-                mCallback.onCancel();
-            } catch (RemoteException ex) {
-                Log.e(TAG, "onCancel() failed: " + ex);
-            }
-        }
-    }
-
-    /**
-     * Returns a list of the searchable activities that handle web searches.
-     */
-    public List<SearchableInfo> getSearchablesForWebSearch() {
-        updateSearchablesIfDirty();
-        return mSearchables.getSearchablesForWebSearchList();
-    }
-
-    /**
-     * Returns the default searchable activity for web searches.
-     */
-    public SearchableInfo getDefaultSearchableForWebSearch() {
-        updateSearchablesIfDirty();
-        return mSearchables.getDefaultSearchableForWebSearch();
-    }
-
-    /**
-     * Sets the default searchable activity for web searches.
-     */
-    public void setDefaultWebSearch(ComponentName component) {
-        mSearchables.setDefaultWebSearch(component);
-    }
-
-    /**
-     * Runs an operation on the handler for the service, blocks until it returns,
-     * and returns the value returned by the operation.
-     *
-     * @param <V> Return value type.
-     * @param callable Operation to run.
-     * @param errorResult Value to return if the operations throws an exception.
-     * @param name Operation name to include in error log messages.
-     * @return The value returned by the operation.
-     */
-    private <V> V postAndWait(Callable<V> callable, V errorResult, String name) {
-        FutureTask<V> task = new FutureTask<V>(callable);
-        mHandler.post(task);
-        try {
-            return task.get();
-        } catch (InterruptedException ex) {
-            Log.e(TAG, "Error calling " + name + ": " + ex);
-            return errorResult;
-        } catch (ExecutionException ex) {
-            Log.e(TAG, "Error calling " + name + ": " + ex);
-            return errorResult;
-        }
-    }
-
-    private static void debug(String msg) {
-        Thread thread = Thread.currentThread();
-        Log.d(TAG, msg + " (" + thread.getName() + "-" + thread.getId() + ")");
+        return mSearchDialog != null && mSearchDialog.isVisible();
     }
 
 }
diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java
index 8ef1f15..045b0c2 100644
--- a/core/java/android/server/search/SearchableInfo.java
+++ b/core/java/android/server/search/SearchableInfo.java
@@ -67,6 +67,7 @@
     private final int mSearchImeOptions;
     private final boolean mIncludeInGlobalSearch;
     private final boolean mQueryAfterZeroResults;
+    private final boolean mAutoUrlDetect;
     private final String mSettingsDescription;
     private final String mSuggestAuthority;
     private final String mSuggestPath;
@@ -288,6 +289,8 @@
                 com.android.internal.R.styleable.Searchable_includeInGlobalSearch, false);
         mQueryAfterZeroResults = a.getBoolean(
                 com.android.internal.R.styleable.Searchable_queryAfterZeroResults, false);
+        mAutoUrlDetect = a.getBoolean(
+                com.android.internal.R.styleable.Searchable_autoUrlDetect, false);
 
         mSettingsDescription = a.getString(
                 com.android.internal.R.styleable.Searchable_searchSettingsDescription);
@@ -439,6 +442,14 @@
         mActionKeys.put(keyInfo.getKeyCode(), keyInfo);
     }
 
+    /**
+     * Gets search information for the given activity.
+     *
+     * @param context Context to use for reading activity resources.
+     * @param activityInfo Activity to get search information from.
+     * @return Search information about the given activity, or {@code null} if
+     *         the activity has no or invalid searchability meta-data.
+     */
     public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo) {
         // for each component, try to find metadata
         XmlResourceParser xml = 
@@ -667,6 +678,16 @@
     }
 
     /**
+     * Checks whether this searchable activity has auto URL detect turned on.
+     *
+     * @return The value of the <code>autoUrlDetect</code> attribute,
+     *         or <code>false</code> if the attribute is not set.
+     */
+    public boolean autoUrlDetect() {
+        return mAutoUrlDetect;
+    }
+
+    /**
      * Support for parcelable and aidl operations.
      */
     public static final Parcelable.Creator<SearchableInfo> CREATOR
@@ -698,6 +719,7 @@
         mSearchImeOptions = in.readInt();
         mIncludeInGlobalSearch = in.readInt() != 0;
         mQueryAfterZeroResults = in.readInt() != 0;
+        mAutoUrlDetect = in.readInt() != 0;
         
         mSettingsDescription = in.readString();
         mSuggestAuthority = in.readString();
@@ -735,6 +757,7 @@
         dest.writeInt(mSearchImeOptions);
         dest.writeInt(mIncludeInGlobalSearch ? 1 : 0);
         dest.writeInt(mQueryAfterZeroResults ? 1 : 0);
+        dest.writeInt(mAutoUrlDetect ? 1 : 0);
         
         dest.writeString(mSettingsDescription);
         dest.writeString(mSuggestAuthority);
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index c7cc8ed..c615957 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -17,7 +17,6 @@
 package android.server.search;
 
 import com.android.internal.app.ResolverActivity;
-import com.android.internal.R;
 
 import android.app.SearchManager;
 import android.content.ComponentName;
@@ -27,7 +26,6 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.util.Log;
 
@@ -249,7 +247,12 @@
             for (int i = 0; i < webSearchInfoList.size(); ++i) {
                 ActivityInfo ai = webSearchInfoList.get(i).activityInfo;
                 ComponentName component = new ComponentName(ai.packageName, ai.name);
-                newSearchablesForWebSearchList.add(newSearchablesMap.get(component));
+                SearchableInfo searchable = newSearchablesMap.get(component);
+                if (searchable == null) {
+                    Log.w(LOG_TAG, "did not find component in searchables: " + component);
+                } else {
+                    newSearchablesForWebSearchList.add(searchable);
+                }
             }
         }
 
@@ -264,7 +267,7 @@
         }
 
         // Find the default web search provider.
-        ComponentName webSearchActivity = getPreferredWebSearchActivity();
+        ComponentName webSearchActivity = getPreferredWebSearchActivity(mContext);
         SearchableInfo newDefaultSearchableForWebSearch = null;
         if (webSearchActivity != null) {
             newDefaultSearchableForWebSearch = newSearchablesMap.get(webSearchActivity);
@@ -283,9 +286,6 @@
             mDefaultSearchable = newDefaultSearchable;
             mDefaultSearchableForWebSearch = newDefaultSearchableForWebSearch;
         }
-
-        // Inform all listeners that the list of searchables has been updated.
-        mContext.sendBroadcast(new Intent(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED));
     }
 
     /**
@@ -295,9 +295,10 @@
      * @param action Intent action for which this activity is to be set as preferred.
      * @return true if component was detected and set as preferred activity, false if not.
      */
-    private boolean setPreferredActivity(ComponentName component, String action) {
+    private static boolean setPreferredActivity(Context context,
+            ComponentName component, String action) {
         Log.d(LOG_TAG, "Checking component " + component);
-        PackageManager pm = mContext.getPackageManager();
+        PackageManager pm = context.getPackageManager();
         ActivityInfo ai;
         try {
             ai = pm.getActivityInfo(component, 0);
@@ -326,10 +327,10 @@
         return true;
     }
 
-    public ComponentName getPreferredWebSearchActivity() {
+    private static ComponentName getPreferredWebSearchActivity(Context context) {
         // Check if we have a preferred web search activity.
         Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
-        PackageManager pm = mContext.getPackageManager();
+        PackageManager pm = context.getPackageManager();
         ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
 
         if (ri == null || ri.activityInfo.name.equals(ResolverActivity.class.getName())) {
@@ -338,11 +339,11 @@
             // The components in the providers array are checked in the order of declaration so the
             // first one has the highest priority. If the component exists in the system it is set
             // as the preferred activity to handle intent action web search.
-            String[] preferredActivities = mContext.getResources().getStringArray(
+            String[] preferredActivities = context.getResources().getStringArray(
                     com.android.internal.R.array.default_web_search_providers);
             for (String componentName : preferredActivities) {
                 ComponentName component = ComponentName.unflattenFromString(componentName);
-                if (setPreferredActivity(component, Intent.ACTION_WEB_SEARCH)) {
+                if (setPreferredActivity(context, component, Intent.ACTION_WEB_SEARCH)) {
                     return component;
                 }
             }
@@ -354,7 +355,8 @@
             if (cn.flattenToShortString().equals(GOOGLE_SEARCH_COMPONENT_NAME)) {
                 ComponentName enhancedGoogleSearch = ComponentName.unflattenFromString(
                         ENHANCED_GOOGLE_SEARCH_COMPONENT_NAME);
-                if (setPreferredActivity(enhancedGoogleSearch, Intent.ACTION_WEB_SEARCH)) {
+                if (setPreferredActivity(context, enhancedGoogleSearch,
+                        Intent.ACTION_WEB_SEARCH)) {
                     return enhancedGoogleSearch;
                 }
             }
@@ -397,7 +399,7 @@
      * Sets the default searchable activity for web searches.
      */
     public synchronized void setDefaultWebSearch(ComponentName component) {
-        setPreferredActivity(component, Intent.ACTION_WEB_SEARCH);
+        setPreferredActivity(mContext, component, Intent.ACTION_WEB_SEARCH);
         buildSearchableList();
     }
 }
diff --git a/core/java/android/speech/tts/ITts.aidl b/core/java/android/speech/tts/ITts.aidl
index c9a6180..1812188 100755
--- a/core/java/android/speech/tts/ITts.aidl
+++ b/core/java/android/speech/tts/ITts.aidl
@@ -27,37 +27,37 @@
  * {@hide}

  */

 interface ITts {

-    int setSpeechRate(in int speechRate);

+    int setSpeechRate(in String callingApp, in int speechRate);

 

-    int setPitch(in int pitch);

+    int setPitch(in String callingApp, in int pitch);

 

-    int speak(in String text, in int queueMode, in String[] params);

+    int speak(in String callingApp, in String text, in int queueMode, in String[] params);

 

     boolean isSpeaking();

 

-    int stop();

+    int stop(in String callingApp);

 

-    void addSpeech(in String text, in String packageName, in int resId);

+    void addSpeech(in String callingApp, in String text, in String packageName, in int resId);

 

-    void addSpeechFile(in String text, in String filename);

+    void addSpeechFile(in String callingApp, in String text, in String filename);

 

     String[] getLanguage();

 

     int isLanguageAvailable(in String language, in String country, in String variant);

 

-    int setLanguage(in String language, in String country, in String variant);

+    int setLanguage(in String callingApp, in String language, in String country, in String variant);

 

-    boolean synthesizeToFile(in String text, in String[] params, in String outputDirectory);

+    boolean synthesizeToFile(in String callingApp, in String text, in String[] params, in String outputDirectory);

 

-    int playEarcon(in String earcon, in int queueMode, in String[] params);

+    int playEarcon(in String callingApp, in String earcon, in int queueMode, in String[] params);

 

-    void addEarcon(in String earcon, in String packageName, in int resId);

+    void addEarcon(in String callingApp, in String earcon, in String packageName, in int resId);

 

-    void addEarconFile(in String earcon, in String filename);

+    void addEarconFile(in String callingApp, in String earcon, in String filename);

 

-    void registerCallback(ITtsCallback cb);

+    int registerCallback(in String callingApp, ITtsCallback cb);

 

-    void unregisterCallback(ITtsCallback cb);

+    int unregisterCallback(in String callingApp, ITtsCallback cb);

 

-    int playSilence(in long duration, in int queueMode, in String[] params);

+    int playSilence(in String callingApp, in long duration, in int queueMode, in String[] params);

 }

diff --git a/core/java/android/speech/tts/ITtsCallback.aidl b/core/java/android/speech/tts/ITtsCallback.aidl
index 48ed73e..c9898eb 100755
--- a/core/java/android/speech/tts/ITtsCallback.aidl
+++ b/core/java/android/speech/tts/ITtsCallback.aidl
@@ -23,5 +23,5 @@
  * {@hide}
  */
 oneway interface ITtsCallback {
-    void markReached(String mark);
+    void utteranceCompleted(String utteranceId);
 }
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
old mode 100644
new mode 100755
index 616b3f1..bb6b4b0
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.media.AudioManager;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.util.Log;
@@ -98,40 +99,146 @@
     }
 
     /**
+     * Called when the TTS has completed saying something that has an utterance ID set.
+     *
+     * The OnUtteranceCompletedListener must implement the onUtteranceCompleted function.
+     * onUtteranceCompleted is passed a String that is the utteranceId given in
+     * the original speak call.
+     */
+    public interface OnUtteranceCompletedListener {

+        public void onUtteranceCompleted(String utteranceId);

+    }
+
+
+    /**
      * Internal constants for the TTS functionality
      *
-     * {@hide}
      */
     public class Engine {
         // default values for a TTS engine when settings are not found in the provider
+        /**
+         * {@hide}
+         */
         public static final int FALLBACK_TTS_DEFAULT_RATE = 100; // 1x
+        /**
+         * {@hide}
+         */
         public static final int FALLBACK_TTS_DEFAULT_PITCH = 100;// 1x
+        /**
+         * {@hide}
+         */
         public static final int FALLBACK_TTS_USE_DEFAULTS = 0; // false
-        public static final String FALLBACK_TTS_DEFAULT_LANG = "eng";
-        public static final String FALLBACK_TTS_DEFAULT_COUNTRY = "";
-        public static final String FALLBACK_TTS_DEFAULT_VARIANT = "";
+        /**
+         * {@hide}
+         */
+        public static final String FALLBACK_TTS_DEFAULT_SYNTH = "com.svox.pico";
+
+        // default values for rendering
+        public static final int TTS_DEFAULT_STREAM = AudioManager.STREAM_MUSIC;
 
         // return codes for a TTS engine's check data activity
+        /**
+         * Indicates success when checking the installation status of the resources used by the
+         * text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent.
+         */
         public static final int CHECK_VOICE_DATA_PASS = 1;
+        /**
+         * Indicates failure when checking the installation status of the resources used by the
+         * text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent.
+         */
         public static final int CHECK_VOICE_DATA_FAIL = 0;
+        /**
+         * Indicates erroneous data when checking the installation status of the resources used by
+         * the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent.
+         */
         public static final int CHECK_VOICE_DATA_BAD_DATA = -1;
+        /**
+         * Indicates missing resources when checking the installation status of the resources used
+         * by the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent.
+         */
         public static final int CHECK_VOICE_DATA_MISSING_DATA = -2;
-        public static final int CHECK_VOICE_DATA_MISSING_DATA_NO_SDCARD = -3;
+        /**
+         * Indicates missing storage volume when checking the installation status of the resources
+         * used by the text-to-speech engine with the android.intent.action.CHECK_TTS_DATA intent.
+         */
+        public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3;
 
         // return codes for a TTS engine's check data activity
+        /**
+         * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where
+         * the text-to-speech engine specifies the path to its resources.
+         */
         public static final String VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
+        /**
+         * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where
+         * the text-to-speech engine specifies the file names of its resources under the
+         * resource path.
+         */
         public static final String VOICE_DATA_FILES = "dataFiles";
+        /**
+         * Extra information received with the android.intent.action.CHECK_TTS_DATA intent where
+         * the text-to-speech engine specifies the locale associated with each resource file.
+         */
         public static final String VOICE_DATA_FILES_INFO = "dataFilesInfo";
 
-        // keys for the parameters passed with speak commands
+        // keys for the parameters passed with speak commands. Hidden keys are used internally
+        // to maintain engine state for each TextToSpeech instance.
+        /**
+         * {@hide}
+         */
         public static final String TTS_KEY_PARAM_RATE = "rate";
+        /**
+         * {@hide}
+         */
         public static final String TTS_KEY_PARAM_LANGUAGE = "language";
+        /**
+         * {@hide}
+         */
         public static final String TTS_KEY_PARAM_COUNTRY = "country";
+        /**
+         * {@hide}
+         */
         public static final String TTS_KEY_PARAM_VARIANT = "variant";
-        public static final int TTS_PARAM_POSITION_RATE = 0;
-        public static final int TTS_PARAM_POSITION_LANGUAGE = 2;
-        public static final int TTS_PARAM_POSITION_COUNTRY = 4;
-        public static final int TTS_PARAM_POSITION_VARIANT = 6;
+        /**
+         * Parameter key to specify the audio stream type to be used when speaking text
+         * or playing back a file.
+         */
+        public static final String TTS_KEY_PARAM_STREAM = "streamType";
+        /**
+         * Parameter key to identify an utterance in the completion listener after text has been
+         * spoken, a file has been played back or a silence duration has elapsed.
+         */
+        public static final String TTS_KEY_PARAM_UTTERANCE_ID = "utteranceId";
+
+        // key positions in the array of cached parameters
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_RATE = 0;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_LANGUAGE = 2;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_COUNTRY = 4;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_VARIANT = 6;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_STREAM = 8;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_PARAM_POSITION_UTTERANCE_ID = 10;
+        /**
+         * {@hide}
+         */
+        protected static final int TTS_NB_CACHED_PARAMS = 6;
     }
 
     /**
@@ -140,7 +247,9 @@
     private ServiceConnection mServiceConnection;
 
     private ITts mITts = null;
+    private ITtsCallback mITtscallback = null;
     private Context mContext = null;
+    private String mPackageName = "";
     private OnInitListener mInitListener = null;
     private boolean mStarted = false;
     private final Object mStartLock = new Object();
@@ -161,13 +270,16 @@
      */
     public TextToSpeech(Context context, OnInitListener listener) {
         mContext = context;
+        mPackageName = mContext.getPackageName();
         mInitListener = listener;
 
-        mCachedParams = new String[2*4]; // 4 parameters, store key and value
+        mCachedParams = new String[2*Engine.TTS_NB_CACHED_PARAMS]; // store key and value
         mCachedParams[Engine.TTS_PARAM_POSITION_RATE] = Engine.TTS_KEY_PARAM_RATE;
         mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE] = Engine.TTS_KEY_PARAM_LANGUAGE;
         mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY] = Engine.TTS_KEY_PARAM_COUNTRY;
         mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT] = Engine.TTS_KEY_PARAM_VARIANT;
+        mCachedParams[Engine.TTS_PARAM_POSITION_STREAM] = Engine.TTS_KEY_PARAM_STREAM;
+        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID] = Engine.TTS_KEY_PARAM_UTTERANCE_ID;
 
         mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] =
                 String.valueOf(Engine.FALLBACK_TTS_DEFAULT_RATE);
@@ -177,6 +289,10 @@
         mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country();
         mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant();
 
+        mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] =
+                String.valueOf(Engine.TTS_DEFAULT_STREAM);
+        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = "";
+
         initTts();
     }
 
@@ -263,18 +379,24 @@
                 return TTS_ERROR;
             }
             try {
-                mITts.addSpeech(text, packagename, resourceId);
+                mITts.addSpeech(mPackageName, text, packagename, resourceId);
                 return TTS_SUCCESS;
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             }
@@ -301,18 +423,127 @@
                 return TTS_ERROR;
             }
             try {
-                mITts.addSpeechFile(text, filename);
+                mITts.addSpeechFile(mPackageName, text, filename);
                 return TTS_SUCCESS;
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - addSpeech", "IllegalStateException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            }
+            return TTS_ERROR;
+        }
+    }
+
+
+    /**
+     * Adds a mapping between a string of text and a sound resource in a
+     * package.
+     *
+     * @see #TTS.playEarcon(String earcon, int queueMode, String[] params)
+     *
+     * @param earcon The name of the earcon
+     *            Example: <b><code>"[tick]"</code></b><br/>
+     *
+     * @param packagename
+     *            Pass the packagename of the application that contains the
+     *            resource. If the resource is in your own application (this is
+     *            the most common case), then put the packagename of your
+     *            application here.<br/>
+     *            Example: <b>"com.google.marvin.compass"</b><br/>
+     *            The packagename can be found in the AndroidManifest.xml of
+     *            your application.
+     *            <p>
+     *            <code>&lt;manifest xmlns:android=&quot;...&quot;
+     *      package=&quot;<b>com.google.marvin.compass</b>&quot;&gt;</code>
+     *            </p>
+     *
+     * @param resourceId
+     *            Example: <b><code>R.raw.tick_snd</code></b>
+     *
+     * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS.
+     */
+    public int addEarcon(String earcon, String packagename, int resourceId) {
+        synchronized(mStartLock) {
+            if (!mStarted) {
+                return TTS_ERROR;
+            }
+            try {
+                mITts.addEarcon(mPackageName, earcon, packagename, resourceId);
+                return TTS_SUCCESS;
+            } catch (RemoteException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            }
+            return TTS_ERROR;
+        }
+    }
+
+
+    /**
+     * Adds a mapping between a string of text and a sound file. Using this, it
+     * is possible to add custom earcons.
+     *
+     * @param earcon
+     *            The name of the earcon
+     * @param filename
+     *            The full path to the sound file (for example:
+     *            "/sdcard/mysounds/tick.wav")
+     *
+     * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS.
+     */
+    public int addEarcon(String earcon, String filename) {
+        synchronized (mStartLock) {
+            if (!mStarted) {
+                return TTS_ERROR;
+            }
+            try {
+                mITts.addEarconFile(mPackageName, earcon, filename);
+                return TTS_SUCCESS;
+            } catch (RemoteException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - addEarcon", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             }
@@ -347,22 +578,38 @@
                 return result;
             }
             try {
-                // TODO support extra parameters, passing cache of current parameters for the moment
-                result = mITts.speak(text, queueMode, mCachedParams);
+                if ((params != null) && (!params.isEmpty())) {
+                    String extra = params.get(Engine.TTS_KEY_PARAM_STREAM);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = extra;
+                    }
+                    extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra;
+                    }
+                }
+                result = mITts.speak(mPackageName, text, queueMode, mCachedParams);
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - speak", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - speak", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - speak", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
-              return result;
+                resetCachedParams();
+                return result;
             }
         }
     }
@@ -388,22 +635,38 @@
                 return result;
             }
             try {
-                // TODO support extra parameters, passing null for the moment
-                result = mITts.playEarcon(earcon, queueMode, null);
+                if ((params != null) && (!params.isEmpty())) {
+                    String extra = params.get(Engine.TTS_KEY_PARAM_STREAM);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] = extra;
+                    }
+                    extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra;
+                    }
+                }
+                result = mITts.playEarcon(mPackageName, earcon, queueMode, null);
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playEarcon", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playEarcon", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playEarcon", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
-              return result;
+                resetCachedParams();
+                return result;
             }
         }
     }
@@ -419,25 +682,36 @@
      *
      * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS.
      */
-    public int playSilence(long durationInMs, int queueMode) {
+    public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) {
         synchronized (mStartLock) {
             int result = TTS_ERROR;
             if (!mStarted) {
                 return result;
             }
             try {
-                // TODO support extra parameters, passing cache of current parameters for the moment
-                result = mITts.playSilence(durationInMs, queueMode, mCachedParams);
+                if ((params != null) && (!params.isEmpty())) {
+                    String extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra;
+                    }
+                }
+                result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams);
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playSilence", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playSilence", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - playSilence", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -461,14 +735,20 @@
                 return mITts.isSpeaking();
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - isSpeaking", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - isSpeaking", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - isSpeaking", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             }
@@ -489,17 +769,23 @@
                 return result;
             }
             try {
-                result = mITts.stop();
+                result = mITts.stop(mPackageName);
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - stop", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - stop", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - stop", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -534,10 +820,24 @@
                 if (speechRate > 0) {
                     int rate = (int)(speechRate*100);
                     mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] = String.valueOf(rate);
-                    result = mITts.setSpeechRate(rate);
+                    // the rate is not set here, instead it is cached so it will be associated
+                    // with all upcoming utterances.
+                    if (speechRate > 0.0f) {
+                        result = TTS_SUCCESS;
+                    } else {
+                        result = TTS_ERROR;
+                    }
                 }
-            } catch (RemoteException e) {
+            } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - setSpeechRate", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -570,10 +870,24 @@
             }
             try {
                 if (pitch > 0) {
-                    result = mITts.setPitch((int)(pitch*100));
+                    result = mITts.setPitch(mPackageName, (int)(pitch*100));
                 }
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - setPitch", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - setPitch", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - setPitch", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -593,7 +907,9 @@
      * @param loc
      *            The locale describing the language to be used.
      *
-     * @return Code indicating the support status for the locale. See the TTS_LANG_ codes.
+     * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+     *         {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+     *         {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
      */
     public int setLanguage(Locale loc) {
         synchronized (mStartLock) {
@@ -605,10 +921,27 @@
                 mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language();
                 mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country();
                 mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = loc.getVariant();
-                result = mITts.setLanguage(mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1],
+
+                result = mITts.setLanguage(mPackageName,
+                        mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1],
                         mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1],
                         mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] );
+            } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - setLanguage", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - setLanguage", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - setLanguage", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -637,6 +970,20 @@
                 }
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - getLanguage", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - getLanguage", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - getLanguage", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             }
@@ -650,8 +997,9 @@
      * @param loc
      *            The Locale describing the language to be used.
      *
-     * @return one of TTS_LANG_NOT_SUPPORTED, TTS_LANG_MISSING_DATA, TTS_LANG_AVAILABLE,
-     *         TTS_LANG_COUNTRY_AVAILABLE, TTS_LANG_COUNTRY_VAR_AVAILABLE.
+     * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+     *         {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+     *         {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
      */
     public int isLanguageAvailable(Locale loc) {
         synchronized (mStartLock) {
@@ -664,6 +1012,20 @@
                         loc.getISO3Country(), loc.getVariant());
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - isLanguageAvailable", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - isLanguageAvailable", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - isLanguageAvailable", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
@@ -694,26 +1056,98 @@
                 return result;
             }
             try {
-                // TODO support extra parameters, passing null for the moment
-                if (mITts.synthesizeToFile(text, null, filename)){
+                if ((params != null) && (!params.isEmpty())) {
+                    // no need to read the stream type here
+                    String extra = params.get(Engine.TTS_KEY_PARAM_UTTERANCE_ID);
+                    if (extra != null) {
+                        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID + 1] = extra;
+                    }
+                }
+                if (mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename)){
                     result = TTS_SUCCESS;
                 }
             } catch (RemoteException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - synthesizeToFile", "RemoteException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (NullPointerException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - synthesizeToFile", "NullPointerException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } catch (IllegalStateException e) {
                 // TTS died; restart it.
+                Log.e("TextToSpeech.java - synthesizeToFile", "IllegalStateException");
+                e.printStackTrace();
                 mStarted = false;
                 initTts();
             } finally {
-              return result;
+                resetCachedParams();
+                return result;
             }
         }
     }
 
+
+    /**
+     * Convenience method to reset the cached parameters to the current default values
+     * if they are not persistent between calls to the service.
+     */
+    private void resetCachedParams() {
+        mCachedParams[Engine.TTS_PARAM_POSITION_STREAM + 1] =
+                String.valueOf(Engine.TTS_DEFAULT_STREAM);
+        mCachedParams[Engine.TTS_PARAM_POSITION_UTTERANCE_ID+ 1] = "";
+    }
+
+    /**
+     * Sets the OnUtteranceCompletedListener that will fire when an utterance completes.
+     *
+     * @param listener
+     *            The OnUtteranceCompletedListener
+     *
+     * @return Code indicating success or failure. See TTS_ERROR and TTS_SUCCESS.
+     */
+    public int setOnUtteranceCompletedListener(

+            final OnUtteranceCompletedListener listener) {

+        synchronized (mStartLock) {
+            int result = TTS_ERROR;
+            if (!mStarted) {
+                return result;
+            }
+            mITtscallback = new ITtsCallback.Stub() {
+                public void utteranceCompleted(String utteranceId) throws RemoteException {

+                    if (listener != null) {

+                        listener.onUtteranceCompleted(utteranceId);

+                    }

+                }

+            };
+            try {
+                result = mITts.registerCallback(mPackageName, mITtscallback);
+            } catch (RemoteException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - registerCallback", "RemoteException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (NullPointerException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - registerCallback", "NullPointerException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } catch (IllegalStateException e) {
+                // TTS died; restart it.
+                Log.e("TextToSpeech.java - registerCallback", "IllegalStateException");
+                e.printStackTrace();
+                mStarted = false;
+                initTts();
+            } finally {
+                return result;
+            }
+        }

+    }
+
 }
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index 70e1297..380e5fd 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -25,6 +25,7 @@
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 
+import android.content.res.ColorStateList;
 import android.content.res.Resources;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
@@ -40,6 +41,7 @@
 import android.text.style.StyleSpan;
 import android.text.style.SubscriptSpan;
 import android.text.style.SuperscriptSpan;
+import android.text.style.TextAppearanceSpan;
 import android.text.style.TypefaceSpan;
 import android.text.style.URLSpan;
 import android.text.style.UnderlineSpan;
@@ -49,6 +51,7 @@
 import java.io.IOException;
 import java.io.StringReader;
 import java.nio.CharBuffer;
+import java.util.HashMap;
 
 /**
  * This class processes HTML strings into displayable styled text.
@@ -633,53 +636,24 @@
         if (where != len) {
             Font f = (Font) obj;
 
-            if (f.mColor != null) {
-                int c = -1;
-
-                if (f.mColor.equalsIgnoreCase("aqua")) {
-                    c = 0x00FFFF;
-                } else if (f.mColor.equalsIgnoreCase("black")) {
-                    c = 0x000000;
-                } else if (f.mColor.equalsIgnoreCase("blue")) {
-                    c = 0x0000FF;
-                } else if (f.mColor.equalsIgnoreCase("fuchsia")) {
-                    c = 0xFF00FF;
-                } else if (f.mColor.equalsIgnoreCase("green")) {
-                    c = 0x008000;
-                } else if (f.mColor.equalsIgnoreCase("grey")) {
-                    c = 0x808080;
-                } else if (f.mColor.equalsIgnoreCase("lime")) {
-                    c = 0x00FF00;
-                } else if (f.mColor.equalsIgnoreCase("maroon")) {
-                    c = 0x800000;
-                } else if (f.mColor.equalsIgnoreCase("navy")) {
-                    c = 0x000080;
-                } else if (f.mColor.equalsIgnoreCase("olive")) {
-                    c = 0x808000;
-                } else if (f.mColor.equalsIgnoreCase("purple")) {
-                    c = 0x800080;
-                } else if (f.mColor.equalsIgnoreCase("red")) {
-                    c = 0xFF0000;
-                } else if (f.mColor.equalsIgnoreCase("silver")) {
-                    c = 0xC0C0C0;
-                } else if (f.mColor.equalsIgnoreCase("teal")) {
-                    c = 0x008080;
-                } else if (f.mColor.equalsIgnoreCase("white")) {
-                    c = 0xFFFFFF;
-                } else if (f.mColor.equalsIgnoreCase("yellow")) {
-                    c = 0xFFFF00;
-                } else {
-                    try {
-                        c = XmlUtils.convertValueToInt(f.mColor, -1);
-                    } catch (NumberFormatException nfe) {
-                        // Can't understand the color, so just drop it.
+            if (!TextUtils.isEmpty(f.mColor)) {
+                if (f.mColor.startsWith("@")) {
+                    Resources res = Resources.getSystem();
+                    String name = f.mColor.substring(1);
+                    int colorRes = res.getIdentifier(name, "color", "android");
+                    if (colorRes != 0) {
+                        ColorStateList colors = res.getColorStateList(colorRes);
+                        text.setSpan(new TextAppearanceSpan(null, 0, 0, colors, null),
+                                where, len,
+                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                     }
-                }
-
-                if (c != -1) {
-                    text.setSpan(new ForegroundColorSpan(c | 0xFF000000),
-                                 where, len,
-                                 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                } else {
+                    int c = getHtmlColor(f.mColor);
+                    if (c != -1) {
+                        text.setSpan(new ForegroundColorSpan(c | 0xFF000000),
+                                where, len,
+                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                    }
                 }
             }
 
@@ -843,4 +817,47 @@
             mLevel = level;
         }
     }
+
+    private static HashMap<String,Integer> COLORS = buildColorMap();
+
+    private static HashMap<String,Integer> buildColorMap() {
+        HashMap<String,Integer> map = new HashMap<String,Integer>();
+        map.put("aqua", 0x00FFFF);
+        map.put("black", 0x000000);
+        map.put("blue", 0x0000FF);
+        map.put("fuchsia", 0xFF00FF);
+        map.put("green", 0x008000);
+        map.put("grey", 0x808080);
+        map.put("lime", 0x00FF00);
+        map.put("maroon", 0x800000);
+        map.put("navy", 0x000080);
+        map.put("olive", 0x808000);
+        map.put("purple", 0x800080);
+        map.put("red", 0xFF0000);
+        map.put("silver", 0xC0C0C0);
+        map.put("teal", 0x008080);
+        map.put("white", 0xFFFFFF);
+        map.put("yellow", 0xFFFF00);
+        return map;
+    }
+
+    /**
+     * Converts an HTML color (named or numeric) to an integer RGB value.
+     *
+     * @param color Non-null color string.
+     * @return A color value, or {@code -1} if the color string could not be interpreted.
+     */
+    private static int getHtmlColor(String color) {
+        Integer i = COLORS.get(color.toLowerCase());
+        if (i != null) {
+            return i;
+        } else {
+            try {
+                return XmlUtils.convertValueToInt(color, -1);
+            } catch (NumberFormatException nfe) {
+                return -1;
+            }
+        }
+      }
+
 }
diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java
index 4179edb..bfab49d 100644
--- a/core/java/android/util/DisplayMetrics.java
+++ b/core/java/android/util/DisplayMetrics.java
@@ -27,17 +27,31 @@
  */
 public class DisplayMetrics {
     /**
-     * The reference density used throughout the system.
-     * 
-     * @hide Pending API council approval
+     * Standard quantized DPI for low-density screens.
      */
-    public static final int DEFAULT_DENSITY = 160;
+    public static final int DENSITY_LOW = 120;
+
+    /**
+     * Standard quantized DPI for medium-density screens.
+     */
+    public static final int DENSITY_MEDIUM = 160;
+
+    /**
+     * Standard quantized DPI for high-density screens.
+     */
+    public static final int DENSITY_HIGH = 240;
+
+    /**
+     * The reference density used throughout the system.
+     */
+    public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
 
     /**
      * The device's density.
-     * @hide
+     * @hide becase eventually this should be able to change while
+     * running, so shouldn't be a constant.
      */
-    public static final int DEVICE_DENSITY = getDeviceDensity();
+    public static final int DENSITY_DEVICE = getDeviceDensity();
 
     /**
      * The absolute width of the display in pixels.
@@ -62,7 +76,7 @@
      * 320x480 but the screen size remained 1.5"x2" then the density would be 
      * increased (probably to 1.5).
      *
-     * @see #DEFAULT_DENSITY
+     * @see #DENSITY_DEFAULT
      */
     public float density;
     /**
@@ -95,10 +109,10 @@
     public void setToDefaults() {
         widthPixels = 0;
         heightPixels = 0;
-        density = DEVICE_DENSITY / (float) DEFAULT_DENSITY;
+        density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
         scaledDensity = density;
-        xdpi = DEVICE_DENSITY;
-        ydpi = DEVICE_DENSITY;
+        xdpi = DENSITY_DEVICE;
+        ydpi = DENSITY_DEVICE;
     }
 
     /**
@@ -109,7 +123,6 @@
      */
     public void updateMetrics(CompatibilityInfo compatibilityInfo, int orientation,
             int screenLayout) {
-        int xOffset = 0;
         if (!compatibilityInfo.isConfiguredExpandable()) {
             // Note: this assume that configuration is updated before calling
             // updateMetrics method.
@@ -142,7 +155,6 @@
                 
                 if (defaultWidth < widthPixels) {
                     // content/window's x offset in original pixels
-                    xOffset = ((widthPixels - defaultWidth) / 2);
                     widthPixels = defaultWidth;
                 }
                 if (defaultHeight < heightPixels) {
@@ -154,7 +166,6 @@
                 compatibilityInfo.setExpandable(true);
             }
         }
-        compatibilityInfo.setVisibleRect(xOffset, widthPixels, heightPixels);
         if (compatibilityInfo.isScalingRequired()) {
             float invertedRatio = compatibilityInfo.applicationInvertedScale;
             density *= invertedRatio;
@@ -179,6 +190,6 @@
         // The reason for this is that ro.sf.lcd_density is write-once and is
         // set by the init process when it parses build.prop before anything else.
         return SystemProperties.getInt("qemu.sf.lcd_density",
-                SystemProperties.getInt("ro.sf.lcd_density", DEFAULT_DENSITY));
+                SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));
     }
 }
diff --git a/core/java/android/util/TypedValue.java b/core/java/android/util/TypedValue.java
index d4ba9e2..ed45298 100644
--- a/core/java/android/util/TypedValue.java
+++ b/core/java/android/util/TypedValue.java
@@ -140,12 +140,16 @@
 
     /**
      * If {@link #density} is equal to this value, then the density should be
-     * treated as the system's default density value: {@link DisplayMetrics#DEFAULT_DENSITY}.
-     *
-     * @hide Pending API council approval
+     * treated as the system's default density value: {@link DisplayMetrics#DENSITY_DEFAULT}.
      */
     public static final int DENSITY_DEFAULT = 0;
 
+    /**
+     * If {@link #density} is equal to this value, then there is no density
+     * associated with the resource and it should not be scaled.
+     */
+    public static final int DENSITY_NONE = 0xffff;
+
     /* ------------------------------------------------------------ */
 
     /** The type held by this value, as defined by the constants here.
@@ -171,8 +175,6 @@
 
     /**
      * If the Value came from a resource, this holds the corresponding pixel density.
-     * 
-     * @hide Pending API council approval
      * */
     public int density;
 
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 09ebeed5..5551f64 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -117,5 +117,32 @@
     
     private static final Object mStaticInit = new Object();
     private static boolean mInitialized = false;
+
+    /**
+     * Returns a display object which uses the metric's width/height instead.
+     * @hide
+     */
+    public static Display createMetricsBasedDisplay(int displayId, DisplayMetrics metrics) {
+        return new CompatibleDisplay(displayId, metrics);
+    }
+
+    private static class CompatibleDisplay extends Display {
+        private final DisplayMetrics mMetrics;
+
+        private CompatibleDisplay(int displayId, DisplayMetrics metrics) {
+            super(displayId);
+            mMetrics = metrics;
+        }
+
+        @Override
+        public int getWidth() {
+            return mMetrics.widthPixels;
+        }
+
+        @Override
+        public int getHeight() {
+            return mMetrics.heightPixels;
+        }
+    }
 }
 
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 45b0f0a..aa701af 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -17,7 +17,6 @@
 package android.view;
 
 import android.content.Context;
-import android.content.res.CompatibilityInfo;
 import android.content.res.CompatibilityInfo.Translator;
 import android.graphics.Canvas;
 import android.graphics.PixelFormat;
@@ -256,9 +255,9 @@
     public boolean dispatchTouchEvent(MotionEvent event) {
         // SurfaceView uses pre-scaled size unless fixed size is requested. This hook
         // scales the event back to the pre-scaled coordinates for such surface.
-        if (mRequestedWidth < 0 && mTranslator != null) {
+        if (mScaled) {
             MotionEvent scaledBack = MotionEvent.obtain(event);
-            scaledBack.scale(mTranslator.applicationScale);
+            mTranslator.translateEventInScreenToAppWindow(event);
             try {
                 return super.dispatchTouchEvent(scaledBack);
             } finally {
@@ -290,12 +289,15 @@
     public void setWindowType(int type) {
         mWindowType = type;
     }
+
+    boolean mScaled = false;
     
     private void updateWindow(boolean force) {
         if (!mHaveFrame) {
             return;
         }
-        mTranslator = ((ViewRoot)getRootView().getParent()).mTranslator;
+        ViewRoot viewRoot = (ViewRoot) getRootView().getParent();
+        mTranslator = viewRoot.mTranslator;
 
         float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale;
         
@@ -306,9 +308,12 @@
 
         // Use original size if the app specified the size of the view,
         // and let the flinger to scale up.
-        if (mRequestedWidth <= 0 && mTranslator != null && mTranslator.scalingRequired) {
+        if (mRequestedWidth <= 0 && mTranslator != null) {
             myWidth *= appScale;
             myHeight *= appScale;
+            mScaled = true;
+        } else {
+            mScaled = false;
         }
 
         getLocationInWindow(mLocation);
@@ -352,8 +357,10 @@
                               | WindowManager.LayoutParams.FLAG_SCALED
                               | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                               | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
-                              | WindowManager.LayoutParams.FLAG_NO_COMPATIBILITY_SCALING
                               ;
+                if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) {
+                    mLayout.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+                }
 
                 mLayout.memoryType = mRequestedType;
 
@@ -533,6 +540,7 @@
     private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
         
         private static final String LOG_TAG = "SurfaceHolder";
+        private int mSaveCount;
         
         public boolean isCreating() {
             return mIsCreating;
@@ -627,6 +635,10 @@
             if (localLOGV) Log.i(TAG, "Returned canvas: " + c);
             if (c != null) {
                 mLastLockTime = SystemClock.uptimeMillis();
+                if (mScaled) {
+                    mSaveCount = c.save();
+                    mTranslator.translateCanvas(c);
+                }
                 return c;
             }
             
@@ -649,6 +661,9 @@
         }
 
         public void unlockCanvasAndPost(Canvas canvas) {
+            if (mScaled) {
+                canvas.restoreToCount(mSaveCount);
+            }
             mSurface.unlockCanvasAndPost(canvas);
             mSurfaceLock.unlock();
         }
diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java
index 6f6e224..301d604 100644
--- a/core/java/android/view/ViewRoot.java
+++ b/core/java/android/view/ViewRoot.java
@@ -385,6 +385,7 @@
             if (mView == null) {
                 mView = view;
                 mWindowAttributes.copyFrom(attrs);
+                attrs = mWindowAttributes;
 
                 CompatibilityInfo compatibilityInfo =
                         mView.getContext().getResources().getCompatibilityInfo();
@@ -397,11 +398,14 @@
                 }
                 if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs);
 
+                if (!compatibilityInfo.supportsScreen()) {
+                    attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
+                }
+
                 mSoftInputMode = attrs.softInputMode;
                 mWindowAttributesChanged = true;
                 mAttachInfo.mRootView = view;
-                mAttachInfo.mScalingRequired =
-                        mTranslator == null ? false : mTranslator.scalingRequired;
+                mAttachInfo.mScalingRequired = mTranslator == null ? false : true;
                 mAttachInfo.mApplicationScale =
                         mTranslator == null ? 1.0f : mTranslator.applicationScale;
                 if (panelParentView != null) {
@@ -493,8 +497,12 @@
     void setLayoutParams(WindowManager.LayoutParams attrs, boolean newView) {
         synchronized (this) {
             int oldSoftInputMode = mWindowAttributes.softInputMode;
+            // preserve compatible window flag if exists.
+            int compatibleWindowFlag =
+                mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
             mWindowAttributes.copyFrom(attrs);
-
+            mWindowAttributes.flags |= compatibleWindowFlag;
+            
             if (newView) {
                 mSoftInputMode = attrs.softInputMode;
                 requestLayout();
@@ -1297,7 +1305,8 @@
                 if (DEBUG_DRAW) {
                     Context cxt = mView.getContext();
                     Log.i(TAG, "Drawing: package:" + cxt.getPackageName() +
-                            ", metrics=" + mView.getContext().getResources().getDisplayMetrics());
+                            ", metrics=" + cxt.getResources().getDisplayMetrics() +
+                            ", compatibilityInfo=" + cxt.getResources().getCompatibilityInfo());
                 }
                 int saveCount = canvas.save(Canvas.MATRIX_SAVE_FLAG);
                 try {
@@ -1363,6 +1372,15 @@
             // is non-null and we just want to scroll to whatever that
             // rectangle is).
             View focus = mRealFocusedView;
+
+            // When in touch mode, focus points to the previously focused view,
+            // which may have been removed from the view hierarchy. The following
+            // line checks whether the view is still in the hierarchy
+            if (focus == null || focus.getParent() == null) {
+                mRealFocusedView = null;
+                return false;
+            }
+
             if (focus != mLastScrolledFocus) {
                 // If the focus has changed, then ignore any requests to scroll
                 // to a rectangle; first we want to make sure the entire focus
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index d7457a0..576c8c1 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -358,6 +358,8 @@
     private class LocalWindowManager implements WindowManager {
         LocalWindowManager(WindowManager wm) {
             mWindowManager = wm;
+            mDefaultDisplay = mContext.getResources().getDefaultDisplay(
+                    mWindowManager.getDefaultDisplay());
         }
 
         public final void addView(View view, ViewGroup.LayoutParams params) {
@@ -420,10 +422,12 @@
         }
 
         public Display getDefaultDisplay() {
-            return mWindowManager.getDefaultDisplay();
+            return mDefaultDisplay;
         }
         
-        WindowManager mWindowManager;
+        private final WindowManager mWindowManager;
+
+        private final Display mDefaultDisplay;
     }
 
     /**
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index bdb86d7..6a26a31 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -483,11 +483,12 @@
          * {@hide} */
         public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;
 
-        /** Window flag: special flag to let a window ignore the compatibility scaling.
-         * This is used by SurfaceView to create a window that does not scale the content.
+        /** Window flag: special flag to limit the size of the window to be
+         * original size ([320x480] x density). Used to create window for applications
+         * running under compatibility mode.
          *
          * {@hide} */
-        public static final int FLAG_NO_COMPATIBILITY_SCALING = 0x00100000;
+        public static final int FLAG_COMPATIBLE_WINDOW = 0x00100000;
 
         /** Window flag: a special option intended for system dialogs.  When
          * this flag is set, the window will demand focus unconditionally when
@@ -978,6 +979,9 @@
                 sb.append(" or=");
                 sb.append(screenOrientation);
             }
+            if ((flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+                sb.append(" compatible=true");
+            }
             sb.append('}');
             return sb.toString();
         }
diff --git a/core/java/android/webkit/GearsPermissionsManager.java b/core/java/android/webkit/GearsPermissionsManager.java
new file mode 100644
index 0000000..e70e449
--- /dev/null
+++ b/core/java/android/webkit/GearsPermissionsManager.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.database.ContentObserver;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.database.sqlite.SQLiteStatement;
+import android.os.Handler;
+import android.preference.PreferenceManager;
+import android.provider.Settings;
+import android.util.Log;
+
+import java.io.File;
+import java.util.HashSet;
+
+/**
+ *  Donut-specific hack to keep Gears permissions in sync with the
+ *  system location setting.
+ */
+class GearsPermissionsManager {
+    // The application context.
+    Context mContext;
+    // The path to gears.so.
+    private String mGearsPath;
+
+    // The Gears permissions database directory.
+    private final static String GEARS_DATABASE_DIR = "gears";
+    // The Gears permissions database file name.
+    private final static String GEARS_DATABASE_FILE = "permissions.db";
+    // The Gears location permissions table.
+    private final static String GEARS_LOCATION_ACCESS_TABLE_NAME =
+        "LocationAccess";
+    // The Gears storage access permissions table.
+    private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access";
+    // The Gears permissions db schema version table.
+    private final static String GEARS_SCHEMA_VERSION_TABLE_NAME =
+        "VersionInfo";
+    // The Gears permission value that denotes "allow access to location".
+    private static final int GEARS_ALLOW_LOCATION_ACCESS = 1;
+    // The shared pref name.
+    private static final String LAST_KNOWN_LOCATION_SETTING =
+        "lastKnownLocationSystemSetting";
+    // The Browser package name.
+    private static final String BROWSER_PACKAGE_NAME = "com.android.browser";
+    // The Secure Settings observer that will be notified when the system
+    // location setting changes.
+    private SecureSettingsObserver mSettingsObserver;
+    // The Google URLs whitelisted for Gears location access.
+    private static HashSet<String> sGearsWhiteList;
+
+    static {
+        sGearsWhiteList = new HashSet<String>();
+        // NOTE: DO NOT ADD A "/" AT THE END!
+        sGearsWhiteList.add("http://www.google.com");
+        sGearsWhiteList.add("http://www.google.co.uk");
+    }
+
+    private static final String LOGTAG = "webcore";
+    static final boolean DEBUG = false;
+    static final boolean LOGV_ENABLED = DEBUG;
+
+    GearsPermissionsManager(Context context, String gearsPath) {
+        mContext = context;
+        mGearsPath = gearsPath;
+    }
+
+    public void doCheckAndStartObserver() {
+     // Are we running in the browser?
+        if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) {
+            return;
+        }
+        // Do the check.
+        checkGearsPermissions();
+        // Install the observer.
+        mSettingsObserver = new SecureSettingsObserver();
+        mSettingsObserver.observe();
+    }
+
+    private void checkGearsPermissions() {
+        // Get the current system settings.
+        int setting = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.USE_LOCATION_FOR_SERVICES, -1);
+        // Check if we need to set the Gears permissions.
+        if (setting != -1 && locationSystemSettingChanged(setting)) {
+            setGearsPermissionForGoogleDomains(setting);
+        }
+    }
+
+    private boolean locationSystemSettingChanged(int newSetting) {
+        SharedPreferences prefs =
+            PreferenceManager.getDefaultSharedPreferences(mContext);
+        int oldSetting = 0;
+        oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting);
+        if (oldSetting == newSetting) {
+            return false;
+        }
+        Editor ed = prefs.edit();
+        ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting);
+        ed.commit();
+        return true;
+    }
+
+    private void setGearsPermissionForGoogleDomains(int systemPermission) {
+        // Transform the system permission into a boolean flag. When this
+        // flag is true, it means the origins in gGearsWhiteList are added
+        // to the Gears location permission table with permission 1 (allowed).
+        // When the flag is false, the origins in gGearsWhiteList are removed
+        // from the Gears location permission table. Next time the user
+        // navigates to one of these origins, she will see the normal Gears
+        // permission prompt.
+        boolean addToGearsLocationTable = (systemPermission == 1 ? true : false);
+        // Build the path to the Gears library.
+
+        File file = new File(mGearsPath).getParentFile();
+        if (file == null) {
+            return;
+        }
+        // Build the Gears database file name.
+        file = new File(file.getAbsolutePath() + File.separator
+                + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE);
+        // Remember whether or not we need to create the LocationAccess table.
+        boolean needToCreateTables = !file.exists();
+        // If the database file does not yet exist and the system location
+        // setting says that the Gears origins need to be removed from the
+        // location permission table, it means that we don't actually need
+        // to do anything at all.
+        if (needToCreateTables && !addToGearsLocationTable) {
+            return;
+        }
+        // Try opening the Gears database.
+        SQLiteDatabase permissions;
+        try {
+            permissions = SQLiteDatabase.openOrCreateDatabase(file, null);
+        } catch (SQLiteException e) {
+            if (LOGV_ENABLED) {
+                Log.v(LOGTAG, "Could not open Gears permission DB: "
+                        + e.getMessage());
+            }
+            // Just bail out.
+            return;
+        }
+        // We now have a database open. Begin a transaction.
+        permissions.beginTransaction();
+        try {
+            if (needToCreateTables) {
+                // Create the tables. Note that this creates the
+                // Gears tables for the permissions DB schema version 2.
+                // The Gears schema upgrade process will take care of the rest.
+                // First, the storage access table.
+                SQLiteStatement statement = permissions.compileStatement(
+                        "CREATE TABLE IF NOT EXISTS "
+                        + GEARS_STORAGE_ACCESS_TABLE_NAME
+                        + " (Name TEXT UNIQUE, Value)");
+                statement.execute();
+                // Next the location access table.
+                statement = permissions.compileStatement(
+                        "CREATE TABLE IF NOT EXISTS "
+                        + GEARS_LOCATION_ACCESS_TABLE_NAME
+                        + " (Name TEXT UNIQUE, Value)");
+                statement.execute();
+                // Finally, the schema version table.
+                statement = permissions.compileStatement(
+                        "CREATE TABLE IF NOT EXISTS "
+                        + GEARS_SCHEMA_VERSION_TABLE_NAME
+                        + " (Name TEXT UNIQUE, Value)");
+                statement.execute();
+                // Set the schema version to 2.
+                ContentValues schema = new ContentValues();
+                schema.put("Name", "Version");
+                schema.put("Value", 2);
+                permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null,
+                        schema);
+            }
+
+            if (addToGearsLocationTable) {
+                ContentValues permissionValues = new ContentValues();
+
+                for (String url : sGearsWhiteList) {
+                    permissionValues.put("Name", url);
+                    permissionValues.put("Value", GEARS_ALLOW_LOCATION_ACCESS);
+                    permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null,
+                            permissionValues);
+                    permissionValues.clear();
+                }
+            } else {
+                for (String url : sGearsWhiteList) {
+                    permissions.delete(GEARS_LOCATION_ACCESS_TABLE_NAME, "Name=?",
+                            new String[] { url });
+                }
+            }
+            // Commit the transaction.
+            permissions.setTransactionSuccessful();
+        } catch (SQLiteException e) {
+            if (LOGV_ENABLED) {
+                Log.v(LOGTAG, "Could not set the Gears permissions: "
+                        + e.getMessage());
+            }
+        } finally {
+            permissions.endTransaction();
+            permissions.close();
+        }
+    }
+
+    class SecureSettingsObserver extends ContentObserver {
+        SecureSettingsObserver() {
+            super(new Handler());
+        }
+
+        void observe() {
+            ContentResolver resolver = mContext.getContentResolver();
+            resolver.registerContentObserver(Settings.Secure.getUriFor(
+                    Settings.Secure.USE_LOCATION_FOR_SERVICES), false, this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            checkGearsPermissions();
+        }
+    }
+}
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index 39360cd..474fa82 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -38,6 +38,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Vector;
 import java.util.regex.Pattern;
@@ -72,7 +73,12 @@
     private static final int HTTP_NOT_FOUND = 404;
     private static final int HTTP_PROXY_AUTH = 407;
 
-    private static final String CERT_MIMETYPE = "application/x-x509-ca-cert";
+    private static HashSet<String> sCertificateMimeTypeMap;
+    static {
+        sCertificateMimeTypeMap = new HashSet<String>();
+        sCertificateMimeTypeMap.add("application/x-x509-ca-cert");
+        sCertificateMimeTypeMap.add("application/x-pkcs12");
+    }
 
     private static int sNativeLoaderCount;
 
@@ -318,7 +324,17 @@
             if (mMimeType.equalsIgnoreCase("text/plain") ||
                     mMimeType.equalsIgnoreCase("application/octet-stream")) {
 
-                String newMimeType = guessMimeTypeFromExtension();
+                // for attachment, use the filename in the Content-Disposition
+                // to guess the mimetype
+                String contentDisposition = headers.getContentDisposition();
+                String url = null;
+                if (contentDisposition != null) {
+                    url = URLUtil.parseContentDisposition(contentDisposition);
+                }
+                if (url == null) {
+                    url = mUrl;
+                }
+                String newMimeType = guessMimeTypeFromExtension(url);
                 if (newMimeType != null) {
                     mMimeType = newMimeType;
                 }
@@ -936,7 +952,7 @@
 
     // This commits the headers without checking the response status code.
     private void commitHeaders() {
-        if (mIsMainPageLoader && CERT_MIMETYPE.equals(mMimeType)) {
+        if (mIsMainPageLoader && sCertificateMimeTypeMap.contains(mMimeType)) {
             // In the case of downloading certificate, we will save it to the
             // Keystore in commitLoad. Do not call webcore.
             return;
@@ -982,7 +998,7 @@
     private void commitLoad() {
         if (mCancelled) return;
 
-        if (mIsMainPageLoader && CERT_MIMETYPE.equals(mMimeType)) {
+        if (mIsMainPageLoader && sCertificateMimeTypeMap.contains(mMimeType)) {
             // In the case of downloading certificate, we will save it to the
             // Keystore and stop the current loading so that it will not
             // generate a new history page
@@ -1409,7 +1425,7 @@
             // of frames. If no content-type was specified, it is fine to
             // default to text/html.
             mMimeType = "text/html";
-            String newMimeType = guessMimeTypeFromExtension();
+            String newMimeType = guessMimeTypeFromExtension(mUrl);
             if (newMimeType != null) {
                 mMimeType =  newMimeType;
             }
@@ -1419,15 +1435,15 @@
     /**
      * guess MIME type based on the file extension.
      */
-    private String guessMimeTypeFromExtension() {
+    private String guessMimeTypeFromExtension(String url) {
         // PENDING: need to normalize url
         if (WebView.LOGV_ENABLED) {
-            Log.v(LOGTAG, "guessMimeTypeFromExtension: mURL = " + mUrl);
+            Log.v(LOGTAG, "guessMimeTypeFromExtension: url = " + url);
         }
 
         String mimeType =
                 MimeTypeMap.getSingleton().getMimeTypeFromExtension(
-                        MimeTypeMap.getFileExtensionFromUrl(mUrl));
+                        MimeTypeMap.getFileExtensionFromUrl(url));
 
         if (mimeType != null) {
             // XXX: Until the servers send us either correct xhtml or
diff --git a/core/java/android/webkit/MimeTypeMap.java b/core/java/android/webkit/MimeTypeMap.java
index 85c2275..fdbc692 100644
--- a/core/java/android/webkit/MimeTypeMap.java
+++ b/core/java/android/webkit/MimeTypeMap.java
@@ -335,6 +335,7 @@
             sMimeTypeMap.loadEntry("application/x-object", "o", false);
             sMimeTypeMap.loadEntry("application/x-oz-application", "oza", 
                     false);
+            sMimeTypeMap.loadEntry("application/x-pkcs12", "p12", false);
             sMimeTypeMap.loadEntry("application/x-pkcs7-certreqresp", "p7r", 
                     false);
             sMimeTypeMap.loadEntry("application/x-pkcs7-crl", "crl", false);
diff --git a/core/java/android/webkit/URLUtil.java b/core/java/android/webkit/URLUtil.java
index d6ac3e9..9889fe9 100644
--- a/core/java/android/webkit/URLUtil.java
+++ b/core/java/android/webkit/URLUtil.java
@@ -348,7 +348,7 @@
      * This header provides a filename for content that is going to be
      * downloaded to the file system. We only support the attachment type.
      */
-    private static String parseContentDisposition(String contentDisposition) {
+    static String parseContentDisposition(String contentDisposition) {
         try {
             Matcher m = CONTENT_DISPOSITION_PATTERN.matcher(contentDisposition);
             if (m.find()) {
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index ec671d5..c5012f1 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -17,13 +17,13 @@
 package android.webkit;
 
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Handler;
 import android.os.Message;
 import android.provider.Checkin;
 
 import java.lang.SecurityException;
-import android.content.pm.PackageManager;
 
 import java.util.Locale;
 
@@ -176,6 +176,9 @@
     private boolean         mBuiltInZoomControls = false;
     private boolean         mAllowFileAccess = true;
 
+    // The Gears permissions manager. Only in Donut.
+    static GearsPermissionsManager sGearsPermissionsManager;
+
     // Class to handle messages before WebCore is ready.
     private class EventHandler {
         // Message id for syncing
@@ -1148,6 +1151,7 @@
         if (WebView.DEBUG) {
             junit.framework.Assert.assertTrue(frame.mNativeFrame != 0);
         }
+        checkGearsPermissions();
         nativeSync(frame.mNativeFrame);
         mSyncPending = false;
         mEventHandler.createHandler();
@@ -1163,6 +1167,23 @@
         return size;
     }
 
+    private void checkGearsPermissions() {
+        // Did we already check the permissions at startup?
+        if (sGearsPermissionsManager != null) {
+            return;
+        }
+        // Is the pluginsPath sane?
+        String pluginsPath = getPluginsPath();
+        if (pluginsPath == null || pluginsPath.length() == 0) {
+            // We don't yet have a meaningful plugin path, so
+            // we can't do anything about the Gears permissions.
+            return;
+        }
+        sGearsPermissionsManager =
+            new GearsPermissionsManager(mContext, pluginsPath);
+        sGearsPermissionsManager.doCheckAndStartObserver();
+    }
+
     /* Post a SYNC message to handle syncing the native settings. */
     private synchronized void postSync() {
         // Only post if a sync is not pending
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index f9ca8cb..777beed 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -720,7 +720,7 @@
     @Override
     public void getFocusedRect(Rect r) {
         View view = getSelectedView();
-        if (view != null) {
+        if (view != null && view.getParent() == this) {
             // the focused rectangle of the selected view offset into the
             // coordinate space of this view.
             view.getFocusedRect(r);
diff --git a/core/java/android/widget/AppSecurityPermissions.java b/core/java/android/widget/AppSecurityPermissions.java
index c4b5ef8..6579660 100755
--- a/core/java/android/widget/AppSecurityPermissions.java
+++ b/core/java/android/widget/AppSecurityPermissions.java
@@ -18,6 +18,7 @@
 
 import com.android.internal.R;
 import android.content.Context;
+import android.content.res.Resources;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageParser;
@@ -319,15 +320,14 @@
             boolean dangerous) {
         View permView = mInflater.inflate(R.layout.app_permission_item, null);
         Drawable icon = dangerous ? mDangerousIcon : mNormalIcon;
-        int grpColor = dangerous ? R.color.perms_dangerous_grp_color :
-            R.color.perms_normal_grp_color;
-        int permColor = dangerous ? R.color.perms_dangerous_perm_color :
-            R.color.perms_normal_perm_color;
 
         TextView permGrpView = (TextView) permView.findViewById(R.id.permission_group);
         TextView permDescView = (TextView) permView.findViewById(R.id.permission_list);
-        permGrpView.setTextColor(mContext.getResources().getColor(grpColor));
-        permDescView.setTextColor(mContext.getResources().getColor(permColor));
+        if (dangerous) {
+            final Resources resources = mContext.getResources();
+            permGrpView.setTextColor(resources.getColor(R.color.perms_dangerous_grp_color));
+            permDescView.setTextColor(resources.getColor(R.color.perms_dangerous_perm_color));
+        }
 
         ImageView imgView = (ImageView)permView.findViewById(R.id.perm_icon);
         imgView.setImageDrawable(icon);
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 675aba2..4bc00de 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -31,6 +31,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.view.inputmethod.CompletionInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.EditorInfo;
@@ -141,6 +142,7 @@
 
         mPopup = new PopupWindow(context, attrs,
                 com.android.internal.R.attr.autoCompleteTextViewStyle);
+        mPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
 
         TypedArray a =
             context.obtainStyledAttributes(
@@ -208,8 +210,7 @@
         if (mDropDownAlwaysVisible
                 && mPopup.isShowing()
                 && mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED) {
-            mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
-            showDropDown();
+            ensureImeVisible();
         }
     }
 
@@ -1084,11 +1085,21 @@
     /**
      * Issues a runnable to show the dropdown as soon as possible.
      *
-     * @hide internal used only by Search Dialog
+     * @hide internal used only by SearchDialog
      */
     public void showDropDownAfterLayout() {
         post(mShowDropDownRunnable);
     }
+    
+    /**
+     * Ensures that the drop down is not obscuring the IME.
+     * 
+     * @hide internal used only here and SearchDialog
+     */
+    public void ensureImeVisible() {
+        mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
+        showDropDown();
+    }
 
     /**
      * <p>Displays the drop down on screen.</p>
@@ -1285,11 +1296,8 @@
             }
         }
 
-        // Max height available on the screen for a popup. If this AutoCompleteTextView has
-        // the dropDownAlwaysVisible attribute, and the input method is not currently required,
-        // we then we ask for the height ignoring any bottom decorations like the input method.
-        // Otherwise we respect the input method.
-        boolean ignoreBottomDecorations = mDropDownAlwaysVisible &&
+        // Max height available on the screen for a popup.
+        boolean ignoreBottomDecorations =
                 mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
         final int maxHeight = mPopup.getMaxAvailableHeight(
                 getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations);
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 54f2707..3b9f1de 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -110,6 +110,8 @@
                  * subtract by one to ensure our internal state is always 0-11
                  */
                 mMonth = newVal - 1;
+                // Adjust max day of the month
+                adjustMaxDay();
                 if (mOnDateChangedListener != null) {
                     mOnDateChangedListener.onDateChanged(DatePicker.this, mYear, mMonth, mDay);
                 }
@@ -121,9 +123,12 @@
         mYearPicker.setOnChangeListener(new OnChangedListener() {
             public void onChanged(NumberPicker picker, int oldVal, int newVal) {
                 mYear = newVal;
+                // Adjust max day for leap years if needed
+                adjustMaxDay();
                 if (mOnDateChangedListener != null) {
                     mOnDateChangedListener.onDateChanged(DatePicker.this, mYear, mMonth, mDay);
                 }
+                updateDaySpinner();
             }
         });
         
@@ -318,4 +323,14 @@
     public int getDayOfMonth() {
         return mDay;
     }
+
+    private void adjustMaxDay(){
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, mYear);
+        cal.set(Calendar.MONTH, mMonth);
+        int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
+        if (mDay > max) {
+            mDay = max;
+        }
+    }
 }
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index cd965fc6..2da777a 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -26,6 +26,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.SystemClock;
+import android.util.TypedValue;
 import android.view.MotionEvent;
 
 /**
@@ -116,17 +117,19 @@
         mThumbDrawable.setAlpha(ScrollFade.ALPHA_MAX);
     }
     
-    private void useThumbDrawable(Drawable drawable) {
+    private void useThumbDrawable(Context context, Drawable drawable) {
         mThumbDrawable = drawable;
-        mThumbW = 64; //mCurrentThumb.getIntrinsicWidth();
-        mThumbH = 52; //mCurrentThumb.getIntrinsicHeight();
+        mThumbW = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                64, context.getResources().getDisplayMetrics());
+        mThumbH = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                52, context.getResources().getDisplayMetrics());
         mChangedBounds = true;
     }
 
     private void init(Context context) {
         // Get both the scrollbar states drawables
         final Resources res = context.getResources();
-        useThumbDrawable(res.getDrawable(
+        useThumbDrawable(context, res.getDrawable(
                 com.android.internal.R.drawable.scrollbar_handle_accelerated_anim2));
         
         mOverlayDrawable = res.getDrawable(
diff --git a/core/java/android/widget/Filter.java b/core/java/android/widget/Filter.java
index 7e55c78..d901540 100644
--- a/core/java/android/widget/Filter.java
+++ b/core/java/android/widget/Filter.java
@@ -46,6 +46,8 @@
     private Handler mThreadHandler;
     private Handler mResultHandler;
 
+    private Delayer mDelayer;
+
     private final Object mLock = new Object();
 
     /**
@@ -56,6 +58,20 @@
     }
 
     /**
+     * Provide an interface that decides how long to delay the message for a given query.  Useful
+     * for heuristics such as posting a delay for the delete key to avoid doing any work while the
+     * user holds down the delete key.
+     *
+     * @param delayer The delayer.
+     * @hide
+     */
+    public void setDelayer(Delayer delayer) {
+        synchronized (mLock) {
+            mDelayer = delayer;
+        }
+    }
+
+    /**
      * <p>Starts an asynchronous filtering operation. Calling this method
      * cancels all previous non-executed filtering requests and posts a new
      * filtering request that will be executed later.</p>
@@ -85,10 +101,13 @@
     public final void filter(CharSequence constraint, FilterListener listener) {
         synchronized (mLock) {
             if (mThreadHandler == null) {
-                HandlerThread thread = new HandlerThread(THREAD_NAME);
+                HandlerThread thread = new HandlerThread(
+                        THREAD_NAME, android.os.Process.THREAD_PRIORITY_BACKGROUND);
                 thread.start();
                 mThreadHandler = new RequestHandler(thread.getLooper());
             }
+
+            final long delay = (mDelayer == null) ? 0 : mDelayer.getPostingDelay(constraint);
             
             Message message = mThreadHandler.obtainMessage(FILTER_TOKEN);
     
@@ -101,7 +120,7 @@
     
             mThreadHandler.removeMessages(FILTER_TOKEN);
             mThreadHandler.removeMessages(FINISH_TOKEN);
-            mThreadHandler.sendMessage(message);
+            mThreadHandler.sendMessageDelayed(message, delay);
         }
     }
 
@@ -288,4 +307,17 @@
          */
         FilterResults results;
     }
+
+    /**
+     * @hide
+     */
+    public interface Delayer {
+
+        /**
+         * @param constraint The constraint passed to {@link Filter#filter(CharSequence)}
+         * @return The delay that should be used for
+         *         {@link Handler#sendMessageDelayed(android.os.Message, long)}
+         */
+        long getPostingDelay(CharSequence constraint);
+    }
 }
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index f86b37c..46e514c 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -286,18 +286,20 @@
             return;
         }
 
-        final View child = getChildAt(0);
-        int width = getMeasuredWidth();
-        if (child.getMeasuredWidth() < width) {
-            final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, mPaddingTop
-                    + mPaddingBottom, lp.height);
-            width -= mPaddingLeft;
-            width -= mPaddingRight;
-            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
-
-            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+        if (getChildCount() > 0) {
+            final View child = getChildAt(0);
+            int width = getMeasuredWidth();
+            if (child.getMeasuredWidth() < width) {
+                final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
+    
+                int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, mPaddingTop
+                        + mPaddingBottom, lp.height);
+                width -= mPaddingLeft;
+                width -= mPaddingRight;
+                int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
+    
+                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+            }
         }
     }
 
@@ -636,7 +638,7 @@
             mTempRect.left = getScrollX() + width;
             int count = getChildCount();
             if (count > 0) {
-                View view = getChildAt(count - 1);
+                View view = getChildAt(0);
                 if (mTempRect.left + width > view.getRight()) {
                     mTempRect.left = view.getRight() - width;
                 }
@@ -674,7 +676,7 @@
         if (right) {
             int count = getChildCount();
             if (count > 0) {
-                View view = getChildAt(count - 1);
+                View view = getChildAt(0);
                 mTempRect.right = view.getRight();
                 mTempRect.left = mTempRect.right - width;
             }
@@ -751,9 +753,9 @@
 
             if (direction == View.FOCUS_LEFT && getScrollX() < scrollDelta) {
                 scrollDelta = getScrollX();
-            } else if (direction == View.FOCUS_RIGHT) {
-
-                int daRight = getChildAt(getChildCount() - 1).getRight();
+            } else if (direction == View.FOCUS_RIGHT && getChildCount() > 0) {
+                
+                int daRight = getChildAt(0).getRight();
 
                 int screenRight = getScrollX() + getWidth();
 
@@ -975,6 +977,7 @@
      * @return The scroll delta.
      */
     protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+        if (getChildCount() == 0) return 0;
 
         int width = getWidth();
         int screenLeft = getScrollX();
@@ -1008,7 +1011,7 @@
             }
 
             // make sure we aren't scrolling beyond the end of our content
-            int right = getChildAt(getChildCount() - 1).getRight();
+            int right = getChildAt(0).getRight();
             int distanceToRight = right - screenRight;
             scrollXDelta = Math.min(scrollXDelta, distanceToRight);
 
@@ -1148,27 +1151,29 @@
      *                  which means we want to scroll towards the left.
      */
     public void fling(int velocityX) {
-        int width = getWidth() - mPaddingRight - mPaddingLeft;
-        int right = getChildAt(0).getWidth();
-
-        mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, right - width, 0, 0);
-
-        final boolean movingRight = velocityX > 0;
-
-        View newFocused = findFocusableViewInMyBounds(movingRight,
-                mScroller.getFinalX(), findFocus());
-
-        if (newFocused == null) {
-            newFocused = this;
+        if (getChildCount() > 0) {
+            int width = getWidth() - mPaddingRight - mPaddingLeft;
+            int right = getChildAt(0).getWidth();
+    
+            mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, right - width, 0, 0);
+    
+            final boolean movingRight = velocityX > 0;
+    
+            View newFocused = findFocusableViewInMyBounds(movingRight,
+                    mScroller.getFinalX(), findFocus());
+    
+            if (newFocused == null) {
+                newFocused = this;
+            }
+    
+            if (newFocused != findFocus()
+                    && newFocused.requestFocus(movingRight ? View.FOCUS_RIGHT : View.FOCUS_LEFT)) {
+                mScrollViewMovedFocus = true;
+                mScrollViewMovedFocus = false;
+            }
+    
+            invalidate();
         }
-
-        if (newFocused != findFocus()
-                && newFocused.requestFocus(movingRight ? View.FOCUS_RIGHT : View.FOCUS_LEFT)) {
-            mScrollViewMovedFocus = true;
-            mScrollViewMovedFocus = false;
-        }
-
-        invalidate();
     }
 
     /**
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 0c2cd55..90fbb77 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -27,7 +27,6 @@
 import android.view.Gravity;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
-import android.view.WindowManagerImpl;
 import android.view.ViewTreeObserver.OnScrollChangedListener;
 import android.view.View.OnTouchListener;
 import android.graphics.PixelFormat;
@@ -82,6 +81,7 @@
     private View mPopupView;
     private boolean mFocusable;
     private int mInputMethodMode = INPUT_METHOD_FROM_FOCUSABLE;
+    private int mSoftInputMode;
     private boolean mTouchable = true;
     private boolean mOutsideTouchable = false;
     private boolean mClippingEnabled = true;
@@ -446,6 +446,30 @@
     public void setInputMethodMode(int mode) {
         mInputMethodMode = mode;
     }
+
+    /**
+     * Sets the operating mode for the soft input area.
+     *
+     * @param mode The desired mode, see
+     *        {@link android.view.WindowManager.LayoutParams#softInputMode}
+     *        for the full list
+     *
+     * @see android.view.WindowManager.LayoutParams#softInputMode
+     * @see #getSoftInputMode()
+     */
+    public void setSoftInputMode(int mode) {
+        mSoftInputMode = mode;
+    }
+
+    /**
+     * Returns the current value in {@link #setSoftInputMode(int)}.
+     *
+     * @see #setSoftInputMode(int)
+     * @see android.view.WindowManager.LayoutParams#softInputMode
+     */
+    public int getSoftInputMode() {
+        return mSoftInputMode;
+    }
     
     /**
      * <p>Indicates whether the popup window receives touch events.</p>
@@ -822,7 +846,7 @@
         p.flags = computeFlags(p.flags);
         p.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
         p.token = token;
-        p.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+        p.softInputMode = mSoftInputMode;
         p.setTitle("PopupWindow:" + Integer.toHexString(hashCode()));
 
         return p;
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index e62dda5..24c0e2a 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -1295,11 +1295,8 @@
                     if (rule > 0) {
                         // The node this node depends on
                         final Node dependency = keyNodes.get(rule);
-                        if (dependency == node) {
-                            throw new IllegalStateException("A view cannot have a dependency" +
-                                    " on itself");
-                        }
-                        if (dependency == null) {
+                        // Skip unknowns and self dependencies
+                        if (dependency == null || dependency == node) {
                             continue;
                         }
                         // Add the current node as a dependent
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 90e1242..703cd8e 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -20,8 +20,6 @@
 import android.content.res.TypedArray;
 import android.graphics.Rect;
 import android.util.AttributeSet;
-import android.util.Config;
-import android.util.Log;
 import android.view.FocusFinder;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -54,7 +52,6 @@
  */
 public class ScrollView extends FrameLayout {
     static final String TAG = "ScrollView";
-    static final boolean localLOGV = false || Config.LOGV;
     
     static final int ANIMATED_SCROLL_GAP = 250;
 
@@ -287,18 +284,21 @@
             return;
         }
 
-        final View child = getChildAt(0);
-        int height = getMeasuredHeight();
-        if (child.getMeasuredHeight() < height) {
-            final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, mPaddingLeft
-                    + mPaddingRight, lp.width);
-            height -= mPaddingTop;
-            height -= mPaddingBottom;
-            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
-            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+        if (getChildCount() > 0) {
+            final View child = getChildAt(0);
+            int height = getMeasuredHeight();
+            if (child.getMeasuredHeight() < height) {
+                final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
+    
+                int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, mPaddingLeft
+                        + mPaddingRight, lp.width);
+                height -= mPaddingTop;
+                height -= mPaddingBottom;
+                int childHeightMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+    
+                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+            }
         }
     }
 
@@ -756,13 +756,14 @@
             if (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {
                 scrollDelta = getScrollY();
             } else if (direction == View.FOCUS_DOWN) {
-
-                int daBottom = getChildAt(getChildCount() - 1).getBottom();
-
-                int screenBottom = getScrollY() + getHeight();
-
-                if (daBottom - screenBottom < maxJump) {
-                    scrollDelta = daBottom - screenBottom;
+                if (getChildCount() > 0) {
+                    int daBottom = getChildAt(0).getBottom();
+    
+                    int screenBottom = getScrollY() + getHeight();
+    
+                    if (daBottom - screenBottom < maxJump) {
+                        scrollDelta = daBottom - screenBottom;
+                    }
                 }
             }
             if (scrollDelta == 0) {
@@ -830,16 +831,12 @@
     public final void smoothScrollBy(int dx, int dy) {
         long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
         if (duration > ANIMATED_SCROLL_GAP) {
-            if (localLOGV) Log.v(TAG, "Smooth scroll: mScrollY=" + mScrollY
-                    + " dy=" + dy);
             mScroller.startScroll(mScrollX, mScrollY, dx, dy);
             invalidate();
         } else {
             if (!mScroller.isFinished()) {
                 mScroller.abortAnimation();
             }
-            if (localLOGV) Log.v(TAG, "Immediate scroll: mScrollY=" + mScrollY
-                    + " dy=" + dy);
             scrollBy(dx, dy);
         }
         mLastScroll = AnimationUtils.currentAnimationTimeMillis();
@@ -922,9 +919,6 @@
                 View child = getChildAt(0);
                 mScrollX = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth());
                 mScrollY = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight());
-                if (localLOGV) Log.v(TAG, "mScrollY=" + mScrollY + " y=" + y
-                        + " height=" + this.getHeight()
-                        + " child height=" + child.getHeight());
             } else {
                 mScrollX = x;
                 mScrollY = y;
@@ -986,6 +980,7 @@
      * @return The scroll delta.
      */
     protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+        if (getChildCount() == 0) return 0;
 
         int height = getHeight();
         int screenTop = getScrollY();
@@ -1005,9 +1000,6 @@
 
         int scrollYDelta = 0;
 
-        if (localLOGV) Log.v(TAG, "child=" + rect.toShortString()
-                + " screenTop=" + screenTop + " screenBottom=" + screenBottom
-                + " height=" + height);
         if (rect.bottom > screenBottom && rect.top > screenTop) {
             // need to move down to get it in view: move down just enough so
             // that the entire rectangle is in view (or at least the first
@@ -1022,10 +1014,8 @@
             }
 
             // make sure we aren't scrolling beyond the end of our content
-            int bottom = getChildAt(getChildCount() - 1).getBottom();
+            int bottom = getChildAt(0).getBottom();
             int distanceToBottom = bottom - screenBottom;
-            if (localLOGV) Log.v(TAG, "scrollYDelta=" + scrollYDelta
-                    + " distanceToBottom=" + distanceToBottom);
             scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
 
         } else if (rect.top < screenTop && rect.bottom < screenBottom) {
@@ -1164,26 +1154,28 @@
      *                  which means we want to scroll towards the top.
      */
     public void fling(int velocityY) {
-        int height = getHeight() - mPaddingBottom - mPaddingTop;
-        int bottom = getChildAt(0).getHeight();
-
-        mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, bottom - height);
-
-        final boolean movingDown = velocityY > 0;
-
-        View newFocused =
-                findFocusableViewInMyBounds(movingDown, mScroller.getFinalY(), findFocus());
-        if (newFocused == null) {
-            newFocused = this;
+        if (getChildCount() > 0) {
+            int height = getHeight() - mPaddingBottom - mPaddingTop;
+            int bottom = getChildAt(0).getHeight();
+    
+            mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, bottom - height);
+    
+            final boolean movingDown = velocityY > 0;
+    
+            View newFocused =
+                    findFocusableViewInMyBounds(movingDown, mScroller.getFinalY(), findFocus());
+            if (newFocused == null) {
+                newFocused = this;
+            }
+    
+            if (newFocused != findFocus()
+                    && newFocused.requestFocus(movingDown ? View.FOCUS_DOWN : View.FOCUS_UP)) {
+                mScrollViewMovedFocus = true;
+                mScrollViewMovedFocus = false;
+            }
+    
+            invalidate();
         }
-
-        if (newFocused != findFocus()
-                && newFocused.requestFocus(movingDown ? View.FOCUS_DOWN : View.FOCUS_UP)) {
-            mScrollViewMovedFocus = true;
-            mScrollViewMovedFocus = false;
-        }
-
-        invalidate();
     }
 
     /**
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 80d688e..bcddca1 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -24,7 +24,6 @@
 import android.content.res.TypedArray;
 import android.database.DataSetObserver;
 import android.util.AttributeSet;
-import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -40,6 +39,7 @@
 public class Spinner extends AbsSpinner implements OnClickListener {
     
     private CharSequence mPrompt;
+    private AlertDialog mPopup;
 
     public Spinner(Context context) {
         this(context, null);
@@ -78,6 +78,16 @@
         }
     }
 
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        
+        if (mPopup != null && mPopup.isShowing()) {
+            mPopup.dismiss();
+            mPopup = null;
+        }
+    }
+
     /**
      * <p>A spinner does not support item click events. Calling this method
      * will raise an exception.</p>
@@ -244,7 +254,7 @@
             if (mPrompt != null) {
                 builder.setTitle(mPrompt);
             }
-            builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show();
+            mPopup = builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show();
         }
 
         return handled;
@@ -253,6 +263,7 @@
     public void onClick(DialogInterface dialog, int which) {
         setSelection(which);
         dialog.dismiss();
+        mPopup = null;
     }
 
     /**
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java
index 670692f..df957ac 100644
--- a/core/java/android/widget/Toast.java
+++ b/core/java/android/widget/Toast.java
@@ -65,6 +65,7 @@
      */
     public static final int LENGTH_LONG = 1;
 
+    final Handler mHandler = new Handler();    
     final Context mContext;
     final TN mTN;
     int mDuration;
@@ -84,7 +85,7 @@
      */
     public Toast(Context context) {
         mContext = context;
-        mTN = new TN(context);
+        mTN = new TN();
         mY = context.getResources().getDimensionPixelSize(
                 com.android.internal.R.dimen.toast_y_offset);
     }
@@ -229,7 +230,8 @@
     public static Toast makeText(Context context, CharSequence text, int duration) {
         Toast result = new Toast(context);
 
-        LayoutInflater inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        LayoutInflater inflate = (LayoutInflater)
+                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
         TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
         tv.setText(text);
@@ -286,8 +288,7 @@
 
     private static INotificationManager sService;
 
-    static private INotificationManager getService()
-    {
+    static private INotificationManager getService() {
         if (sService != null) {
             return sService;
         }
@@ -295,28 +296,42 @@
         return sService;
     }
 
-    private class TN extends ITransientNotification.Stub
-    {
-        TN(Context context)
-        {
+    private class TN extends ITransientNotification.Stub {
+        final Runnable mShow = new Runnable() {
+            public void run() {
+                handleShow();
+            }
+        };
+
+        final Runnable mHide = new Runnable() {
+            public void run() {
+                handleHide();
+            }
+        };
+
+        private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+        
+        WindowManagerImpl mWM;
+
+        TN() {
             // XXX This should be changed to use a Dialog, with a Theme.Toast
             // defined that sets up the layout params appropriately.
-            mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
-            mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
-            mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+            final WindowManager.LayoutParams params = mParams;
+            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
+            params.width = WindowManager.LayoutParams.WRAP_CONTENT;
+            params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                     | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                     | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
-            mParams.format = PixelFormat.TRANSLUCENT;
-            mParams.windowAnimations = com.android.internal.R.style.Animation_Toast;
-            mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
-            mParams.setTitle("Toast");
+            params.format = PixelFormat.TRANSLUCENT;
+            params.windowAnimations = com.android.internal.R.style.Animation_Toast;
+            params.type = WindowManager.LayoutParams.TYPE_TOAST;
+            params.setTitle("Toast");
         }
 
         /**
          * schedule handleShow into the right thread
          */
-        public void show()
-        {
+        public void show() {
             if (localLOGV) Log.v(TAG, "SHOW: " + this);
             mHandler.post(mShow);
         }
@@ -324,14 +339,12 @@
         /**
          * schedule handleHide into the right thread
          */
-        public void hide()
-        {
+        public void hide() {
             if (localLOGV) Log.v(TAG, "HIDE: " + this);
             mHandler.post(mHide);
         }
 
-        public void handleShow()
-        {
+        public void handleShow() {
             if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
                     + " mNextView=" + mNextView);
             if (mView != mNextView) {
@@ -361,8 +374,7 @@
             }
         }
 
-        public void handleHide()
-        {
+        public void handleHide() {
             if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView);
             if (mView != null) {
                 // note: checking parent() just to make sure the view has
@@ -377,24 +389,5 @@
                 mView = null;
             }
         }
-
-        Runnable mShow = new Runnable() {
-            public void run() {
-                handleShow();
-            }
-        };
-
-        Runnable mHide = new Runnable() {
-            public void run() {
-                handleHide();
-            }
-        };
-
-        private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
-        
-        WindowManagerImpl mWM;
     }
-
-    final Handler mHandler = new Handler();
 }
-
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index a03802d..a449e5f 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.os;
 
+import android.bluetooth.BluetoothHeadset;
 import android.os.BatteryStats;
 import android.os.NetStat;
 import android.os.Parcel;
@@ -128,7 +129,10 @@
     
     boolean mBluetoothOn;
     StopwatchTimer mBluetoothOnTimer;
-    
+
+    /** Bluetooth headset object */
+    BluetoothHeadset mBtHeadset;
+
     /**
      * These provide time bases that discount the time the device is plugged
      * in to power.
@@ -160,6 +164,9 @@
     private long mRadioDataUptime;
     private long mRadioDataStart;
 
+    private int mBluetoothPingCount;
+    private int mBluetoothPingStart = -1;
+
     /*
      * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
      */
@@ -920,14 +927,18 @@
         dataTransfer[STATS_UNPLUGGED] = currentBytes;
     }
 
-    private long getCurrentRadioDataUptimeMs() {
+    /**
+     * Radio uptime in microseconds when transferring data. This value is very approximate.
+     * @return
+     */
+    private long getCurrentRadioDataUptime() {
         try {
             File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
             if (!awakeTimeFile.exists()) return 0;
             BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
             String line = br.readLine();
             br.close();
-            return Long.parseLong(line);
+            return Long.parseLong(line) * 1000;
         } catch (NumberFormatException nfe) {
             // Nothing
         } catch (IOException ioe) {
@@ -936,14 +947,44 @@
         return 0;
     }
 
+    /**
+     * @deprecated use getRadioDataUptime
+     */
     public long getRadioDataUptimeMs() {
+        return getRadioDataUptime() / 1000;
+    }
+
+    /**
+     * Returns the duration that the cell radio was up for data transfers. 
+     */
+    public long getRadioDataUptime() {
         if (mRadioDataStart == -1) {
             return mRadioDataUptime;
         } else {
-            return getCurrentRadioDataUptimeMs() - mRadioDataStart;
+            return getCurrentRadioDataUptime() - mRadioDataStart;
         }
     }
 
+    private int getCurrentBluetoothPingCount() {
+        if (mBtHeadset != null) {
+            return mBtHeadset.getBatteryUsageHint();
+        }
+        return -1;
+    }
+
+    public int getBluetoothPingCount() {
+        if (mBluetoothPingStart == -1) {
+            return mBluetoothPingCount;
+        } else if (mBtHeadset != null) {
+            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
+        }
+        return -1;
+    }
+
+    public void setBtHeadset(BluetoothHeadset headset) {
+        mBtHeadset = headset;
+    }
+
     public void doUnplug(long batteryUptime, long batteryRealtime) {
         for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
             Uid u = mUidStats.valueAt(iu);
@@ -961,8 +1002,11 @@
         doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes());
         doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes());
         // Track radio awake time
-        mRadioDataStart = getCurrentRadioDataUptimeMs();
+        mRadioDataStart = getCurrentRadioDataUptime();
         mRadioDataUptime = 0;
+        // Track bt headset ping count
+        mBluetoothPingStart = getCurrentBluetoothPingCount();
+        mBluetoothPingCount = 0;
     }
 
     public void doPlug(long batteryUptime, long batteryRealtime) {
@@ -985,8 +1029,12 @@
         doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes());
         doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes());
         // Track radio awake time
-        mRadioDataUptime = getRadioDataUptimeMs();
+        mRadioDataUptime = getRadioDataUptime();
         mRadioDataStart = -1;
+
+        // Track bt headset ping count
+        mBluetoothPingCount = getBluetoothPingCount();
+        mBluetoothPingStart = -1;
     }
 
     public void noteStartGps(int uid) {
@@ -3335,6 +3383,9 @@
         mRadioDataUptime = in.readLong();
         mRadioDataStart = -1;
 
+        mBluetoothPingCount = in.readInt();
+        mBluetoothPingStart = -1;
+
         mKernelWakelockStats.clear();
         int NKW = in.readInt();
         for (int ikw = 0; ikw < NKW; ikw++) {
@@ -3415,7 +3466,9 @@
         out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED));
 
         // Write radio uptime for data
-        out.writeLong(getRadioDataUptimeMs());
+        out.writeLong(getRadioDataUptime());
+
+        out.writeInt(getBluetoothPingCount());
 
         out.writeInt(mKernelWakelockStats.size());
         for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java
index 4a8d8b1..94f703a 100644
--- a/core/java/com/android/internal/os/PowerProfile.java
+++ b/core/java/com/android/internal/os/PowerProfile.java
@@ -87,6 +87,11 @@
     public static final String POWER_BLUETOOTH_ACTIVE = "bluetooth.active";
 
     /**
+     * Power consumption when Bluetooth driver gets an AT command.
+     */
+    public static final String POWER_BLUETOOTH_AT_CMD = "bluetooth.at";
+
+    /**
      * Power consumption when screen is on, not including the backlight power.
      */
     public static final String POWER_SCREEN_ON = "screen.on";
diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java
index 7f99ac8..53be891 100644
--- a/core/java/com/android/internal/widget/LockPatternView.java
+++ b/core/java/com/android/internal/widget/LockPatternView.java
@@ -20,23 +20,22 @@
 import com.android.internal.R;
 
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.Rect;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
+import android.os.Debug;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.os.SystemClock;
-import android.os.Debug;
 import android.os.Vibrator;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.WindowManager;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -393,17 +392,9 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final WindowManager wm = (WindowManager) getContext()
-                .getSystemService(Context.WINDOW_SERVICE);
-        final int width = wm.getDefaultDisplay().getWidth();
-        final int height = wm.getDefaultDisplay().getHeight();
-        int squareSide = Math.min(width, height);
-
-        // if in landscape...
-        if (width > height) {
-            squareSide -= STATUS_BAR_HEIGHT;
-        }
-
+        final int width = MeasureSpec.getSize(widthMeasureSpec);
+        final int height = MeasureSpec.getSize(heightMeasureSpec);
+        final int squareSide = Math.min(width, height);
         setMeasuredDimension(squareSide, squareSide);
     }
 
diff --git a/core/java/com/android/internal/widget/NumberPicker.java b/core/java/com/android/internal/widget/NumberPicker.java
index 2f08c8d..0424ced 100644
--- a/core/java/com/android/internal/widget/NumberPicker.java
+++ b/core/java/com/android/internal/widget/NumberPicker.java
@@ -243,9 +243,11 @@
     private void validateCurrentView(CharSequence str) {
         int val = getSelectedPos(str.toString());
         if ((val >= mStart) && (val <= mEnd)) {
-            mPrevious = mCurrent;
-            mCurrent = val;
-            notifyChange();
+            if (mCurrent != val) {
+                mPrevious = mCurrent;
+                mCurrent = val;
+                notifyChange();
+            }
         }
         updateView();
     }
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index af8ecf5..3fb07a7 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -224,7 +224,7 @@
     SkBitmap bitmap;

 

     bitmap.setConfig(config, width, height);

-    if (!GraphicsJNI::setJavaPixelRef(env, &bitmap, NULL)) {

+    if (!GraphicsJNI::setJavaPixelRef(env, &bitmap, NULL, true)) {

         return NULL;

     }

 

@@ -240,7 +240,7 @@
 static jobject Bitmap_copy(JNIEnv* env, jobject, const SkBitmap* src,

                            SkBitmap::Config dstConfig, jboolean isMutable) {

     SkBitmap            result;

-    JavaPixelAllocator  allocator(env);

+    JavaPixelAllocator  allocator(env, true);

 

     if (!src->copyTo(&result, dstConfig, &allocator)) {

         return NULL;

@@ -356,7 +356,7 @@
         }

     }

 

-    if (!GraphicsJNI::setJavaPixelRef(env, bitmap, ctable)) {

+    if (!GraphicsJNI::setJavaPixelRef(env, bitmap, ctable, true)) {

         ctable->safeUnref();

         delete bitmap;

         return NULL;

diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 137707f..0c84265 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -23,6 +23,7 @@
 static jfieldID gOptions_ditherFieldID;
 static jfieldID gOptions_purgeableFieldID;
 static jfieldID gOptions_shareableFieldID;
+static jfieldID gOptions_nativeAllocFieldID;
 static jfieldID gOptions_widthFieldID;
 static jfieldID gOptions_heightFieldID;
 static jfieldID gOptions_mimeFieldID;
@@ -300,6 +301,11 @@
             env->GetBooleanField(options, gOptions_shareableFieldID);
 }
 
+static bool optionsReportSizeToVM(JNIEnv* env, jobject options) {
+    return NULL == options ||
+            !env->GetBooleanField(options, gOptions_nativeAllocFieldID);
+}
+
 static jobject nullObjectReturn(const char msg[]) {
     if (msg) {
         SkDebugf("--- %s\n", msg);
@@ -330,6 +336,7 @@
     SkBitmap::Config prefConfig = SkBitmap::kNo_Config;
     bool doDither = true;
     bool isPurgeable = allowPurgeable && optionsPurgeable(env, options);
+    bool reportSizeToVM = optionsReportSizeToVM(env, options);
     
     if (NULL != options) {
         sampleSize = env->GetIntField(options, gOptions_sampleSizeFieldID);
@@ -355,7 +362,7 @@
     decoder->setDitherImage(doDither);
 
     NinePatchPeeker     peeker;
-    JavaPixelAllocator  javaAllocator(env);
+    JavaPixelAllocator  javaAllocator(env, reportSizeToVM);
     SkBitmap*           bitmap = new SkBitmap;
     Res_png_9patch      dummy9Patch;
 
@@ -699,6 +706,7 @@
     gOptions_ditherFieldID = getFieldIDCheck(env, gOptions_class, "inDither", "Z");
     gOptions_purgeableFieldID = getFieldIDCheck(env, gOptions_class, "inPurgeable", "Z");
     gOptions_shareableFieldID = getFieldIDCheck(env, gOptions_class, "inInputShareable", "Z");
+    gOptions_nativeAllocFieldID = getFieldIDCheck(env, gOptions_class, "inNativeAlloc", "Z");
     gOptions_widthFieldID = getFieldIDCheck(env, gOptions_class, "outWidth", "I");
     gOptions_heightFieldID = getFieldIDCheck(env, gOptions_class, "outHeight", "I");
     gOptions_mimeFieldID = getFieldIDCheck(env, gOptions_class, "outMimeType", "Ljava/lang/String;");
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 6eebbdc..6e159a8 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -5,6 +5,7 @@
 #include "SkRegion.h"
 #include <android_runtime/AndroidRuntime.h>
 
+//#define REPORT_SIZE_TO_JVM
 //#define TRACK_LOCK_COUNT
 
 void doThrow(JNIEnv* env, const char* exc, const char* msg) {
@@ -444,7 +445,7 @@
 };
 
 bool GraphicsJNI::setJavaPixelRef(JNIEnv* env, SkBitmap* bitmap,
-                                  SkColorTable* ctable) {
+                                  SkColorTable* ctable, bool reportSizeToVM) {
     Sk64 size64 = bitmap->getSize64();
     if (size64.isNeg() || !size64.is32()) {
         doThrow(env, "java/lang/IllegalArgumentException",
@@ -453,35 +454,41 @@
     }
     
     size_t size = size64.get32();
-    //    SkDebugf("-------------- inform VM we've allocated %d bytes\n", size);
     jlong jsize = size;  // the VM wants longs for the size
-    bool r = env->CallBooleanMethod(gVMRuntime_singleton,
-                                     gVMRuntime_trackExternalAllocationMethodID,
-                                     jsize);
-    if (GraphicsJNI::hasException(env)) {
-        return false;
+    if (reportSizeToVM) {
+        //    SkDebugf("-------------- inform VM we've allocated %d bytes\n", size);
+        bool r = env->CallBooleanMethod(gVMRuntime_singleton,
+                                    gVMRuntime_trackExternalAllocationMethodID,
+                                    jsize);
+        if (GraphicsJNI::hasException(env)) {
+            return false;
+        }
+        if (!r) {
+            LOGE("VM won't let us allocate %zd bytes\n", size);
+            doThrowOOME(env, "bitmap size exceeds VM budget");
+            return false;
+        }
     }
-    if (!r) {
-        LOGE("VM won't let us allocate %zd bytes\n", size);
-        doThrowOOME(env, "bitmap size exceeds VM budget");
-        return false;
-    }
-    
     // call the version of malloc that returns null on failure
     void* addr = sk_malloc_flags(size, 0);
     if (NULL == addr) {
-        //        SkDebugf("-------------- inform VM we're releasing %d bytes which we couldn't allocate\n", size);
-        // we didn't actually allocate it, so inform the VM
-        env->CallVoidMethod(gVMRuntime_singleton,
-                             gVMRuntime_trackExternalFreeMethodID,
-                             jsize);
-        if (!GraphicsJNI::hasException(env)) {
-            doThrowOOME(env, "bitmap size too large for malloc");
+        if (reportSizeToVM) {
+            //        SkDebugf("-------------- inform VM we're releasing %d bytes which we couldn't allocate\n", size);
+            // we didn't actually allocate it, so inform the VM
+            env->CallVoidMethod(gVMRuntime_singleton,
+                                 gVMRuntime_trackExternalFreeMethodID,
+                                 jsize);
+            if (!GraphicsJNI::hasException(env)) {
+                doThrowOOME(env, "bitmap size too large for malloc");
+            }
         }
         return false;
     }
     
-    bitmap->setPixelRef(new AndroidPixelRef(env, addr, size, ctable))->unref();
+    SkPixelRef* pr = reportSizeToVM ?
+                        new AndroidPixelRef(env, addr, size, ctable) :
+                        new SkMallocPixelRef(addr, size, ctable);
+    bitmap->setPixelRef(pr)->unref();
     // since we're already allocated, we lockPixels right away
     // HeapAllocator behaves this way too
     bitmap->lockPixels();
@@ -490,12 +497,11 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env) : fEnv(env)
-{
-}
+JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env, bool reportSizeToVM)
+    : fEnv(env), fReportSizeToVM(reportSizeToVM) {}
     
 bool JavaPixelAllocator::allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable) {
-    return GraphicsJNI::setJavaPixelRef(fEnv, bitmap, ctable);
+    return GraphicsJNI::setJavaPixelRef(fEnv, bitmap, ctable, fReportSizeToVM);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index e2dc9ac..16925e4 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -59,7 +59,8 @@
         Returns true on success. If it returns false, then it failed, and the
         appropriate exception will have been raised.
     */
-    static bool setJavaPixelRef(JNIEnv*, SkBitmap*, SkColorTable* ctable);
+    static bool setJavaPixelRef(JNIEnv*, SkBitmap*, SkColorTable* ctable,
+                                bool reportSizeToVM);
 
     /** Copy the colors in colors[] to the bitmap, convert to the correct
         format along the way.
@@ -71,12 +72,13 @@
 
 class JavaPixelAllocator : public SkBitmap::Allocator {
 public:
-    JavaPixelAllocator(JNIEnv* env);
+    JavaPixelAllocator(JNIEnv* env, bool reportSizeToVM);
     // overrides
     virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* ctable);
     
 private:
     JNIEnv* fEnv;
+    bool fReportSizeToVM;
 };
 
 class AutoJavaFloatArray {
diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp
index d02590e..ce30aaa8 100644
--- a/core/jni/android_backup_BackupDataOutput.cpp
+++ b/core/jni/android_backup_BackupDataOutput.cpp
@@ -70,7 +70,7 @@
     int err;
     BackupDataWriter* writer = (BackupDataWriter*)w;
 
-    if (env->GetArrayLength(data) > size) {
+    if (env->GetArrayLength(data) < size) {
         // size mismatch
         return -1;
     }
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 77a8a72..9053468 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -29,15 +29,6 @@
 
 using namespace android;
 
-enum CallbackMessageID {
-    kShutterCallback = 0,
-    kRawCallback = 1,
-    kJpegCallback = 2,
-    kPreviewCallback = 3,
-    kAutoFocusCallback = 4,
-    kErrorCallback = 5
-};
-
 struct fields_t {
     jfieldID    context;
     jfieldID    surface;
@@ -55,6 +46,7 @@
     ~JNICameraContext() { release(); }
     virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2);
     virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr);
+    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
     sp<Camera> getCamera() { Mutex::Autolock _l(mLock); return mCamera; }
     void release();
 
@@ -136,16 +128,13 @@
         uint8_t *heapBase = (uint8_t*)heap->base();
 
         if (heapBase != NULL) {
-            uint8_t *data = heapBase + offset;
+            const jbyte* data = reinterpret_cast<const jbyte*>(heapBase + offset);
             obj = env->NewByteArray(size);
             if (obj == NULL) {
                 LOGE("Couldn't allocate byte array for JPEG data");
                 env->ExceptionClear();
             } else {
-                jbyte *bytes = env->GetByteArrayElements(obj, NULL);
-                memcpy(bytes, data, size);
-                env->ReleaseByteArrayElements(obj, bytes, 0);
-
+                env->SetByteArrayRegion(obj, 0, size, data);
             }
         } else {
             LOGE("image heap is NULL");
@@ -182,12 +171,19 @@
                 mCameraJObjectWeak, msgType, 0, 0, NULL);
         break;
     default:
-        LOGV("dataCallback(%d, %p)", msgType, dataPtr.get());
+        // TODO: Change to LOGV
+        LOGD("dataCallback(%d, %p)", msgType, dataPtr.get());
         copyAndPost(env, dataPtr, msgType);
         break;
     }
 }
 
+void JNICameraContext::postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
+{
+    // TODO: plumb up to Java. For now, just drop the timestamp
+    postData(msgType, dataPtr);
+}
+
 // connect to camera service
 static void android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
 {
@@ -227,6 +223,8 @@
 // finalizer is invoked later.
 static void android_hardware_Camera_release(JNIEnv *env, jobject thiz)
 {
+    // TODO: Change to LOGV
+    LOGD("release camera");
     JNICameraContext* context = NULL;
     sp<Camera> camera;
     {
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index e71e348..44a9e8c 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -212,8 +212,10 @@
     
     // failure:
 native_init_failure:
+    env->DeleteGlobalRef(lpCallbackData->audioRecord_class);
+    env->DeleteGlobalRef(lpCallbackData->audioRecord_ref);
     delete lpCallbackData;
-    
+
 native_track_failure:
     delete lpRecorder;
 
@@ -274,6 +276,8 @@
         thiz, javaAudioRecordFields.nativeCallbackCookie);
     if (lpCookie) {
         LOGV("deleting lpCookie: %x\n", (int)lpCookie);
+        env->DeleteGlobalRef(lpCookie->audioRecord_class);
+        env->DeleteGlobalRef(lpCookie->audioRecord_ref);
         delete lpCookie;
     }
 
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index e7d4694..fd92fbe 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -75,6 +75,9 @@
         int                        mStreamType;
 
     AudioTrackJniStorage() {
+        mCallbackData.audioTrack_class = 0;
+        mCallbackData.audioTrack_ref = 0;
+        mStreamType = AudioSystem::DEFAULT;
     }
 
     ~AudioTrackJniStorage() {
@@ -318,6 +321,8 @@
     env->SetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, 0);
     
 native_track_failure:
+    env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_class);
+    env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_ref);
     delete lpJniStorage;
     env->SetIntField(thiz, javaAudioTrackFields.jniData, 0);
     return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED;
@@ -415,6 +420,9 @@
     AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetIntField(
         thiz, javaAudioTrackFields.jniData);
     if (pJniStorage) {
+        // delete global refs created in native_setup
+        env->DeleteGlobalRef(pJniStorage->mCallbackData.audioTrack_class);
+        env->DeleteGlobalRef(pJniStorage->mCallbackData.audioTrack_ref);
         //LOGV("deleting pJniStorage: %x\n", (int)pJniStorage);
         delete pJniStorage;
     }
diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp
index 9f93e2f..ae744a8 100644
--- a/core/jni/android_net_wifi_Wifi.cpp
+++ b/core/jni/android_net_wifi_Wifi.cpp
@@ -27,6 +27,8 @@
 
 namespace android {
 
+static jboolean sScanModeActive = false;
+
 /*
  * The following remembers the jfieldID's of the fields
  * of the DhcpInfo Java object, so that we don't have
@@ -254,27 +256,29 @@
     return doBooleanCommand("REASSOCIATE", "OK");
 }
 
-static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz)
+static jboolean doSetScanMode(jboolean setActive)
+{
+    return doBooleanCommand((setActive ? "DRIVER SCAN-ACTIVE" : "DRIVER SCAN-PASSIVE"), "OK");
+}
+
+static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz, jboolean forceActive)
 {
     jboolean result;
+
     // Ignore any error from setting the scan mode.
     // The scan will still work.
-    (void)doBooleanCommand("DRIVER SCAN-ACTIVE", "OK");
+    if (forceActive && !sScanModeActive)
+        doSetScanMode(true);
     result = doBooleanCommand("SCAN", "OK");
-    (void)doBooleanCommand("DRIVER SCAN-PASSIVE", "OK");
+    if (forceActive && !sScanModeActive)
+        doSetScanMode(sScanModeActive);
     return result;
 }
 
 static jboolean android_net_wifi_setScanModeCommand(JNIEnv* env, jobject clazz, jboolean setActive)
 {
-    jboolean result;
-    // Ignore any error from setting the scan mode.
-    // The scan will still work.
-    if (setActive) {
-        return doBooleanCommand("DRIVER SCAN-ACTIVE", "OK");
-    } else {
-        return doBooleanCommand("DRIVER SCAN-PASSIVE", "OK");
-    }
+    sScanModeActive = setActive;
+    return doSetScanMode(setActive);
 }
 
 static jboolean android_net_wifi_startDriverCommand(JNIEnv* env, jobject clazz)
@@ -509,7 +513,7 @@
     { "disconnectCommand", "()Z",  (void *)android_net_wifi_disconnectCommand },
     { "reconnectCommand", "()Z",  (void *)android_net_wifi_reconnectCommand },
     { "reassociateCommand", "()Z",  (void *)android_net_wifi_reassociateCommand },
-    { "scanCommand", "()Z", (void*) android_net_wifi_scanCommand },
+    { "scanCommand", "(Z)Z", (void*) android_net_wifi_scanCommand },
     { "setScanModeCommand", "(Z)Z", (void*) android_net_wifi_setScanModeCommand },
     { "startDriverCommand", "()Z", (void*) android_net_wifi_startDriverCommand },
     { "stopDriverCommand", "()Z", (void*) android_net_wifi_stopDriverCommand },
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 599360f..00d9cf6 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -21,6 +21,38 @@
     package="android" android:sharedUserId="android.uid.system"
     android:sharedUserLabel="@string/android_system_label">
 
+    <!-- ================================================ -->
+    <!-- Special broadcasts that only the system can send -->
+    <!-- ================================================ -->
+    <eat-comment />
+    
+    <protected-broadcast android:name="android.intent.action.SCREEN_OFF" />
+    <protected-broadcast android:name="android.intent.action.SCREEN_ON" />
+    <protected-broadcast android:name="android.intent.action.USER_PRESENT" />
+    <protected-broadcast android:name="android.intent.action.TIME_TICK" />
+    <protected-broadcast android:name="android.intent.action.TIMEZONE_CHANGED" />
+    <protected-broadcast android:name="android.intent.action.BOOT_COMPLETED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_INSTALL" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_ADDED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_REPLACED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_REMOVED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_CHANGED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_RESTARTED" />
+    <protected-broadcast android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
+    <protected-broadcast android:name="android.intent.action.UID_REMOVED" />
+    <protected-broadcast android:name="android.intent.action.CONFIGURATION_CHANGED" />
+    <protected-broadcast android:name="android.intent.action.BATTERY_CHANGED" />
+    <protected-broadcast android:name="android.intent.action.BATTERY_LOW" />
+    <protected-broadcast android:name="android.intent.action.BATTERY_OKAY" />
+    <protected-broadcast android:name="android.intent.action.ACTION_POWER_CONNECTED" />
+    <protected-broadcast android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
+    <protected-broadcast android:name="android.intent.action.ACTION_SHUTDOWN" />
+    <protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_LOW" />
+    <protected-broadcast android:name="android.intent.action.DEVICE_STORAGE_OK" />
+    <protected-broadcast android:name="android.intent.action.AIRPLANE_MODE" />
+    <protected-broadcast android:name="android.intent.action.NEW_OUTGOING_CALL" />
+    <protected-broadcast android:name="android.intent.action.REBOOT" />
+    
     <!-- ====================================== -->
     <!-- Permissions for things that cost money -->
     <!-- ====================================== -->
@@ -995,6 +1027,29 @@
         android:description="@string/permdesc_changeBackgroundDataSetting"
         android:label="@string/permlab_changeBackgroundDataSetting" />
 
+    <!-- This permission can be used on content providers to allow the global
+         search system to access their data.  Typically it used when the
+         provider has some permissions protecting it (which global search
+         would not be expected to hold), and added as a read-only permission
+         to the path in the provider where global search queries are
+         performed.  This permission can not be held by regular applications;
+         it is used by applications to protect themselves from everyone else
+         besides global search. -->
+    <permission android:name="android.permission.GLOBAL_SEARCH"
+        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+        android:protectionLevel="signatureOrSystem" />
+
+    <!-- Internal permission protecting access to the global search
+         system: ensures that only the system can access the provider
+         to perform queries (since this otherwise provides unrestricted
+         access to a variety of content providers), and to write the
+         search statistics (to keep applications from gaming the source
+         ranking).
+         @hide -->
+    <permission android:name="android.permission.GLOBAL_SEARCH_CONTROL"
+        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+        android:protectionLevel="signature" />
+
     <application android:process="system"
                  android:persistent="true"
                  android:hasCode="false"
diff --git a/core/res/res/color/search_url_text.xml b/core/res/res/color/search_url_text.xml
new file mode 100644
index 0000000..449fdf0
--- /dev/null
+++ b/core/res/res/color/search_url_text.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:color="@android:color/search_url_text_pressed"/>
+    <item android:state_selected="true" android:color="@android:color/search_url_text_selected"/>
+    <item android:color="@android:color/search_url_text_normal"/> <!-- not selected -->
+</selector>
diff --git a/core/res/res/drawable/expander_ic_maximized.9.png b/core/res/res/drawable/expander_ic_maximized.9.png
index eb461e9..778255a 100644
--- a/core/res/res/drawable/expander_ic_maximized.9.png
+++ b/core/res/res/drawable/expander_ic_maximized.9.png
Binary files differ
diff --git a/core/res/res/drawable/expander_ic_minimized.9.png b/core/res/res/drawable/expander_ic_minimized.9.png
index e3cec8d..5235c18 100644
--- a/core/res/res/drawable/expander_ic_minimized.9.png
+++ b/core/res/res/drawable/expander_ic_minimized.9.png
Binary files differ
diff --git a/core/res/res/drawable/ic_bullet_key_permission.png b/core/res/res/drawable/ic_bullet_key_permission.png
old mode 100755
new mode 100644
index c8a4939..ccb010f
--- a/core/res/res/drawable/ic_bullet_key_permission.png
+++ b/core/res/res/drawable/ic_bullet_key_permission.png
Binary files differ
diff --git a/core/res/res/drawable/ic_text_dot.png b/core/res/res/drawable/ic_text_dot.png
old mode 100755
new mode 100644
index bb02379..47913f6
--- a/core/res/res/drawable/ic_text_dot.png
+++ b/core/res/res/drawable/ic_text_dot.png
Binary files differ
diff --git a/core/res/res/drawable/light_header.9.png b/core/res/res/drawable/light_header.9.png
new file mode 100644
index 0000000..ad5dce1
--- /dev/null
+++ b/core/res/res/drawable/light_header.9.png
Binary files differ
diff --git a/core/res/res/layout/app_perms_summary.xml b/core/res/res/layout/app_perms_summary.xml
index 713c179..009eb8f 100755
--- a/core/res/res/layout/app_perms_summary.xml
+++ b/core/res/res/layout/app_perms_summary.xml
@@ -54,7 +54,7 @@
         <View
             android:layout_width="fill_parent"
             android:layout_height="1dip"
-            android:background="@android:drawable/divider_horizontal_dark" />
+            android:background="?android:attr/listDivider" />
 
         <LinearLayout
             android:orientation="horizontal"
@@ -85,7 +85,7 @@
         <View
             android:layout_width="fill_parent"
             android:layout_height="1dip"
-            android:background="@android:drawable/divider_horizontal_dark" />
+            android:background="?android:attr/listDivider" />
 
     </LinearLayout>
 
diff --git a/core/res/res/layout/search_dropdown_app_selector.xml b/core/res/res/layout/search_dropdown_app_selector.xml
deleted file mode 100644
index f86645f..0000000
--- a/core/res/res/layout/search_dropdown_app_selector.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/res/layout/search_dropdown_app_selector.xml
-**
-** Copyright 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.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="?android:attr/listPreferredItemHeight"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:baselineAligned="false"
-    >
-
-    <ImageView android:id="@+id/search_app_icon1"
-        android:layout_width="32dip"
-        android:layout_height="32dip"
-        android:layout_gravity="center_vertical"
-        android:scaleType="fitCenter"
-        android:src="@android:drawable/ic_search_category_default" />
-        
-    <TextView android:id="@+id/search_app_text1"
-        style="?android:attr/dropDownItemStyle"
-        android:singleLine="true"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:layout_gravity="center_vertical" />
-    
-</LinearLayout>
diff --git a/core/res/res/layout/search_dropdown_item_2line.xml b/core/res/res/layout/search_dropdown_item_2line.xml
deleted file mode 100644
index 5546b6636..0000000
--- a/core/res/res/layout/search_dropdown_item_2line.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
-**
-** Copyright 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.
-*/
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
-    android:layout_width="fill_parent"
-    android:layout_height="?android:attr/searchResultListItemHeight"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:baselineAligned="false"
-    >
-    
-    <TwoLineListItem
-        android:paddingTop="1dip"
-        android:paddingBottom="1dip"
-        android:gravity="center_vertical"
-        android:layout_width="0dip"
-        android:layout_weight="1"
-        android:layout_height="wrap_content"
-        android:mode="twoLine" >
-    
-        <TextView
-            android:id="@android:id/text1"
-            style="?android:attr/dropDownItemStyle"
-            android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
-            android:singleLine="true"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content" />
-    
-        <TextView
-            android:id="@android:id/text2"
-            style="?android:attr/dropDownItemStyle"
-            android:textAppearance="?android:attr/textAppearanceSearchResultSubtitle"
-            android:textColor="?android:attr/textColorSecondaryInverse"
-            android:singleLine="true"
-            android:layout_width="fill_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@android:id/text1"
-            android:layout_alignLeft="@android:id/text1" />
-    
-    </TwoLineListItem>
-
-</LinearLayout>
diff --git a/core/res/res/layout/search_dropdown_item_icons_1line.xml b/core/res/res/layout/search_dropdown_item_icons_1line.xml
deleted file mode 100644
index 4f65d74..0000000
--- a/core/res/res/layout/search_dropdown_item_icons_1line.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
-**
-** Copyright 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.
-*/
--->
-
-    <!-- NOTE: The appearance of the inner text element must match the appearance -->
-    <!-- of the text element in apps/common/res/layout/simple_dropdown_item_1line.xml -->
-    
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
-    android:paddingLeft="4dip"
-    android:paddingRight="2dip"
-    android:layout_width="fill_parent"
-    android:layout_height="?android:attr/searchResultListItemHeight"
-    android:orientation="horizontal"
-    android:gravity="center_vertical"
-    android:baselineAligned="false"
-    >
-    
-    <ImageView android:id="@android:id/icon1"
-        android:layout_width="48dip"
-        android:layout_height="48dip"
-        android:layout_gravity="center_vertical"
-        android:scaleType="centerInside" />
-
-    <TextView android:id="@android:id/text1"
-        style="?android:attr/dropDownItemStyle"
-        android:textAppearance="?android:attr/textAppearanceSearchResultTitle"
-        android:singleLine="true"
-        android:layout_height="wrap_content"
-        android:layout_width="0dip"
-        android:layout_weight="1"  />
-
-    <ImageView android:id="@android:id/icon2"
-        android:layout_width="48dip"
-        android:layout_height="48dip"
-        android:layout_gravity="center_vertical"
-        android:scaleType="centerInside" />
-
-</LinearLayout>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 7dbeaeb..7160b41 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;bez názvu&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(žádné telefonní číslo)"</string>
@@ -48,6 +49,12 @@
     <string name="BaMmi">"Blokování hovorů"</string>
     <string name="PwdMmi">"Změna hesla"</string>
     <string name="PinMmi">"Změna kódu PIN"</string>
+    <string name="CnipMmi">"Volané číslo uvedeno"</string>
+    <string name="CnirMmi">"Volání čísla omezeno"</string>
+    <string name="ThreeWCMmi">"Konference tří účastníků"</string>
+    <string name="RuacMmi">"Odmítnutí nevyžádaných obtěžujících hovorů"</string>
+    <string name="CndMmi">"Doručení volaného čísla"</string>
+    <string name="DndMmi">"Nerušit"</string>
     <string name="CLIRDefaultOnNextCallOn">"Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Omezeno"</string>
     <string name="CLIRDefaultOnNextCallOff">"Ve výchozím nastavení je identifikace volajícího omezena. Příští hovor: Neomezeno"</string>
     <string name="CLIRDefaultOffNextCallOn">"Ve výchozím nastavení není identifikace volajícího omezena. Příští hovor: Omezeno"</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Synchronizace"</string>
     <string name="serviceClassPacket">"Pakety"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Indikátor roamingu svítí"</string>
+    <string name="roamingText1">"Indikátor roamingu nesvítí"</string>
+    <string name="roamingText2">"Indikátor roamingu bliká"</string>
+    <string name="roamingText3">"Není v blízkosti"</string>
+    <string name="roamingText4">"Mimo budovu"</string>
+    <string name="roamingText5">"Roaming – preferovaný systém"</string>
+    <string name="roamingText6">"Roaming – dostupný systém"</string>
+    <string name="roamingText7">"Roaming – alianční partner"</string>
+    <string name="roamingText8">"Roaming – prémiový partner"</string>
+    <string name="roamingText9">"Roaming – úplná funkčnost služby"</string>
+    <string name="roamingText10">"Roaming – částečná funkčnost služby"</string>
+    <string name="roamingText11">"Banner roamingu je zapnutý"</string>
+    <string name="roamingText12">"Banner roamingu je vypnutý"</string>
+    <string name="roamingTextSearching">"Vyhledávání služby"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sek."</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nepřesměrováno"</string>
+    <string name="fcComplete">"Požadavek zadaný pomocí kódu funkce byl úspěšně dokončen."</string>
+    <string name="fcError">"Problém s připojením nebo neplatný kód funkce."</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"Webová stránka obsahuje chybu."</string>
     <string name="httpErrorLookup">"Adresu URL nelze najít."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"K souboru nelze získat přístup."</string>
     <string name="httpErrorFileNotFound">"Požadovaný soubor nebyl nalezen."</string>
     <string name="httpErrorTooManyRequests">"Je zpracováváno příliš mnoho požadavků. Opakujte akci později."</string>
+    <string name="certificateSaved">"Certifikát je uložen v systémovém úložišti klíčů."</string>
     <string name="contentServiceSync">"Synchronizace"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchronizace"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Příliš mnoho smazaných položek služby <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Nízkoúrovňový přístup a kontrola nad systémem."</string>
     <string name="permgrouplab_developmentTools">"Nástroje pro vývojáře"</string>
     <string name="permgroupdesc_developmentTools">"Funkce pouze pro vývojáře aplikací"</string>
+    <string name="permgrouplab_storage">"Úložiště"</string>
+    <string name="permgroupdesc_storage">"Přístup ke kartě SD."</string>
     <string name="permlab_statusBar">"zakázání či změny stavového řádku"</string>
     <string name="permdesc_statusBar">"Umožňuje aplikaci zakázat stavový řádek nebo přidat či odebrat systémové ikony."</string>
     <string name="permlab_expandStatusBar">"rozbalení a sbalení stavového řádku"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"načtení interního stavu systému"</string>
     <string name="permdesc_dump">"Umožňuje aplikaci načíst interní stav systému. Škodlivé aplikace mohou načíst řádu soukromých a zabezpečených informací, které by nikdy neměly potřebovat."</string>
+    <string name="permlab_shutdown">"Částečné vypnutí"</string>
+    <string name="permdesc_shutdown">"Uvede správce činností do vypnutého stavu. Nedojde však k úplnému vypnutí."</string>
+    <string name="permlab_stopAppSwitches">"Zabránit přepínání aplikací"</string>
+    <string name="permdesc_stopAppSwitches">"Zabrání uživateli přepnout na jinou aplikaci."</string>
     <string name="permlab_runSetActivityWatcher">"sledování a řízení spouštění všech aplikací"</string>
     <string name="permdesc_runSetActivityWatcher">"Umožňuje aplikaci sledovat a řídit spouštění činností systémem. Škodlivé aplikace mohou zcela ovládnout systém. Toto oprávnění je zapotřebí pouze pro účely vývoje, nikdy pro běžné použití telefonu."</string>
     <string name="permlab_broadcastPackageRemoved">"odeslání vysílání o odstranění balíčku"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Umožňuje aplikaci ovládat, zda jsou činnosti vždy dokončeny po přesunutí do pozadí. Běžné aplikace toto nastavení nikdy nevyužívají."</string>
     <string name="permlab_batteryStats">"změna statistických údajů o baterii"</string>
     <string name="permdesc_batteryStats">"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">"Ovládat zálohování a obnovu systému"</string>
+    <string name="permdesc_backup">"Umožňuje aplikaci ovládat mechanizmus zálohování a obnovy systému. Není určeno k použití v běžných aplikacích."</string>
     <string name="permlab_internalSystemWindow">"zobrazení nepovolených oken"</string>
     <string name="permdesc_internalSystemWindow">"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">"zobrazení upozornění systémové úrovně"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"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">"přístup k dalším příkazům poskytovatele polohy"</string>
     <string name="permdesc_accessLocationExtraCommands">"Umožňuje získat přístup k dalším příkazům poskytovatele polohy. Škodlivé aplikace mohou pomocí tohoto nastavení narušit funkci GPS či jiných zdrojů polohy."</string>
+    <string name="permlab_installLocationProvider">"Oprávnění k instalaci poskytovatele polohy"</string>
+    <string name="permdesc_installLocationProvider">"Vytvořit simulace zdrojů polohy pro účely testování. Škodlivé aplikace mohou toto nastavení využít k přepsání polohy nebo stavu vráceného zdroji skutečné polohy, například systémem GPS nebo poskytovateli sítí. Mohou také monitorovat polohu a ohlásit ji externímu zdroji."</string>
     <string name="permlab_accessFineLocation">"upřesnění polohy (GPS)"</string>
     <string name="permdesc_accessFineLocation">"Umožňuje aplikaci přístup ke zdrojům přesné polohy v telefonu, jako je například systém GPS, je-li k dispozici. Škodlivé aplikace mohou pomocí tohoto nastavení zjistit vaši polohu a mohou zvýšit spotřebu baterie."</string>
     <string name="permlab_accessCoarseLocation">"přibližná poloha (pomocí sítě)"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Umožňuje aplikaci zobrazit informace o stavu připojení WiFi."</string>
     <string name="permlab_changeWifiState">"Změnit stav WiFi"</string>
     <string name="permdesc_changeWifiState">"Umožňuje aplikaci připojit se k přístupovým bodům WiFi či se od nich odpojit a provádět změny nakonfigurovaných sítí WiFi."</string>
+    <string name="permlab_changeWifiMulticastState">"Povolit příjem Wi-Fi Multicast"</string>
+    <string name="permdesc_changeWifiMulticastState">"Povoluje aplikaci přijímat pakety, které nebyly adresovány přímo vašemu zařízení. Pomocí této možnosti můžete objevit služby nabízené ve vaší blízkosti. Spotřeba energie je vyšší než u režimu bez vícesměrového vysílání (multicast)."</string>
     <string name="permlab_bluetoothAdmin">"správa rozhraní Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string>
     <string name="permlab_bluetooth">"vytvoření připojení Bluetooth"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Umožní aplikaci číst soukromá slova, jména a fráze, která uživatel mohl uložit do svého slovníku."</string>
     <string name="permlab_writeDictionary">"zapisovat do slovníku definovaného uživatelem"</string>
     <string name="permdesc_writeDictionary">"Umožní aplikaci zapisovat nová slova do uživatelského slovníku."</string>
+    <string name="permlab_sdcardWrite">"Změnit/smazat obsah karty SD"</string>
+    <string name="permdesc_sdcardWrite">"Umožní aplikaci zápis na kartu SD."</string>
   <string-array name="phoneTypes">
     <item>"Domů"</item>
     <item>"Mobil"</item>
@@ -353,6 +391,7 @@
     <item>"Ostatní"</item>
     <item>"Vlastní"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Mobilní"</string>
   <string-array name="postalAddressTypes">
     <item>"Domů"</item>
     <item>"Práce"</item>
@@ -393,6 +432,8 @@
     <string name="lockscreen_pattern_correct">"Správně!"</string>
     <string name="lockscreen_pattern_wrong">"Zkuste to prosím znovu"</string>
     <string name="lockscreen_plugged_in">"Nabíjení (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Připojte dobíjecí zařízení."</string>
     <string name="lockscreen_missing_sim_message_short">"Není vložena SIM karta."</string>
     <string name="lockscreen_missing_sim_message">"V telefonu není žádná karta SIM."</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Neplatné uživatelské jméno nebo heslo."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Vymazat oznámení"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Žádná oznámení"</string>
     <string name="status_bar_ongoing_events_title">"Probíhající"</string>
     <string name="status_bar_latest_events_title">"Oznámení"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Prosím připojte dobíjecí zařízení"</string>
     <string name="battery_low_subtitle">"Baterie je vybitá:"</string>
     <string name="battery_low_percent_format">"zbývá méně než <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="battery_low_why">"Proč?"</string>
     <string name="factorytest_failed">"Test továrního nastavení se nezdařil"</string>
     <string name="factorytest_not_system">"Test FACTORY_TEST lze provést pouze u balíčků nainstalovaných ve složce /system/app."</string>
     <string name="factorytest_no_action">"Nebyl nalezen žádný balíček umožňující test FACTORY_TEST."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Chcete opustit tuto stránku?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Vyberte OK, chcete-li pokračovat, nebo Zrušit, chcete-li na stránce zůstat."</string>
     <string name="save_password_label">"Potvrdit"</string>
+    <string name="permlab_readHistoryBookmarks">"Čtení historie a záložek prohlížeče"</string>
+    <string name="permdesc_readHistoryBookmarks">"Umožňuje aplikaci číst všechny navštívené adresy URL a záložky prohlížeče."</string>
+    <string name="permlab_writeHistoryBookmarks">"Zapisovat historii a záložky prohlížeče"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Chcete, aby si prohlížeč zapamatoval toto heslo?"</string>
     <string name="save_password_notnow">"Nyní ne"</string>
     <string name="save_password_remember">"Zapamatovat"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Poledne"</string>
     <string name="midnight">"půlnoc"</string>
     <string name="Midnight">"Půlnoc"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Vybrat vše"</string>
@@ -579,6 +622,7 @@
     <string name="anr_application_process">"Služba <xliff:g id="APPLICATION">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g>) nereaguje."</string>
     <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> neodpovídá."</string>
     <string name="force_close">"Ukončit aplikaci"</string>
+    <string name="report">"Nahlásit"</string>
     <string name="wait">"Počkat"</string>
     <string name="debug">"Ladit"</string>
     <string name="sendText">"Vyberte činnost s textem"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"Formátovat kartu SD"</string>
     <string name="extmedia_format_message">"Opravdu chcete kartu SD naformátovat? Všechna data na kartě budou ztracena."</string>
     <string name="extmedia_format_button_format">"Formátovat"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Výběr metody zadávání dat"</string>
     <string name="fast_scroll_alphabet">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
     <string name="candidates_style"><u>"kandidáti"</u></string>
     <string name="ext_media_checking_notification_title">"Příprava karty SD"</string>
-    <string name="ext_media_checking_notification_message">"Kontrola chyb"</string>
+    <string name="ext_media_checking_notification_message">"Kontrola chyb."</string>
     <string name="ext_media_nofs_notification_title">"Prázdná karta SD"</string>
-    <string name="ext_media_nofs_notification_message">"Karta SD je prázdná nebo používá nepodporovaný systém souborů."</string>
+    <string name="ext_media_nofs_notification_message">"Karta SD je prázdná nebo obsahuje nepodporovaný systém souborů."</string>
     <string name="ext_media_unmountable_notification_title">"Poškozená karta SD"</string>
-    <string name="ext_media_unmountable_notification_message">"Karta SD je poškozena. Pravděpodobně ji bude nutné znovu formátovat."</string>
+    <string name="ext_media_unmountable_notification_message">"Karta SD je poškozená. Bude pravděpodobně nutné ji přeformátovat."</string>
     <string name="ext_media_badremoval_notification_title">"Karta SD byla neočekávaně odebrána"</string>
     <string name="ext_media_badremoval_notification_message">"Chcete-li zabránit ztrátě dat, kartu SD před odebráním odpojte."</string>
     <string name="ext_media_safe_unmount_notification_title">"Kartu SD je možné bezpečně odebrat"</string>
-    <string name="ext_media_safe_unmount_notification_message">"Kartu SD lze nyní bezpečně vyjmout."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Kartu SD lze bezpečně odebrat."</string>
     <string name="ext_media_nomedia_notification_title">"Karta SD byla odstraněna"</string>
-    <string name="ext_media_nomedia_notification_message">"Karta SD byla odebrána. Chcete-li zvětšit úložiště svého zařízení, vložte kartu SD."</string>
+    <string name="ext_media_nomedia_notification_message">"Karta SD byla odebrána. Vložte novou kartu."</string>
     <string name="activity_list_empty">"Nebyly nalezeny žádné odpovídající aktivity."</string>
     <string name="permlab_pkgUsageStats">"aktualizovat statistiku použití součástí"</string>
     <string name="permdesc_pkgUsageStats">"Umožňuje změnu shromážděných statistických údajů o použití součástí. Není určeno pro běžné aplikace."</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Spustit"</string>
     <string name="dial_number_using">"Vytočit číslo"\n" <xliff:g id="NUMBER">%s</xliff:g>."</string>
     <string name="create_contact_using">"Vytvořit kontakt"\n"pro <xliff:g id="NUMBER">%s</xliff:g>."</string>
+    <string name="accessibility_compound_button_selected">"Zaškrtnuto"</string>
+    <string name="accessibility_compound_button_unselected">"Nezaškrtnuto"</string>
 </resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
new file mode 100644
index 0000000..a3e8dc5
--- /dev/null
+++ b/core/res/res/values-da/strings.xml
@@ -0,0 +1,765 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"Kb"</string>
+    <string name="megabyteShort">"Mb"</string>
+    <string name="gigabyteShort">"Gb"</string>
+    <string name="terabyteShort">"Tb"</string>
+    <string name="petabyteShort">"Pb"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
+    <string name="untitled">"&lt;uden navn&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Intet telefonnummer)"</string>
+    <string name="unknownName">"(Ukendt)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Voicemail"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Forbindelsesproblemer eller ugyldigt MMI-nummer."</string>
+    <string name="serviceEnabled">"Tjenesten blev aktiveret."</string>
+    <string name="serviceEnabledFor">"Tjenesten blev aktiveret for:"</string>
+    <string name="serviceDisabled">"Tjenesten er deaktiveret."</string>
+    <string name="serviceRegistered">"Registreringen er afsluttet."</string>
+    <string name="serviceErased">"Sletning afsluttet."</string>
+    <string name="passwordIncorrect">"Forkert adgangskode."</string>
+    <string name="mmiComplete">"MMI-nummer afsluttet."</string>
+    <string name="badPin">"Den gamle PIN-kode, du indtastede, er ikke korrekt."</string>
+    <string name="badPuk">"Den indtastede PUK-kode er ikke korrekt."</string>
+    <string name="mismatchPin">"De indtastede PIN-koder stemmer ikke overens."</string>
+    <string name="invalidPin">"Indtast en PIN-kode på mellem 4 og 8 tal."</string>
+    <string name="needPuk">"Dit SIM-kort er låst med PUK-koden. Indtast PUK-koden for at låse den op."</string>
+    <string name="needPuk2">"Indtast PUK2-koden for at låse op for SIM-kortet."</string>
+    <string name="ClipMmi">"Indgående opkalds-id"</string>
+    <string name="ClirMmi">"Udgående opkalds-id"</string>
+    <string name="CfMmi">"Viderestilling af opkald"</string>
+    <string name="CwMmi">"Ventende opkald"</string>
+    <string name="BaMmi">"Opkaldsspærring"</string>
+    <string name="PwdMmi">"Ændring af adgangskode"</string>
+    <string name="PinMmi">"ændring af PIN-kode"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"Standarder for opkalds-id til begrænset. Næste opkald: Begrænset"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Standarder for opkalds-id til begrænset. Næste opkald: Ikke begrænset"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Standarder for opkalds-id til ikke begrænset. Næste opkald: Begrænset"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Standarder for opkalds-id til ikke begrænset. Næste opkald: Ikke begrænset"</string>
+    <string name="serviceNotProvisioned">"Tjenesten leveres ikke!"</string>
+    <string name="CLIRPermanent">"Indstillingen for opkalds-id kan ikke ændres."</string>
+    <string name="RestrictedChangedTitle">"Begrænset adgang ændret"</string>
+    <string name="RestrictedOnData">"Datatjeneste er blokeret."</string>
+    <string name="RestrictedOnEmergency">"Nødtjeneste er blokeret."</string>
+    <string name="RestrictedOnNormal">"Stemme-/SMS-tjeneste er blokeret."</string>
+    <string name="RestrictedOnAll">"Alle stemme-/SMS-tjenester er blokerede."</string>
+    <string name="serviceClassVoice">"Stemme"</string>
+    <string name="serviceClassData">"Data"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Asynkroniser"</string>
+    <string name="serviceClassDataSync">"Synkroniser"</string>
+    <string name="serviceClassPacket">"Pakke"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> efter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke videresendt"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"Websiden indeholder en fejl."</string>
+    <string name="httpErrorLookup">"Webadressen kunne ikke findes."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Planen for webstedsgodkendelse er ikke understøttet."</string>
+    <string name="httpErrorAuth">"Godkendelse mislykkedes."</string>
+    <string name="httpErrorProxyAuth">"Godkendelse via proxyserveren mislykkedes."</string>
+    <string name="httpErrorConnect">"Der kunne ikke oprettes forbindelse til serveren."</string>
+    <string name="httpErrorIO">"Serveren kunne ikke kommunikere. Prøv igen senere."</string>
+    <string name="httpErrorTimeout">"Der opstod timeout for forbindelsen til serveren."</string>
+    <string name="httpErrorRedirectLoop">"Siden indeholder for mange serveromdirigeringer."</string>
+    <string name="httpErrorUnsupportedScheme">"Protokollen understøttes ikke."</string>
+    <string name="httpErrorFailedSslHandshake">"Der kunne ikke etableres en sikker forbindelse."</string>
+    <string name="httpErrorBadUrl">"Siden kunne ikke åbnes, fordi webadressen er ugyldig."</string>
+    <string name="httpErrorFile">"Der kunne ikke oprettes adgang til filen."</string>
+    <string name="httpErrorFileNotFound">"Den anmodede fil blev ikke fundet."</string>
+    <string name="httpErrorTooManyRequests">"Der behandles for mange anmodninger. Prøv igen senere."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Synkroniser"</string>
+    <string name="contentServiceSyncNotificationTitle">"Synkroniser"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"For mange <xliff:g id="CONTENT_TYPE">%s</xliff:g> sletninger"</string>
+    <string name="low_memory">"Telefonens lagerplads er fuld. Slet nogle filer for at frigøre plads."</string>
+    <string name="me">"Mig"</string>
+    <string name="power_dialog">"Telefonvalgmuligheder"</string>
+    <string name="silent_mode">"Lydløs"</string>
+    <string name="turn_on_radio">"Slå trådløs til"</string>
+    <string name="turn_off_radio">"Slå trådløs fra"</string>
+    <string name="screen_lock">"Skærmlås"</string>
+    <string name="power_off">"Sluk"</string>
+    <string name="shutdown_progress">"Lukker ned ..."</string>
+    <string name="shutdown_confirm">"Din telefon lukkes ned."</string>
+    <string name="no_recent_tasks">"Der er ingen nye programmer."</string>
+    <string name="global_actions">"Telefonvalgmuligheder"</string>
+    <string name="global_action_lock">"Skærmlås"</string>
+    <string name="global_action_power_off">"Sluk"</string>
+    <string name="global_action_toggle_silent_mode">"Lydløs"</string>
+    <string name="global_action_silent_mode_on_status">"Lyden er FRA"</string>
+    <string name="global_action_silent_mode_off_status">"Lyden er TIL"</string>
+    <string name="global_actions_toggle_airplane_mode">"Flytilstand"</string>
+    <string name="global_actions_airplane_mode_on_status">"Flytilstand er TIL"</string>
+    <string name="global_actions_airplane_mode_off_status">"Flytilstand er FRA"</string>
+    <string name="safeMode">"Sikker tilstand"</string>
+    <string name="android_system_label">"Android-system"</string>
+    <string name="permgrouplab_costMoney">"Tjenester, der koster dig penge"</string>
+    <string name="permgroupdesc_costMoney">"Tillader et program at gøre ting, som kan koste penge."</string>
+    <string name="permgrouplab_messages">"Dine beskeder"</string>
+    <string name="permgroupdesc_messages">"Læs og skriv dine SMS-, e-mail- og andre beskeder."</string>
+    <string name="permgrouplab_personalInfo">"Dine personlige oplysninger"</string>
+    <string name="permgroupdesc_personalInfo">"Få direkte adgang til dine kontaktpersoner og din kalender, der er gemt på telefonen."</string>
+    <string name="permgrouplab_location">"Din placering"</string>
+    <string name="permgroupdesc_location">"Overvåg din fysiske placering"</string>
+    <string name="permgrouplab_network">"Netværkskommunikation"</string>
+    <string name="permgroupdesc_network">"Tillader programmer at få adgang til forskellige netværksfunktioner."</string>
+    <string name="permgrouplab_accounts">"Dine Google-konti"</string>
+    <string name="permgroupdesc_accounts">"Få adgang til tilgængelige Google-konti."</string>
+    <string name="permgrouplab_hardwareControls">"Hardwarekontroller"</string>
+    <string name="permgroupdesc_hardwareControls">"Direkte adgang til hardware på håndsættet."</string>
+    <string name="permgrouplab_phoneCalls">"Telefonopkald"</string>
+    <string name="permgroupdesc_phoneCalls">"Overvåg, registrer og behandl telefonopkald."</string>
+    <string name="permgrouplab_systemTools">"Systemværktøjer"</string>
+    <string name="permgroupdesc_systemTools">"Adgang og kontrol til systemet på lavere niveau."</string>
+    <string name="permgrouplab_developmentTools">"Udviklingsværktøjer"</string>
+    <string name="permgroupdesc_developmentTools">"Funktioner kun til programudviklere."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"deaktiver eller rediger statuslinje"</string>
+    <string name="permdesc_statusBar">"Tillader et program at deaktivere statuslinjen eller tilføje eller fjerne systemikoner."</string>
+    <string name="permlab_expandStatusBar">"udvid/skjul statuslinje"</string>
+    <string name="permdesc_expandStatusBar">"Tillader et program at udvide eller skjule statuslinjen."</string>
+    <string name="permlab_processOutgoingCalls">"opfang udgående opkald"</string>
+    <string name="permdesc_processOutgoingCalls">"Tillader et program at behandle udgående opkald og ændre nummeret, der skal ringes til. Ondsindede programmer kan overvåge, omdirigere eller forhindre udgående opkald."</string>
+    <string name="permlab_receiveSms">"modtag SMS"</string>
+    <string name="permdesc_receiveSms">"Tillader et program at modtage og behandle SMS-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+    <string name="permlab_receiveMms">"modtag MMS"</string>
+    <string name="permdesc_receiveMms">"Tillader et program at modtage og behandle MMS-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+    <string name="permlab_sendSms">"send SMS-beskeder"</string>
+    <string name="permdesc_sendSms">"Tillader et program at sende SMS-beskeder. Ondsindede programmer kan eventuelt koste dig penge ved at sende beskeder uden din bekræftelse."</string>
+    <string name="permlab_readSms">"læs SMS eller MMS"</string>
+    <string name="permdesc_readSms">"Tillader et program at læse SMS-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt læse dine fortrolige beskeder."</string>
+    <string name="permlab_writeSms">"rediger SMS eller MMS"</string>
+    <string name="permdesc_writeSms">"Tillader et program at skrive til SMS-beskeder, der er gemt på din telefon eller dit SIM-kort. Ondsindede programmer kan eventuelt slette dine beskeder."</string>
+    <string name="permlab_receiveWapPush">"modtag WAP"</string>
+    <string name="permdesc_receiveWapPush">"Tillader et program at modtage og behandle WAP-beskeder. Ondsindede programmer kan overvåge dine beskeder eller slette dem uden at vise dem til dig."</string>
+    <string name="permlab_getTasks">"hent kørende programmer"</string>
+    <string name="permdesc_getTasks">"Tillader et program at hente oplysninger om nuværende og for nyligt kørende opgaver. Tillader eventuelt ondsindede programmer at finde private oplysninger om andre programmer."</string>
+    <string name="permlab_reorderTasks">"omorganiser kørende programmer"</string>
+    <string name="permdesc_reorderTasks">"Tillader et program at flytte opgaver til forgrunden og baggrunden. Ondsindede programmer kan tvinge dem selv til forgrunden uden din kontrol."</string>
+    <string name="permlab_setDebugApp">"aktiver programfejlretning"</string>
+    <string name="permdesc_setDebugApp">"Tillader et program at slå fejlretning af andet program til. Ondsindede programmer kan bruge dette til at standse andre programmer."</string>
+    <string name="permlab_changeConfiguration">"skift dine UI-indstillinger"</string>
+    <string name="permdesc_changeConfiguration">"Tillader et program at ændre den nuværende konfiguration, som f.eks. den lokale eller overordnede skrifttypestørrelse."</string>
+    <string name="permlab_restartPackages">"genstart andre programmer"</string>
+    <string name="permdesc_restartPackages">"Tillader et program at tvangsgenstarte andre programmer."</string>
+    <string name="permlab_forceBack">"tving programmet til at lukke"</string>
+    <string name="permdesc_forceBack">"Tillader et program at tvinge alle programmer, der er i forgrunden, til at lukke og gå tilbage. Bør aldrig være nødvendigt til normale programmer."</string>
+    <string name="permlab_dump">"hent intern systemtilstand"</string>
+    <string name="permdesc_dump">"Tillader et program at hente systemets interne tilstand. Ondsindede programmer kan hente en række private og sikre oplysninger, som de normalt aldrig bør have brug for."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"overvåg og kontroller start af alle programmer"</string>
+    <string name="permdesc_runSetActivityWatcher">"Tillader et program at overvåge og kontrollere, hvordan systemet starter aktiviteter. Ondsindede programmer kan fuldstændig kompromittere systemet. Denne tilladelse er kun nødvendig til udvikling, aldrig til normal telefonbrug."</string>
+    <string name="permlab_broadcastPackageRemoved">"send udsendelse om fjernet pakke"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Tillader et program at udsende en meddelelse om, at en programpakke er fjernet. Ondsindede programmer kan bruge dette til at afslutte et andet kørende program."</string>
+    <string name="permlab_broadcastSmsReceived">"send SMS-modtaget udsendelse"</string>
+    <string name="permdesc_broadcastSmsReceived">"Tillader et program at udsende en meddelelse om, at der er modtaget en SMS-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske indgående SMS-beskeder."</string>
+    <string name="permlab_broadcastWapPush">"send WAP-PUSH-modtaget udsendelse"</string>
+    <string name="permdesc_broadcastWapPush">"Tillader et program at udsende en meddelelse om, at der er modtaget en WAP PUSH-besked. Ondsindede programmer kan eventuelt bruge dette til at forfalske modtagelse af MMS-besked eller i det skjulte erstatte indholdet på alle websider med ondsindede varianter."</string>
+    <string name="permlab_setProcessLimit">"begræns antallet af kørende processer"</string>
+    <string name="permdesc_setProcessLimit">"Tillader et program at kontrollere det maksimale antal processer, der kan køre. Er aldrig nødvendigt til normale programmer."</string>
+    <string name="permlab_setAlwaysFinish">"få alle baggrundsprogrammer til at lukke"</string>
+    <string name="permdesc_setAlwaysFinish">"Tillader et program at kontrollere, om aktiviteter altid afsluttes, så snart de går i baggrunden. Aldrig nødvendigt til normale programmer."</string>
+    <string name="permlab_batteryStats">"rediger batteristatistikker"</string>
+    <string name="permdesc_batteryStats">"Tillader ændring af indsamlede batteristatistikker. Ikke til brug for normale programmer."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"vis uautoriserede vinduer"</string>
+    <string name="permdesc_internalSystemWindow">"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">"vis underretninger på systemniveau"</string>
+    <string name="permdesc_systemAlertWindow">"Tillader et program at vise systemunderretningsvinduer. Ondsindede programmer kan overtage hele telefonens skærm."</string>
+    <string name="permlab_setAnimationScale">"rediger global animationshastighed"</string>
+    <string name="permdesc_setAnimationScale">"Tillader et program at ændre den globale animationshastighed (hurtigere eller langsommere animationer) når som helst."</string>
+    <string name="permlab_manageAppTokens">"administrer programtokens"</string>
+    <string name="permdesc_manageAppTokens">"Tillader programmet at oprette og administrere deres egen tokens og gå uden om deres normale Z-rækkefølge. Bør aldrig være nødvendigt til normale programmer."</string>
+    <string name="permlab_injectEvents">"tryk på taster og kontrolknapper"</string>
+    <string name="permdesc_injectEvents">"Tillader et program at levere sine egne inputbegivenheder (tastetryk osv.) til andre programmer. Ondsindede programmer kan bruge dette til at overtage telefonen."</string>
+    <string name="permlab_readInputState">"registrerer, hvad du indtaster, og hvilke handlinger du foretager dig"</string>
+    <string name="permdesc_readInputState">"Tillader et program at holde øje med de taster, du trykker på, selv når du interagerer med andre programmer (som f.eks. indtastning af adgangskode). Bør aldrig være nødvendigt til normale programmer."</string>
+    <string name="permlab_bindInputMethod">"forpligt til en inputmetode"</string>
+    <string name="permdesc_bindInputMethod">"Tillader brugeren at forpligte sig på en inputmetodes grænseflade på øverste niveau. Bør aldrig være nødvendig til normale programmer."</string>
+    <string name="permlab_setOrientation">"skift skærmretning"</string>
+    <string name="permdesc_setOrientation">"Tillader et program at ændre rotationen af skærmen når som helst. Bør aldrig være nødvendigt til normale programmer."</string>
+    <string name="permlab_signalPersistentProcesses">"send Linux-signaler til programmer"</string>
+    <string name="permdesc_signalPersistentProcesses">"Tillader program at anmode om, at det leverede signal sendes til alle vedholdende processer."</string>
+    <string name="permlab_persistentActivity">"lad altid programmet køre"</string>
+    <string name="permdesc_persistentActivity">"Tillader et program at gøre dele af sig selv vedholdende, så systemet ikke kan bruge det til andre programmer."</string>
+    <string name="permlab_deletePackages">"slet programmer"</string>
+    <string name="permdesc_deletePackages">"Tillader et program at slette Android-pakker. Ondsindede programmer kan bruge dette til at slette vigtige programmer."</string>
+    <string name="permlab_clearAppUserData">"slet andre programmers data"</string>
+    <string name="permdesc_clearAppUserData">"Lader et program rydde brugerdata."</string>
+    <string name="permlab_deleteCacheFiles">"slet andre programmers cacher"</string>
+    <string name="permdesc_deleteCacheFiles">"Tillader et program at slette cachefiler."</string>
+    <string name="permlab_getPackageSize">"måler programmets lagerplads"</string>
+    <string name="permdesc_getPackageSize">"Tillader et program at hente dets kode, data og cachestørrelser"</string>
+    <string name="permlab_installPackages">"installer programmer direkte"</string>
+    <string name="permdesc_installPackages">"Tillader et program at installere 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">"slet alle cachedata for programmet"</string>
+    <string name="permdesc_clearAppCache">"Tillader et program at frigøre plads på telefonen ved at slette filer i programmets cachemappe. Adgang er normalt meget begrænset til systemprocesser."</string>
+    <string name="permlab_readLogs">"læs systemlogfiler"</string>
+    <string name="permdesc_readLogs">"Tillader et program at læse fra systemets forskellige logfiler. Dermed kan generelle oplysninger om, hvad du laver med telefonen, opdages, men logfilerne skulle ikke indeholde personlige eller private oplysninger."</string>
+    <string name="permlab_diagnostic">"læs/skriv til ressourcer ejet af diag"</string>
+    <string name="permdesc_diagnostic">"Tillader et program at læse og skrive til alle ressourcer, der ejes af diag-gruppen, som f.eks. flier i /dev. Dette kan muligvis påvirke systemets stabilitet og sikkerhed. Dette bør KUN bruges til hardwarespecifikke diagnosticeringer foretaget af producent eller udbyder."</string>
+    <string name="permlab_changeComponentState">"aktiver eller deaktiver programkomponenter"</string>
+    <string name="permdesc_changeComponentState">"Tillader et program at ændre, om en komponent fra et andet program er aktiveret eller ej. Ondsindede programmer kan bruge dette til at deaktivere vigtige telefonfunktioner. Denne tilladelse skal anvendes med forsigtighed, da det kan forårsage ubrugelige, inkonsekvente eller ustabile programkomponenter."</string>
+    <string name="permlab_setPreferredApplications">"indstil foretrukne programmer"</string>
+    <string name="permdesc_setPreferredApplications">"Tillader et program at ændre dine foretrukne programmer. Dette kan tillade, at ondsindede programmer ændrer kørende programmer i det skjulte og narrer dine eksisterende programmer til at indsamle personlige data fra dig."</string>
+    <string name="permlab_writeSettings">"rediger globale systemindstillinger"</string>
+    <string name="permdesc_writeSettings">"Tillader et program at ændre systemets indstillingsdata. Ondsindede programmer kan skade systemets konfiguration."</string>
+    <string name="permlab_writeSecureSettings">"rediger sikre systemindstillinger"</string>
+    <string name="permdesc_writeSecureSettings">"Tillader et program at ændre systemernes sikre indstillingsdata. Ikke til brug til almindelige programmer."</string>
+    <string name="permlab_writeGservices">"rediger kortet over Google-tjenester"</string>
+    <string name="permdesc_writeGservices">"Tillader et program at ændre kortet over Google-tjenester. Ikke til brug til normale programmer."</string>
+    <string name="permlab_receiveBootCompleted">"start automatisk ved opstart"</string>
+    <string name="permdesc_receiveBootCompleted">"Tillader et program at starte selv, når systemet er færdig med at starte. Dette kan gøre start af telefonen langsommere og generelt gøre telefonen langsommere ved altid at lade programmet køre."</string>
+    <string name="permlab_broadcastSticky">"send klæbende udsendelse"</string>
+    <string name="permdesc_broadcastSticky">"Tillader et program at sende klæbende udsendelser, der bliver tilbage, efter udsendelsen er slut. Ondsindede programmer kan gøre telefonen langsom eller ustabil ved at få den til at bruge for meget hukommelse."</string>
+    <string name="permlab_readContacts">"læs kontaktpersondata"</string>
+    <string name="permdesc_readContacts">"Tillader et program at læse alle kontaktpersondata (adresse), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at sende dine data til andre mennesker."</string>
+    <string name="permlab_writeContacts">"skriv kontaktpersondata"</string>
+    <string name="permdesc_writeContacts">"Tillader et program at ændre telefonens kontaktpersondata (adresse), der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kontaktpersondata."</string>
+    <string name="permlab_writeOwnerData">"skriv ejerdata"</string>
+    <string name="permdesc_writeOwnerData">"Tillader et program at ændre telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre ejerdata."</string>
+    <string name="permlab_readOwnerData">"læs ejerdata"</string>
+    <string name="permdesc_readOwnerData">"Tillader et program at læse telefonens ejerdata, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at læse ejerdata."</string>
+    <string name="permlab_readCalendar">"læs kalenderdata"</string>
+    <string name="permdesc_readCalendar">"Tillader et program at læse 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">"skriv kalenderdata"</string>
+    <string name="permdesc_writeCalendar">"Tillader et program at ændre telefonens kalenderbegivenheder, der er gemt på din telefon. Ondsindede programmer kan bruge dette til at slette eller ændre kalenderdata."</string>
+    <string name="permlab_accessMockLocation">"imiterede placeringskilder til test"</string>
+    <string name="permdesc_accessMockLocation">"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">"få adgang til ekstra kommandoer for placeringsudbyder"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Få adgang til ekstra kommandoer fra placeringsudbyder. Ondsindede programmer kan bruge dette til at gribe ind i driften af GPS\'en eller andre placeringskilder."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"fin (GPS) placering"</string>
+    <string name="permdesc_accessFineLocation">"Få adgang til gode placeringskilder, som f.eks. Global Positioning System på telefonen, når det er tilgængeligt. Ondsindede programmer kan bruge dette til at finde ud af, hvor du er og kan eventuelt bruge yderligere batterikapacitet."</string>
+    <string name="permlab_accessCoarseLocation">"grov (netværksbaseret) placering"</string>
+    <string name="permdesc_accessCoarseLocation">"Få adgang til grove placeringskilder som f.eks. den mobile netværksdatabase for at finde en omtrentlig placering for telefonen, hvor det er muligt. Ondsindede programmer kan bruge dette til at finde ud af, hvor du omtrent er."</string>
+    <string name="permlab_accessSurfaceFlinger">"få adgang til SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Tillader et program at bruge SurfaceFlinger-funktioner på lavt niveau."</string>
+    <string name="permlab_readFrameBuffer">"læs rammebuffer"</string>
+    <string name="permdesc_readFrameBuffer">"Tillader et program at læse/bruge indholdet fra rammebufferen."</string>
+    <string name="permlab_modifyAudioSettings">"skift dine lydindstillinger"</string>
+    <string name="permdesc_modifyAudioSettings">"Tillader et program at ændre globale lydindstillinger som f.eks. lydstyrke og kanalisering."</string>
+    <string name="permlab_recordAudio">"optag lyd"</string>
+    <string name="permdesc_recordAudio">"Tillader et program at få adgang til lydregistreringsstien."</string>
+    <string name="permlab_camera">"tag billeder"</string>
+    <string name="permdesc_camera">"Tillader programmet at tage billeder med kameraet. Dette tillader programmet til hver en tid at indsamle de billeder, kameraet ser."</string>
+    <string name="permlab_brick">"deaktiver telefonen permanent"</string>
+    <string name="permdesc_brick">"Tillader programmet at deaktivere hele telefonen permanent. Dette er meget farligt."</string>
+    <string name="permlab_reboot">"tving telefon til at genstarte"</string>
+    <string name="permdesc_reboot">"Tillader programmet at tvinge telefonen til at genstarte."</string>
+    <string name="permlab_mount_unmount_filesystems">"monter eller demonter filsystemer"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Tillader programmet at montere eller demontere filsystemer til flytbar lagring."</string>
+    <string name="permlab_mount_format_filesystems">"formater ekstern lagring"</string>
+    <string name="permdesc_mount_format_filesystems">"Tillader et program at formatere flytbar lagring."</string>
+    <string name="permlab_vibrate">"kontroller vibrator"</string>
+    <string name="permdesc_vibrate">"Lader programmet kontrollere vibratoren."</string>
+    <string name="permlab_flashlight">"kontroller lommelygte"</string>
+    <string name="permdesc_flashlight">"Tillader programmet at kontrollere lommelygten."</string>
+    <string name="permlab_hardware_test">"test hardware"</string>
+    <string name="permdesc_hardware_test">"Tillader et program at kontrollere forskellige perifere enheder med det formål at teste hardwaren."</string>
+    <string name="permlab_callPhone">"ring direkte op til telefonnumre"</string>
+    <string name="permdesc_callPhone">"Tillader programmet at ringe til telefonnumre uden din indgriben. Ondsindede programmer kan forårsage uventede opkald på din telefonregning. Vær opmærksom på, at det ikke tillader programmet at ringe til nødnumre."</string>
+    <string name="permlab_callPrivileged">"ring direkte op til alle telefonnumre"</string>
+    <string name="permdesc_callPrivileged">"Tillader programmet at ringe til alle telefonnumre inklusive nødnumre uden din indgriben. Ondsindede programmer kan eventuelt foretage unødvendige og ulovlige opkald til nødtjenester."</string>
+    <string name="permlab_locationUpdates">"kontroller meddelelser om placeringsopdatering"</string>
+    <string name="permdesc_locationUpdates">"Tillader aktivering/deaktivering af placeringsdata fra radioen. Ikke til brug til normale programmer."</string>
+    <string name="permlab_checkinProperties">"egenskaber for adgangskontrol"</string>
+    <string name="permdesc_checkinProperties">"Tillader læse/skrive-adgang til egenskaber, der er uploadet af kontroltjenesten. Ikke til brug til normale programmer."</string>
+    <string name="permlab_bindGadget">"vælg widgets"</string>
+    <string name="permdesc_bindGadget">"Tillader programmet at fortælle systemet, hvilke widgets der kan bruges af hvilke programmer. Med denne tilladelse kan programmer give adgang til personlige data til andre programmer. Ikke til brug til normale programmer."</string>
+    <string name="permlab_modifyPhoneState">"rediger telefontilstand"</string>
+    <string name="permdesc_modifyPhoneState">"Tillader programmet at kontrollere enhedens telefonfunktioner. Et program med denne tilladelse kan skifte netværk, slå telefonens radio til og fra og lignende uden nogensinde at underrette dig."</string>
+    <string name="permlab_readPhoneState">"læs telefontilstand"</string>
+    <string name="permdesc_readPhoneState">"Tillader programmet at få adgang til enhedens telefonfunktioner. Et program med denne tilladelse kan afgøre denne telefons nummer, om et opkald er aktivt, nummeret som opkaldet er forbundet til osv."</string>
+    <string name="permlab_wakeLock">"afhold telefonen fra at gå i dvale"</string>
+    <string name="permdesc_wakeLock">"Tillader et program at forhindre telefonen i at gå i dvale."</string>
+    <string name="permlab_devicePower">"Tænd eller sluk for telefonen"</string>
+    <string name="permdesc_devicePower">"Tillader programmet at slå telefonen til eller fra."</string>
+    <string name="permlab_factoryTest">"kør i fabriksindstillet testtilstand"</string>
+    <string name="permdesc_factoryTest">"Kør som en producenttest på lavt niveau. Giver fuld adgang til telefonens hardware. Kun tilgængeligt når en telefon kører i producenttesttilstand."</string>
+    <string name="permlab_setWallpaper">"angiv tapet"</string>
+    <string name="permdesc_setWallpaper">"Tillader programmet at opsætte systemets tapet."</string>
+    <string name="permlab_setWallpaperHints">"opsæt tip til tapetstørrelse"</string>
+    <string name="permdesc_setWallpaperHints">"Tillader programmet at opsætte størrelsestip for systemets tapet."</string>
+    <string name="permlab_masterClear">"nulstil system til fabriksstandarder"</string>
+    <string name="permdesc_masterClear">"Tillader et program fuldstændig at nulstille systemet til fabriksindstillingerne, slette alle data, konfigurationen og installerede programmer."</string>
+    <string name="permlab_setTimeZone">"indstil tidszone"</string>
+    <string name="permdesc_setTimeZone">"Tillader et program at ændre telefonens tidszone."</string>
+    <string name="permlab_getAccounts">"opdag kendte konti"</string>
+    <string name="permdesc_getAccounts">"Tillader et program at hente listen over konti, der er kendt af telefonen."</string>
+    <string name="permlab_accessNetworkState">"vis netværkstilstand"</string>
+    <string name="permdesc_accessNetworkState">"Tillader et program at vise tilstanden for alle netværk."</string>
+    <string name="permlab_createNetworkSockets">"Fuld internetadgang"</string>
+    <string name="permdesc_createNetworkSockets">"Tillader et program at oprette netværks-sockets."</string>
+    <string name="permlab_writeApnSettings">"skriv indstillinger for adgangspunktnavn"</string>
+    <string name="permdesc_writeApnSettings">"Tillader et program at ændre APN-indstillingerne, som f.eks. enhver APNs Proxy og Port."</string>
+    <string name="permlab_changeNetworkState">"skift netværksforbindelse"</string>
+    <string name="permdesc_changeNetworkState">"Tillader et program at ændre netværksforbindelsens tilstand."</string>
+    <string name="permlab_changeBackgroundDataSetting">"skift brugerindstilling for baggrundsdata"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Tillader et program at ændre brugerindstillingerne for baggrundsdata."</string>
+    <string name="permlab_accessWifiState">"vis Wi-Fi-tilstand"</string>
+    <string name="permdesc_accessWifiState">"Tillader et program at vise oplysninger om Wi-Fi-tilstanden."</string>
+    <string name="permlab_changeWifiState">"skift Wi-Fi-tilstand"</string>
+    <string name="permdesc_changeWifiState">"Tillader et program at oprette og afbryde forbindelse fra Wi-Fi-adgangspunkter og foretage ændringer til konfigurerede Wi-Fi-netværk."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"bluetooth-administration"</string>
+    <string name="permdesc_bluetoothAdmin">"Tillader et program at konfigurere den lokale Bluetooth-telefon samt at opdage og parre med fjerne enheder."</string>
+    <string name="permlab_bluetooth">"opret Bluetooth-forbindelser"</string>
+    <string name="permdesc_bluetooth">"Tillader et program at vise konfigurationen af den lokale Bluetooth-telefon samt at oprette og acceptere forbindelse med parrede enheder."</string>
+    <string name="permlab_disableKeyguard">"deaktiver tastaturlås"</string>
+    <string name="permdesc_disableKeyguard">"Tillader et program at deaktivere tastaturlåsen og al associeret adgangskodesikkerhed. Et legitimt eksempel på dette er, at telefonen deaktiverer tastaturlåsen, når der modtages et indgående telefonopkald, og genaktiverer tastaturlåsen, når opkaldet er afsluttet."</string>
+    <string name="permlab_readSyncSettings">"læs synkroniseringsindstillinger"</string>
+    <string name="permdesc_readSyncSettings">"Tillader et program at læse synkroniseringsindstillingerne, som f.eks. om synkronisering er aktiveret for kontaktpersoner."</string>
+    <string name="permlab_writeSyncSettings">"skriv synkroniseringsindstillinger"</string>
+    <string name="permdesc_writeSyncSettings">"Tillader et program at ændre synkroniseringsindstillingerne, som f.eks. om synkronisering er aktiveret for kontaktpersoner."</string>
+    <string name="permlab_readSyncStats">"læs synkroniseringsstatistikker"</string>
+    <string name="permdesc_readSyncStats">"Tillader et program at læse synkroniseringsstatistikkerne, som f.eks. oversigt over forekomne synkroniseringer."</string>
+    <string name="permlab_subscribedFeedsRead">"læs abonnerede feeds"</string>
+    <string name="permdesc_subscribedFeedsRead">"Lader et program få detaljer om de aktuelt synkroniserede feeds."</string>
+    <string name="permlab_subscribedFeedsWrite">"skriv abonnerede feeds"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Tillader et program at ændre dine aktuelle synkroniserede feeds. Dette kan muligvis lade et ondsindet program ændre dine synkroniserede feeds."</string>
+    <string name="permlab_readDictionary">"læs brugerdefineret ordbog"</string>
+    <string name="permdesc_readDictionary">"Tillader et program at læse alle private ord, navne og sætninger, som brugeren eventuelt har gemt i brugerordbogen."</string>
+    <string name="permlab_writeDictionary">"skriv til den brugerdefinerede mappe"</string>
+    <string name="permdesc_writeDictionary">"Tillader et program at skrive nye ord i brugermappen."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
+  <string-array name="phoneTypes">
+    <item>"Start"</item>
+    <item>"Mobil"</item>
+    <item>"Arbejde"</item>
+    <item>"Arbejdsfax"</item>
+    <item>"Hjemmefax"</item>
+    <item>"Personsøger"</item>
+    <item>"Andet"</item>
+    <item>"Tilpasset"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Start"</item>
+    <item>"Arbejde"</item>
+    <item>"Anden"</item>
+    <item>"Tilpasset"</item>
+  </string-array>
+    <string name="mobileEmailTypeName">"Mobil"</string>
+  <string-array name="postalAddressTypes">
+    <item>"Start"</item>
+    <item>"Arbejde"</item>
+    <item>"Anden"</item>
+    <item>"Tilpasset"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Start"</item>
+    <item>"Arbejde"</item>
+    <item>"Anden"</item>
+    <item>"Tilpasset"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Arbejde"</item>
+    <item>"Anden"</item>
+    <item>"Tilpasset"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Indtast PIN-kode"</string>
+    <string name="keyguard_password_wrong_pin_code">"Forkert PIN-kode!"</string>
+    <string name="keyguard_label_text">"Tryk på Menu og dernæst på 0 for at låse op."</string>
+    <string name="emergency_call_dialog_number_for_display">"Nødnummer"</string>
+    <string name="lockscreen_carrier_default">"(Ingen tjeneste)"</string>
+    <string name="lockscreen_screen_locked">"Skærmen er låst."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Tryk på Menu for at låse op eller foretage et nødopkald."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Tryk på Menu for at låse op."</string>
+    <string name="lockscreen_pattern_instructions">"Tegn mønster til at låse op"</string>
+    <string name="lockscreen_emergency_call">"Nødopkald"</string>
+    <string name="lockscreen_pattern_correct">"Rigtigt!"</string>
+    <string name="lockscreen_pattern_wrong">"Beklager! Prøv igen"</string>
+    <string name="lockscreen_plugged_in">"Oplader (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
+    <string name="lockscreen_low_battery">"Tilslut din oplader."</string>
+    <string name="lockscreen_missing_sim_message_short">"Der er ikke noget SIM-kort."</string>
+    <string name="lockscreen_missing_sim_message">"Der er ikke noget SIM-kort i telefonen."</string>
+    <string name="lockscreen_missing_sim_instructions">"Indsæt et SIM-kort."</string>
+    <string name="lockscreen_network_locked_message">"Netværket er låst"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM-kort er låst med PUK-koden."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Se brugervejledningen, eller kontakt kundeservice."</string>
+    <string name="lockscreen_sim_locked_message">"SIM-kortet er låst."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Låser SIM-kortet op ..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Du har tegnet dit mønster til at låse op forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. "\n\n"Prøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Du har tegnet dit mønster til at låse op forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> forsøg mere vil du blive bedt om at låse din telefon op ved hjælp af dit Google-login"\n\n" Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Prøv igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Har du glemt mønster?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"For mange mønsterforsøg!"</string>
+    <string name="lockscreen_glogin_instructions">"For at låse op skal du logge ind med din Google-konto"</string>
+    <string name="lockscreen_glogin_username_hint">"Brugernavn (e-mail)"</string>
+    <string name="lockscreen_glogin_password_hint">"Adgangskode"</string>
+    <string name="lockscreen_glogin_submit_button">"Log ind"</string>
+    <string name="lockscreen_glogin_invalid_input">"Ugyldigt brugernavn eller ugyldig adgangskode."</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
+    <string name="status_bar_no_notifications_title">"Ingen meddelelser"</string>
+    <string name="status_bar_ongoing_events_title">"Løbende"</string>
+    <string name="status_bar_latest_events_title">"Meddelelser"</string>
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="battery_status_charging">"Oplader ..."</string>
+    <string name="battery_low_title">"Forbind oplader"</string>
+    <string name="battery_low_subtitle">"Batteriet er ved at blive tomt:"</string>
+    <string name="battery_low_percent_format">"mindre end <xliff:g id="NUMBER">%d%%</xliff:g> tilbage."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"Fabrikstest mislykkedes"</string>
+    <string name="factorytest_not_system">"Handlingen FACTORY_TEST understøttes kun af pakker installeret i /system/app."</string>
+    <string name="factorytest_no_action">"Der blev ikke fundet nogen pakke, som leverer handlingen FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Genstart"</string>
+    <string name="js_dialog_title">"Siden på \'<xliff:g id="TITLE">%s</xliff:g>\' siger:"</string>
+    <string name="js_dialog_title_default">"Javascript"</string>
+    <string name="js_dialog_before_unload">"Naviger væk fra denne side?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n" Vælg OK for at fortsætte eller Annuller for at blive på den aktuelle side."</string>
+    <string name="save_password_label">"Bekræft"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Ønsker du, at browseren skal huske denne adgangskode?"</string>
+    <string name="save_password_notnow">"Ikke nu"</string>
+    <string name="save_password_remember">"Husk"</string>
+    <string name="save_password_never">"Aldrig"</string>
+    <string name="open_permission_deny">"Du har ikke tilladelse til at åbne denne side."</string>
+    <string name="text_copied">"Teksten er kopieret til udklipsholderen."</string>
+    <string name="more_item_label">"Flere"</string>
+    <string name="prepend_shortcut_label">"Menu+"</string>
+    <string name="menu_space_shortcut_label">"plads"</string>
+    <string name="menu_enter_shortcut_label">"indtast"</string>
+    <string name="menu_delete_shortcut_label">"slet"</string>
+    <string name="search_go">"Søg"</string>
+    <string name="oneMonthDurationPast">"For 1 måned siden"</string>
+    <string name="beforeOneMonthDurationPast">"Før for 1 måned siden"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"For 1 sekund siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> sekunder siden"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"For 1 minut siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> minutter siden"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"For 1 time siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> timer siden"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"i går"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> dage siden"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"om 1 sekund"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"om 1 minut"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> minutter"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"om 1 time"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> timer"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"i morgen"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> dage"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"For 1 sek. siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> sek. siden"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"For 1 min. siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> min. siden"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"For 1 time siden"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> timer siden"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"i går"</item>
+    <item quantity="other">"For <xliff:g id="COUNT">%d</xliff:g> dage siden"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"om 1 sek."</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"om 1 min."</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> min."</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"om 1 time"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> timer"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"i morgen"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> dage"</item>
+  </plurals>
+    <string name="preposition_for_date">"den %s"</string>
+    <string name="preposition_for_time">"kl. %s"</string>
+    <string name="preposition_for_year">"i %s"</string>
+    <string name="day">"dag"</string>
+    <string name="days">"dage"</string>
+    <string name="hour">"time"</string>
+    <string name="hours">"timer"</string>
+    <string name="minute">"min."</string>
+    <string name="minutes">"min."</string>
+    <string name="second">"sek."</string>
+    <string name="seconds">"sek."</string>
+    <string name="week">"uge"</string>
+    <string name="weeks">"uger"</string>
+    <string name="year">"år"</string>
+    <string name="years">"år"</string>
+    <string name="every_weekday">"Hver ugedag (man.-fre.)"</string>
+    <string name="daily">"Dagligt"</string>
+    <string name="weekly">"Ugentlig hver <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Månedligt"</string>
+    <string name="yearly">"Årligt"</string>
+    <string name="VideoView_error_title">"Video kan ikke afspilles"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Beklager! Denne video er ikke gyldig til streaming på denne enhed."</string>
+    <string name="VideoView_error_text_unknown">"Beklager! Denne video kan ikke afspilles."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon">"middag"</string>
+    <string name="Noon">"Middag"</string>
+    <string name="midnight">"midnat"</string>
+    <string name="Midnight">"Midnat"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Vælg alle"</string>
+    <string name="selectText">"Vælg tekst"</string>
+    <string name="stopSelectingText">"Stands med at vælge tekst"</string>
+    <string name="cut">"Klip"</string>
+    <string name="cutAll">"Klip alle"</string>
+    <string name="copy">"Kopier"</string>
+    <string name="copyAll">"Kopier alle"</string>
+    <string name="paste">"Indsæt"</string>
+    <string name="copyUrl">"Kopier webadresse"</string>
+    <string name="inputMethod">"Inputmetode"</string>
+    <string name="addToDictionary">"Føj \"%s\" til ordbog"</string>
+    <string name="editTextMenuTitle">"Rediger tekst"</string>
+    <string name="low_internal_storage_view_title">"Der er ikke så meget plads tilbage"</string>
+    <string name="low_internal_storage_view_text">"Der er næsten ikke mere plads på telefonen."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Annuller"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Annuller"</string>
+    <string name="dialog_alert_title">"Bemærk"</string>
+    <string name="capital_on">"TIL"</string>
+    <string name="capital_off">"FRA"</string>
+    <string name="whichApplication">"Afslut handling ved hjælp af"</string>
+    <string name="alwaysUse">"Brug som standard til denne handling."</string>
+    <string name="clearDefaultHintMsg">"Ryd standard i Startindstillinger &gt; Programmer &gt; Administrer programmer."</string>
+    <string name="chooseActivity">"Vælg en handling"</string>
+    <string name="noApplications">"Der er ingen programmer, der kan foretage denne handling."</string>
+    <string name="aerr_title">"Beklager!"</string>
+    <string name="aerr_application">"Programmet <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) er standset uventet. Prøv igen."</string>
+    <string name="aerr_process">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> er standset uventet. Prøv igen."</string>
+    <string name="anr_title">"Beklager!"</string>
+    <string name="anr_activity_application">"Aktivitet <xliff:g id="ACTIVITY">%1$s</xliff:g> (i programmet <xliff:g id="APPLICATION">%2$s</xliff:g>) svarer ikke."</string>
+    <string name="anr_activity_process">"Aktivitet <xliff:g id="ACTIVITY">%1$s</xliff:g> (igangværende <xliff:g id="PROCESS">%2$s</xliff:g>) svarer ikke."</string>
+    <string name="anr_application_process">"Programmet <xliff:g id="APPLICATION">%1$s</xliff:g> (igangværende <xliff:g id="PROCESS">%2$s</xliff:g>) svarer ikke."</string>
+    <string name="anr_process">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> svarer ikke."</string>
+    <string name="force_close">"Tving til at lukke"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Vent"</string>
+    <string name="debug">"Fejlretning"</string>
+    <string name="sendText">"Vælg en handling for teksten"</string>
+    <string name="volume_ringtone">"Opkaldslydstyrke"</string>
+    <string name="volume_music">"Medielydstyrke"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Spiller gennem Bluetooth"</string>
+    <string name="volume_call">"Opkaldslydstyrke"</string>
+    <string name="volume_bluetooth_call">"Bluetooth-lydstyrke under opkald"</string>
+    <string name="volume_alarm">"Alarmlydstyrke"</string>
+    <string name="volume_notification">"Meddelelseslydstyrke"</string>
+    <string name="volume_unknown">"Lydstyrke"</string>
+    <string name="ringtone_default">"Standardringetone"</string>
+    <string name="ringtone_default_with_actual">"Standardringetone (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Lydløs"</string>
+    <string name="ringtone_picker_title">"Ringetoner"</string>
+    <string name="ringtone_unknown">"Ukendt ringetone"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Wi-Fi-netværk tilgængeligt"</item>
+    <item quantity="other">"Tilgængelige Wi-Fi-netværk"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Åbent Wi-Fi-netværk tilgængeligt"</item>
+    <item quantity="other">"Der er åbne Wi-Fi-netværk tilgængelige"</item>
+  </plurals>
+    <string name="select_character">"Indsæt tegn"</string>
+    <string name="sms_control_default_app_name">"Ukendt program"</string>
+    <string name="sms_control_title">"Sender SMS-beskeder"</string>
+    <string name="sms_control_message">"Der sendes et stort antal SMS-beskeder. Vælg \"OK\" for at fortsætte eller \"Annuller\" for at stoppe med at sende."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Annuller"</string>
+    <string name="date_time_set">"Indstil"</string>
+    <string name="default_permission_group">"Standard"</string>
+    <string name="no_permissions">"Der kræves ingen tilladelser"</string>
+    <string name="perms_hide"><b>"Skjul"</b></string>
+    <string name="perms_show_all"><b>"Vis alle"</b></string>
+    <string name="googlewebcontenthelper_loading">"Indlæser ..."</string>
+    <string name="usb_storage_title">"USB forbundet"</string>
+    <string name="usb_storage_message">"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">"Monter"</string>
+    <string name="usb_storage_button_unmount">"Indsæt ikke"</string>
+    <string name="usb_storage_error_message">"Der opstod et problem med at bruge dit SD-kort til USB-lagring."</string>
+    <string name="usb_storage_notification_title">"USB forbundet"</string>
+    <string name="usb_storage_notification_message">"Vælg for at kopiere filer til/fra din computer."</string>
+    <string name="usb_storage_stop_notification_title">"Slå USB-lagringen fra"</string>
+    <string name="usb_storage_stop_notification_message">"Vælg for at slå USB-lagring fra."</string>
+    <string name="usb_storage_stop_title">"Slå USB-lagring fra"</string>
+    <string name="usb_storage_stop_message">"Inden du slår USB-lagringen fra, skal du sørge for, at du demonterer USB-værten. Vælg \"Slå fra\" for at slå USB-lagringen fra."</string>
+    <string name="usb_storage_stop_button_mount">"Slå fra"</string>
+    <string name="usb_storage_stop_button_unmount">"Annuller"</string>
+    <string name="usb_storage_stop_error_message">"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="extmedia_format_title">"Formater SD-kort"</string>
+    <string name="extmedia_format_message">"Er du sikker på, du ønsker at formatere SD-kortet? Alle data på kortet mistes."</string>
+    <string name="extmedia_format_button_format">"Formater"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Vælg inputmetode"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"kandidater"</u></string>
+    <string name="ext_media_checking_notification_title">"Forbereder SD-kort"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
+    <string name="ext_media_nofs_notification_title">"Blankt SD-kort"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
+    <string name="ext_media_unmountable_notification_title">"Beskadiget SD-kort"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
+    <string name="ext_media_badremoval_notification_title">"SD-kort blev uventet fjernet"</string>
+    <string name="ext_media_badremoval_notification_message">"Demonter SD-kortet inden fjernelse for at undgå tab af data."</string>
+    <string name="ext_media_safe_unmount_notification_title">"SD-kortet kan fjernes sikkert"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"SD-kortet er fjernet"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
+    <string name="activity_list_empty">"Der blev ikke fundet nogen matchende aktiviteter"</string>
+    <string name="permlab_pkgUsageStats">"opdater brugerstatistikker for komponenter"</string>
+    <string name="permdesc_pkgUsageStats">"Tillader ændring af indsamlede brugerstatistikker for komponenter. Ikke til brug til normale programmer."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Tryk to gange for zoomkontrol"</string>
+    <string name="gadget_host_error_inflating">"Der opstod en fejl under forøgelsen af widgeten"</string>
+    <string name="ime_action_go">"Gå"</string>
+    <string name="ime_action_search">"Søg"</string>
+    <string name="ime_action_send">"Send"</string>
+    <string name="ime_action_next">"Næste"</string>
+    <string name="ime_action_done">"Færdig"</string>
+    <string name="ime_action_default">"Udfør"</string>
+    <string name="dial_number_using">"Ring til nummer"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Opret kontaktperson"\n"ved hjælp af <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
+</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index dfb4549..56d9ef8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;Unbenannt&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Keine Telefonnummer)"</string>
@@ -43,11 +44,17 @@
     <string name="needPuk2">"Geben Sie zum Entsperren der SIM-Karte den PUK2 ein."</string>
     <string name="ClipMmi">"Anrufer-ID für eingehenden Anruf"</string>
     <string name="ClirMmi">"Anrufer-ID für abgehenden Anruf"</string>
-    <string name="CfMmi">"Anrufweiterleitung"</string>
+    <string name="CfMmi">"Rufweiterleitung"</string>
     <string name="CwMmi">"Anklopfen"</string>
     <string name="BaMmi">"Anrufsperre"</string>
     <string name="PwdMmi">"Passwort-Änderung"</string>
     <string name="PinMmi">"PIN-Änderung"</string>
+    <string name="CnipMmi">"Rufnummer vorhanden"</string>
+    <string name="CnirMmi">"Rufnummer begrenzt"</string>
+    <string name="ThreeWCMmi">"Dreierkonferenz"</string>
+    <string name="RuacMmi">"Ablehnung unerwünschter Anrufe"</string>
+    <string name="CndMmi">"Rufnummernübermittlung"</string>
+    <string name="DndMmi">"Bitte nicht stören"</string>
     <string name="CLIRDefaultOnNextCallOn">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Beschränkt"</string>
     <string name="CLIRDefaultOnNextCallOff">"Anrufer-ID ist standardmäßig beschränkt. Nächster Anruf: Nicht beschränkt"</string>
     <string name="CLIRDefaultOffNextCallOn">"Anrufer-ID ist standardmäßig nicht beschränkt. Nächster Anruf: Beschränkt"</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Synchron"</string>
     <string name="serviceClassPacket">"Paket"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Roaming-Anzeige ein"</string>
+    <string name="roamingText1">"Roaming-Anzeige aus"</string>
+    <string name="roamingText2">"Roaming-Anzeige blinkend"</string>
+    <string name="roamingText3">"Außerhalb der Netzwerkumgebung"</string>
+    <string name="roamingText4">"Außerhalb des Gebäudes"</string>
+    <string name="roamingText5">"Roaming - Bevorzugtes System"</string>
+    <string name="roamingText6">"Roaming - Verfügbares System"</string>
+    <string name="roamingText7">"Roaming - Allianzpartner"</string>
+    <string name="roamingText8">"Roaming - Premiumpartner"</string>
+    <string name="roamingText9">"Roaming - Volle Dienstfunktionalität"</string>
+    <string name="roamingText10">"Roaming - Partielle Dienstfunktionalität"</string>
+    <string name="roamingText11">"Roaming-Banner ein"</string>
+    <string name="roamingText12">"Roaming-Banner aus"</string>
+    <string name="roamingTextSearching">"Suche nach Dienst"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nicht weitergeleitet"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> nach <xliff:g id="TIME_DELAY">{2}</xliff:g> Sekunden."</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nicht weitergeleitet"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nicht weitergeleitet"</string>
+    <string name="fcComplete">"Funktionscode abgeschlossen"</string>
+    <string name="fcError">"Verbindungsproblem oder ungültiger Funktionscode"</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"Auf der Webseite ist ein Fehler aufgetreten."</string>
     <string name="httpErrorLookup">"Die URL konnte nicht gefunden werden."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"Auf die Datei konnte nicht zugegriffen werden."</string>
     <string name="httpErrorFileNotFound">"Die angeforderte Datei wurde nicht gefunden."</string>
     <string name="httpErrorTooManyRequests">"Es werden zurzeit zu viele Anfragen verarbeitet. Versuchen Sie es später erneut."</string>
+    <string name="certificateSaved">"Das Zertifikat wird im Schlüsselspeicher des Systems gespeichert."</string>
     <string name="contentServiceSync">"Synchronisieren"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchronisieren"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Zu viele <xliff:g id="CONTENT_TYPE">%s</xliff:g> gelöscht."</string>
@@ -108,9 +132,9 @@
     <string name="global_action_toggle_silent_mode">"Lautlos"</string>
     <string name="global_action_silent_mode_on_status">"Ton ist bereits AUS"</string>
     <string name="global_action_silent_mode_off_status">"Ton ist momentan AN"</string>
-    <string name="global_actions_toggle_airplane_mode">"Flugzeugmodus"</string>
-    <string name="global_actions_airplane_mode_on_status">"Flugzeugmodus ist AN"</string>
-    <string name="global_actions_airplane_mode_off_status">"Flugzeugmodus ist AUS"</string>
+    <string name="global_actions_toggle_airplane_mode">"Flugmodus"</string>
+    <string name="global_actions_airplane_mode_on_status">"Flugmodus ist AN"</string>
+    <string name="global_actions_airplane_mode_off_status">"Flugmodus ist AUS"</string>
     <string name="safeMode">"Abgesicherter Modus"</string>
     <string name="android_system_label">"Android System"</string>
     <string name="permgrouplab_costMoney">"Kostenpflichtige Dienste"</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Zugriff und Steuerung des Systems auf niedrigerer Ebene."</string>
     <string name="permgrouplab_developmentTools">"Entwickler-Tools"</string>
     <string name="permgroupdesc_developmentTools">"Funktionen nur für Anwendungsentwickler vorgesehen."</string>
+    <string name="permgrouplab_storage">"Speicher"</string>
+    <string name="permgroupdesc_storage">"Greift auf die SD-Karte zu."</string>
     <string name="permlab_statusBar">"Statusleiste deaktivieren oder ändern"</string>
     <string name="permdesc_statusBar">"Ermöglicht der Anwendung, die Statusanzeige zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen."</string>
     <string name="permlab_expandStatusBar">"Statusleiste ein-/ausblenden"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"Systeminternen Status abrufen"</string>
     <string name="permdesc_dump">"Ermöglicht einer Anwendung, den internen Status des Systems abzurufen. Schädliche Anwendungen rufen hierbei möglicherweise eine Vielzahl an privaten und geschützten Daten ab, die Sie in der Regel nicht benötigen würden."</string>
+    <string name="permlab_shutdown">"partielles Herunterfahren"</string>
+    <string name="permdesc_shutdown">"Versetzt den Aktivitätsmanager in einen heruntergefahrenen Zustand. Führt kein vollständiges Herunterfahren aus."</string>
+    <string name="permlab_stopAppSwitches">"Anwendungswechsel verhindern"</string>
+    <string name="permdesc_stopAppSwitches">"Hindert den Nutzer daran, zu einer anderen Anwendung zu wechseln"</string>
     <string name="permlab_runSetActivityWatcher">"Start von Anwendungen überwachen und steuern"</string>
     <string name="permdesc_runSetActivityWatcher">"Ermöglicht der Anwendung, den Start von Systemaktivitäten zu überwachen und zu steuern. Schädliche Anwendungen können so das gesamte System beeinträchtigen. Diese Berechtigung wird nur zu Entwicklungszwecken und nie für die normale Telefonnutzung benötigt."</string>
     <string name="permlab_broadcastPackageRemoved">"Broadcast ohne Paket senden"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Überlässt einer Anwendung die Entscheidung, ob Aktivitäten beendet werden, sobald Sie in den Hintergrund rücken. Wird nicht für normale Anwendungen benötigt."</string>
     <string name="permlab_batteryStats">"Akku-Daten ändern"</string>
     <string name="permdesc_batteryStats">"Ermöglicht die Änderung von gesammelten Akku-Daten. Nicht für normale Anwendungen vorgesehen."</string>
+    <string name="permlab_backup">"Systemsicherung und -wiederherstellung kontrollieren"</string>
+    <string name="permdesc_backup">"Ermöglicht der Anwendung, den Sicherungs- und Wiederherstellungsmechanismus des Systems zu kontrollieren. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_internalSystemWindow">"nicht autorisierte Fenster anzeigen"</string>
     <string name="permdesc_internalSystemWindow">"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">"Warnungen auf Systemebene anzeigen"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"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">"Auf zusätzliche Dienstanbieterbefehle für Standort zugreifen"</string>
     <string name="permdesc_accessLocationExtraCommands">"Zugriff auf zusätzliche Dienstanbieterbefehle für Standort. Schädliche Anwendungen könnten so die Funktionsweise von GPS oder anderen Standortquellen beeinträchtigen."</string>
+    <string name="permlab_installLocationProvider">"Berechtigung zur Installation eines Standortanbieters"</string>
+    <string name="permdesc_installLocationProvider">"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 oder Ihren Standort überwachen und an eine externe Quelle weitergeben."</string>
     <string name="permlab_accessFineLocation">"genauer (GPS-) Standort"</string>
     <string name="permdesc_accessFineLocation">"Zugriff auf genaue Standortquellen wie GPS auf dem Telefon (falls verfügbar). Schädliche Anwendungen können damit bestimmen, so Sie sich befinden und so Ihren Akku zusätzlich belasten."</string>
     <string name="permlab_accessCoarseLocation">"ungefährer (netzwerkbasierter) Standort"</string>
@@ -278,13 +312,13 @@
     <string name="permlab_callPrivileged">"Alle Telefonnummern direkt anrufen"</string>
     <string name="permdesc_callPrivileged">"Ermöglicht der Anwendung, ohne Ihr Eingreifen eine beliebige Telefonnummer zu wählen, einschließlich Notfallnummern. Schädliche Anwendungen können so unnötige und illegale Anrufe an Notdienste tätigen."</string>
     <string name="permlab_locationUpdates">"Benachrichtigungen für Standortaktualisierung steuern"</string>
-    <string name="permdesc_locationUpdates">"Ermöglicht die Aktivierung/Deaktivierung der Radio-Benachrichtigungen über Standort-Updates. Nicht für normale Anwendungen vorgesehen."</string>
+    <string name="permdesc_locationUpdates">"Ermöglicht die Aktivierung/Deaktivierung der Mobilfunkbenachrichtigungen über Standort-Updates. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_checkinProperties">"Auf Check-In-Eigenschaften zugreifen"</string>
     <string name="permdesc_checkinProperties">"Ermöglicht den Schreib-/Lesezugriff auf vom Check-In-Service hochgeladene Elemente. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_bindGadget">"Widgets auswählen"</string>
     <string name="permdesc_bindGadget">"Ermöglicht der Anwendung, dem System zu melden, welche Widgets von welcher Anwendung verwendet werden können. Mit dieser Berechtigung können Anwendungen anderen Anwendungen Zugriff auf persönliche Daten gewähren. Nicht für normale Anwendungen vorgesehen."</string>
     <string name="permlab_modifyPhoneState">"Telefonstatus ändern"</string>
-    <string name="permdesc_modifyPhoneState">"Ermöglicht einer Anwendung, die Telefonfunktionen des Gerätes zu steuern. Eine Anwendung mit dieser Berechtigung kann unter anderem das Netzwerk wechseln oder das Radio des Telefons ein- und ausschalten, ohne Sie darüber zu informieren."</string>
+    <string name="permdesc_modifyPhoneState">"Ermöglicht einer Anwendung, die Telefonfunktionen des Gerätes zu steuern. Eine Anwendung mit dieser Berechtigung kann unter anderem das Netzwerk wechseln oder die Mobilfunkverbindung des Telefons ein- und ausschalten, ohne Sie darüber zu informieren."</string>
     <string name="permlab_readPhoneState">"Telefonstatus lesen"</string>
     <string name="permdesc_readPhoneState">"Ermöglicht der Anwendung, auf die Telefonfunktionen des Gerätes zuzugreifen. Eine Anwendung mit dieser Berechtigung kann unter anderem bestimmen, welche Telefonnummer dieses Telefon verwendet, ob ein Anruf aktiv ist oder mit welcher Nummer der Anrufer verbunden ist."</string>
     <string name="permlab_wakeLock">"Standby-Modus deaktivieren"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Ermöglicht einer Anwendung, die Informationen zum WLAN-Status einzusehen."</string>
     <string name="permlab_changeWifiState">"WLAN-Status ändern"</string>
     <string name="permdesc_changeWifiState">"Ermöglicht einer Anwendung, eine Verbindung zu den WLAN-Zugangspunkten herzustellen und diese zu trennen oder Änderungen an den konfigurierten WLAN-Netzwerken vorzunehmen."</string>
+    <string name="permlab_changeWifiMulticastState">"WLAN-Multicast-Empfang zulassen"</string>
+    <string name="permdesc_changeWifiMulticastState">"Ermöglicht einer Anwendung, Datenpakete zu empfangen, die nicht direkt an Ihr Gerät gerichtet sind. Dies kann bei der Erkennung von in der Nähe angebotenen Diensten hilfreich sein. Diese Einstellung verbraucht mehr Energie als der Nicht-Multicast-Modus."</string>
     <string name="permlab_bluetoothAdmin">"Bluetooth-Verwaltung"</string>
     <string name="permdesc_bluetoothAdmin">"Ermöglicht einer Anwendung, das lokale Bluetooth-Telefon zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen."</string>
     <string name="permlab_bluetooth">"Bluetooth-Verbindungen herstellen"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Erlaubt einer Anwendung, alle privaten Wörter, Namen und Ausdrücke zu lesen, die ein Nutzer in seinem Wörterbuch gespeichert hat."</string>
     <string name="permlab_writeDictionary">"in nutzerdefiniertes Wörterbuch schreiben"</string>
     <string name="permdesc_writeDictionary">"Erlaubt einer Anwendung, neue Wörter in das Wörterbuch des Nutzers zu schreiben."</string>
+    <string name="permlab_sdcardWrite">"SD-Karten-Inhalt ändern/löschen"</string>
+    <string name="permdesc_sdcardWrite">"Ermöglicht einer Anwendung, auf die SD-Karte zu schreiben"</string>
   <string-array name="phoneTypes">
     <item>"Privat"</item>
     <item>"Mobil"</item>
@@ -353,6 +391,7 @@
     <item>"Andere"</item>
     <item>"Benutzerdefiniert"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Mobil"</string>
   <string-array name="postalAddressTypes">
     <item>"Privat"</item>
     <item>"Arbeit"</item>
@@ -382,17 +421,19 @@
   </string-array>
     <string name="keyguard_password_enter_pin_code">"PIN-Code eingeben"</string>
     <string name="keyguard_password_wrong_pin_code">"Falscher PIN-Code!"</string>
-    <string name="keyguard_label_text">"Drücken Sie zum Entsperren auf \"Menü\" und dann auf \"0\"."</string>
+    <string name="keyguard_label_text">"Drücken Sie zum Entsperren die Menütaste und dann auf \"0\"."</string>
     <string name="emergency_call_dialog_number_for_display">"Notrufnummer"</string>
     <string name="lockscreen_carrier_default">"(kein Dienst)"</string>
     <string name="lockscreen_screen_locked">"Display gesperrt."</string>
-    <string name="lockscreen_instructions_when_pattern_enabled">"Drücken Sie auf \"Menü\", um das Telefon zu entsperren oder einen Notruf zu tätigen."</string>
-    <string name="lockscreen_instructions_when_pattern_disabled">"Drücken Sie zum Entsperren auf \"Menü\"."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Drücken Sie die Menütaste, um das Telefon zu entsperren oder einen Notruf zu tätigen."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Zum Entsperren die Menütaste drücken"</string>
     <string name="lockscreen_pattern_instructions">"Schema für Entsperrung zeichnen"</string>
     <string name="lockscreen_emergency_call">"Notruf"</string>
     <string name="lockscreen_pattern_correct">"Korrekt!"</string>
     <string name="lockscreen_pattern_wrong">"Tut uns leid. Versuchen Sie es noch einmal."</string>
     <string name="lockscreen_plugged_in">"Wird geladen (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Bitte Ladegerät anschließen"</string>
     <string name="lockscreen_missing_sim_message_short">"Keine SIM-Karte."</string>
     <string name="lockscreen_missing_sim_message">"Keine SIM-Karte im Telefon."</string>
@@ -400,7 +441,7 @@
     <string name="lockscreen_network_locked_message">"Netzwerk gesperrt"</string>
     <string name="lockscreen_sim_puk_locked_message">"SIM-Karte ist gesperrt. PUK-Eingabe erforderlich."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"Weitere Informationen finden Sie in der Bedienungsanleitung oder wenden Sie sich an den Kundendienst."</string>
-    <string name="lockscreen_sim_locked_message">"SIM-Karte ist gesperrt."</string>
+    <string name="lockscreen_sim_locked_message">"Bitte PIN-Code eingeben"</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"SIM-Karte wird entsperrt..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
     <string name="lockscreen_failed_attempts_almost_glogin">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Telefon mithilfe Ihrer Google-Anmeldeinformationen zu entsperren. "\n\n"Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Ungültiger  Nutzername oder ungültiges Passwort."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Benachrichtigungen löschen"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Keine Benachrichtigungen"</string>
     <string name="status_bar_ongoing_events_title">"Aktuell"</string>
     <string name="status_bar_latest_events_title">"Benachrichtigungen"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Ladegerät anschließen"</string>
     <string name="battery_low_subtitle">"Akku ist fast leer."</string>
     <string name="battery_low_percent_format">"Nur noch weniger als <xliff:g id="NUMBER">%d%%</xliff:g> vorhanden."</string>
+    <string name="battery_low_why">"Warum?"</string>
     <string name="factorytest_failed">"Werkstest fehlgeschlagen"</string>
     <string name="factorytest_not_system">"Die Aktion FACTORY_TEST wird nur für unter \"/system/app\" gespeicherte Pakete unterstützt."</string>
     <string name="factorytest_no_action">"Es wurden kein Paket mit der Aktion FACTORY_TEST gefunden."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Von dieser Seite navigieren?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Wählen Sie \"OK\", um fortzufahren, oder wählen Sie \"Abbrechen\", um auf der aktuellen Seite zu bleiben."</string>
     <string name="save_password_label">"Bestätigen"</string>
+    <string name="permlab_readHistoryBookmarks">"Browserverlauf und Lesezeichen lesen"</string>
+    <string name="permdesc_readHistoryBookmarks">"Ermöglicht der Anwendung, alle URLs, die mit dem Browser besucht wurden, sowie alle Lesezeichen des Browsers zu lesen."</string>
+    <string name="permlab_writeHistoryBookmarks">"Browserverlauf und Lesezeichen schreiben"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Möchten Sie, dass der Browser dieses Passwort speichert?"</string>
     <string name="save_password_notnow">"Nicht jetzt"</string>
     <string name="save_password_remember">"Speichern"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Mittag"</string>
     <string name="midnight">"Mitternacht"</string>
     <string name="Midnight">"Mitternacht"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Alles auswählen"</string>
@@ -565,7 +608,7 @@
     <string name="dialog_alert_title">"Achtung"</string>
     <string name="capital_on">"EIN"</string>
     <string name="capital_off">"AUS"</string>
-    <string name="whichApplication">"Aktion beenden mit"</string>
+    <string name="whichApplication">"Aktion durchführen mit"</string>
     <string name="alwaysUse">"Standardmäßig für diese Aktion verwenden."</string>
     <string name="clearDefaultHintMsg">"Löschen Sie die Standardeinstellungen unter \"Starteinstellungen &gt; Anwendungen &gt; Anwendungen verwalten\"."</string>
     <string name="chooseActivity">"Aktion auswählen"</string>
@@ -579,6 +622,7 @@
     <string name="anr_application_process">"Anwendung <xliff:g id="APPLICATION">%1$s</xliff:g> (in Prozess <xliff:g id="PROCESS">%2$s</xliff:g>) reagiert nicht."</string>
     <string name="anr_process">"Prozess <xliff:g id="PROCESS">%1$s</xliff:g> reagiert nicht."</string>
     <string name="force_close">"Schließen erzwingen"</string>
+    <string name="report">"Bericht"</string>
     <string name="wait">"Warten"</string>
     <string name="debug">"Fehler suchen"</string>
     <string name="sendText">"Aktion für Text auswählen"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"SD-Karte formatieren"</string>
     <string name="extmedia_format_message">"Möchten Sie die SD-Karte wirklich formatieren? Alle Daten auf Ihrer Karte gehen dann verloren."</string>
     <string name="extmedia_format_button_format">"Format"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Eingabemethode auswählen"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"Kandidaten"</u></string>
     <string name="ext_media_checking_notification_title">"SD-Karte wird vorbereitet"</string>
-    <string name="ext_media_checking_notification_message">"Nach Fehlern wird gesucht"</string>
+    <string name="ext_media_checking_notification_message">"Nach Fehlern wird gesucht."</string>
     <string name="ext_media_nofs_notification_title">"SD-Karte leer"</string>
-    <string name="ext_media_nofs_notification_message">"Die SD-Karte ist leer oder verwendet ein Dateisystem, das nicht unterstützt wird."</string>
+    <string name="ext_media_nofs_notification_message">"SD-Karte ist leer oder verfügt über ein nicht unterstütztes Dateisystem."</string>
     <string name="ext_media_unmountable_notification_title">"Beschädigte SD-Karte"</string>
     <string name="ext_media_unmountable_notification_message">"Die SD-Karte ist beschädigt. Sie müssen Ihre Karte eventuell neu formatieren."</string>
     <string name="ext_media_badremoval_notification_title">"SD-Karte unerwartet entfernt"</string>
     <string name="ext_media_badremoval_notification_message">"SD-Karte vor dem Entnehmen trennen, um Datenverlust zu vermeiden."</string>
     <string name="ext_media_safe_unmount_notification_title">"SD-Karte\nkann entfernt werden."</string>
-    <string name="ext_media_safe_unmount_notification_message">"Die SD-Karte kann jetzt entfernt werden."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Die SD-Karte kann entfernt werden."</string>
     <string name="ext_media_nomedia_notification_title">"SD-Karte entfernt"</string>
-    <string name="ext_media_nomedia_notification_message">"Die SD-Karte wurde entfernt. Legen Sie eine neue SD-Karte ein, um den Speicherplatz Ihres Geräts zu erweitern."</string>
+    <string name="ext_media_nomedia_notification_message">"SD-Karte entfernt. Legen Sie eine neue ein."</string>
     <string name="activity_list_empty">"Keine passenden Aktivitäten gefunden"</string>
     <string name="permlab_pkgUsageStats">"Nutzungsstatistik der Komponente aktualisieren"</string>
     <string name="permdesc_pkgUsageStats">"Ermöglicht die Änderung von gesammelten Nutzungsstatistiken der Komponente. Nicht für normale Anwendungen vorgesehen."</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Ausführen"</string>
     <string name="dial_number_using">"Nummer"\n"mit <xliff:g id="NUMBER">%s</xliff:g> wählen"</string>
     <string name="create_contact_using">"Neuer Kontakt"\n"mit <xliff:g id="NUMBER">%s</xliff:g> erstellen"</string>
+    <string name="accessibility_compound_button_selected">"aktiviert"</string>
+    <string name="accessibility_compound_button_unselected">"nicht aktiviert"</string>
 </resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
new file mode 100644
index 0000000..5c6ba5a
--- /dev/null
+++ b/core/res/res/values-el/strings.xml
@@ -0,0 +1,765 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
+    <string name="untitled">"&lt;χωρίς τίτλο&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Δεν υπάρχει τηλεφωνικός αριθμός)"</string>
+    <string name="unknownName">"(Άγνωστο)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Αυτόματος τηλεφωνητής"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Πρόβλημα σύνδεσης ή μη έγκυρος κώδικας MMI."</string>
+    <string name="serviceEnabled">"Η υπηρεσία ενεργοποιήθηκε."</string>
+    <string name="serviceEnabledFor">"Η υπηρεσία ενεργοποιήθηκε για:"</string>
+    <string name="serviceDisabled">"Η υπηρεσία έχει απενεργοποιηθεί."</string>
+    <string name="serviceRegistered">"Η εγγραφή ήταν επιτυχής."</string>
+    <string name="serviceErased">"Η διαγραφή ήταν επιτυχής."</string>
+    <string name="passwordIncorrect">"Εσφαλμένος κωδικός πρόσβασης."</string>
+    <string name="mmiComplete">"Το MMI ολοκληρώθηκε."</string>
+    <string name="badPin">"Ο παλιός αριθμός PIN που πληκτρολογήσατε είναι εσφαλμένος."</string>
+    <string name="badPuk">"Ο κωδικός PUK που πληκτρολογήσατε είναι εσφαλμένος."</string>
+    <string name="mismatchPin">"Οι αριθμοί PIN που πληκτρολογήσατε δεν ταιριάζουν."</string>
+    <string name="invalidPin">"Πληκτρολογήστε έναν αριθμό PIN μεγέθους 4 έως 8 αριθμών."</string>
+    <string name="needPuk">"Η κάρτα SIM έχει κλειδωθεί με κωδικό PUK. Πληκτρολογήστε τον κωδικό PUK για να την ξεκλειδώσετε."</string>
+    <string name="needPuk2">"Πληκτρολογήστε τον κωδικό PUK2 για την κατάργηση αποκλεισμού της κάρτας SIM."</string>
+    <string name="ClipMmi">"Εισερχόμενη αναγνώριση κλήσης"</string>
+    <string name="ClirMmi">"Εξερχόμενη αναγνώριση κλήσης"</string>
+    <string name="CfMmi">"Προώθηση κλήσεων"</string>
+    <string name="CwMmi">"Αναμονή κλήσης"</string>
+    <string name="BaMmi">"Φραγή κλήσεων"</string>
+    <string name="PwdMmi">"Αλλαγή κωδικού πρόσβασης"</string>
+    <string name="PinMmi">"Αλλαγή αριθμού PIN"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"περιορισμένη\". Επόμενη κλήση: Περιορισμένη."</string>
+    <string name="CLIRDefaultOnNextCallOff">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"περιορισμένη\". Επόμενη κλήση: Μη περιορισμένη"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"μη περιορισμένη\". Επόμενη κλήση: Περιορισμένη."</string>
+    <string name="CLIRDefaultOffNextCallOff">"Η αναγνώριση κλήσης βρίσκεται από προεπιλογή στην \"μη περιορισμένη\". Επόμενη κλήση: Μη περιορισμένη"</string>
+    <string name="serviceNotProvisioned">"Η υπηρεσία δεν προβλέπεται."</string>
+    <string name="CLIRPermanent">"Δεν είναι δυνατή η αλλαγή της ρύθμισης αναγνώρισης κλήσης."</string>
+    <string name="RestrictedChangedTitle">"Η περιορισμένη πρόσβαση άλλαξε"</string>
+    <string name="RestrictedOnData">"Η υπηρεσία δεδομένων είναι αποκλεισμένη."</string>
+    <string name="RestrictedOnEmergency">"Η υπηρεσία έκτακτης ανάγκης είναι αποκλεισμένη."</string>
+    <string name="RestrictedOnNormal">"Η φωνητική υπηρεσία/υπηρεσία SMS είναι αποκλεισμένη."</string>
+    <string name="RestrictedOnAll">"Όλες οι φωνητικές υπηρεσίες/υπηρεσίες SMS έχουν αποκλειστεί."</string>
+    <string name="serviceClassVoice">"Φωνή"</string>
+    <string name="serviceClassData">"Δεδομένα"</string>
+    <string name="serviceClassFAX">"ΦΑΞ"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Μη συγχρονισμένα"</string>
+    <string name="serviceClassDataSync">"Συγχρονισμός"</string>
+    <string name="serviceClassPacket">"Πακέτο"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Δεν προωθήθηκε"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> μετά από <xliff:g id="TIME_DELAY">{2}</xliff:g> δευτερόλεπτα"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Δεν προωθήθηκε"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Δεν προωθήθηκε"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"Η ιστοσελίδα περιέχει ένα σφάλμα."</string>
+    <string name="httpErrorLookup">"Δεν ήταν δυνατή η εύρεση της διεύθυνσης URL."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Το πλάνο ελέγχου ταυτότητας ιστοτόπου δεν υποστηρίζεται."</string>
+    <string name="httpErrorAuth">"Ο έλεγχος ταυτότητας δεν ήταν επιτυχής."</string>
+    <string name="httpErrorProxyAuth">"Ο έλεγχος ταυτότητας μέσω του διακομιστή μεσολάβησης δεν ήταν επιτυχής."</string>
+    <string name="httpErrorConnect">"Η σύνδεση στον διακομιστή δεν ήταν επιτυχής."</string>
+    <string name="httpErrorIO">"Η επικοινωνία με τον διακομιστή απέτυχε. Προσπαθήστε ξανά αργότερα."</string>
+    <string name="httpErrorTimeout">"Το όριο χρόνου της σύνδεσης στον διακομιστή έληξε."</string>
+    <string name="httpErrorRedirectLoop">"Αυτή η σελίδα περιέχει πάρα πολλές ανακατευθύνσεις διακομιστή."</string>
+    <string name="httpErrorUnsupportedScheme">"Το πρωτόκολλο δεν υποστηρίζεται."</string>
+    <string name="httpErrorFailedSslHandshake">"Δεν ήταν δυνατή η επίτευξη ασφαλούς σύνδεσης."</string>
+    <string name="httpErrorBadUrl">"Δεν ήταν δυνατό το άνοιγμα της σελίδας επειδή η διεύθυνση URL δεν είναι έγκυρη."</string>
+    <string name="httpErrorFile">"Η πρόσβαση στο αρχείο δεν ήταν δυνατή."</string>
+    <string name="httpErrorFileNotFound">"Το αρχείο που ζητήθηκε δεν βρέθηκε."</string>
+    <string name="httpErrorTooManyRequests">"Πραγματοποιείται επεξεργασία πάρα πολλών αιτημάτων. Προσπαθήστε ξανά αργότερα."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Συγχρονισμός"</string>
+    <string name="contentServiceSyncNotificationTitle">"Συγχρονισμός"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Πάρα πολλές <xliff:g id="CONTENT_TYPE">%s</xliff:g> διαγραφές."</string>
+    <string name="low_memory">"Ο αποθηκευτικός χώρος του τηλεφώνου είναι πλήρης! Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string>
+    <string name="me">"Για εμένα"</string>
+    <string name="power_dialog">"Επιλογές τηλεφώνου"</string>
+    <string name="silent_mode">"Λειτουργία σίγασης"</string>
+    <string name="turn_on_radio">"Ενεργοποίηση ασύρματου"</string>
+    <string name="turn_off_radio">"Απενεργοποίηση ασύρματου"</string>
+    <string name="screen_lock">"Κλείδωμα οθόνης"</string>
+    <string name="power_off">"Απενεργοποίηση"</string>
+    <string name="shutdown_progress">"Απενεργοποίηση..."</string>
+    <string name="shutdown_confirm">"Το τηλέφωνό σας θα απενεργοποιηθεί."</string>
+    <string name="no_recent_tasks">"Δεν υπάρχουν πρόσφατες εφαρμογές."</string>
+    <string name="global_actions">"Επιλογές τηλεφώνου"</string>
+    <string name="global_action_lock">"Κλείδωμα οθόνης"</string>
+    <string name="global_action_power_off">"Απενεργοποίηση"</string>
+    <string name="global_action_toggle_silent_mode">"Λειτουργία σίγασης"</string>
+    <string name="global_action_silent_mode_on_status">"Ο ήχος είναι απενεργοποιημένος"</string>
+    <string name="global_action_silent_mode_off_status">"Ο ήχος είναι ενεργοποιημένος"</string>
+    <string name="global_actions_toggle_airplane_mode">"Λειτουργία πτήσης"</string>
+    <string name="global_actions_airplane_mode_on_status">"Η λειτουργία πτήσης είναι ενεργοποιημένη."</string>
+    <string name="global_actions_airplane_mode_off_status">"Η λειτουργία πτήσης είναι απενεργοποιημένη"</string>
+    <string name="safeMode">"Ασφαλής λειτουργία"</string>
+    <string name="android_system_label">"Σύστημα Android"</string>
+    <string name="permgrouplab_costMoney">"Υπηρεσίες επί πληρωμή."</string>
+    <string name="permgroupdesc_costMoney">"Επιτρέπει σε εφαρμογές να πραγματοποιήσουν ενέργειες για τις οποίες ενδέχεται να χρεωθείτε."</string>
+    <string name="permgrouplab_messages">"Τα μηνύματά σας"</string>
+    <string name="permgroupdesc_messages">"Ανάγνωση και εγγραφή των μηνυμάτων SMS, των μηνυμάτων ηλεκτρονικού ταχυδρομείου και άλλων μηνυμάτων."</string>
+    <string name="permgrouplab_personalInfo">"Οι προσωπικές σας πληροφορίες"</string>
+    <string name="permgroupdesc_personalInfo">"Άμεση πρόσβαση στις επαφές και στο ημερολόγιό σας που είναι αποθηκευμένα στο τηλέφωνο."</string>
+    <string name="permgrouplab_location">"Η τοποθεσία σας"</string>
+    <string name="permgroupdesc_location">"Παρακολούθηση της φυσικής τοποθεσίας σας"</string>
+    <string name="permgrouplab_network">"Επικοινωνία δικτύου"</string>
+    <string name="permgroupdesc_network">"Επιτρέπει σε εφαρμογές να αποκτήσουν πρόσβαση σε διάφορες λειτουργίες δικτύου."</string>
+    <string name="permgrouplab_accounts">"Οι λογαριασμοί σας Google"</string>
+    <string name="permgroupdesc_accounts">"Πρόσβαση στους διαθέσιμους λογαριασμούς Google."</string>
+    <string name="permgrouplab_hardwareControls">"Στοιχεία ελέγχου υλικού"</string>
+    <string name="permgroupdesc_hardwareControls">"Άμεση πρόσβαση στο υλικό της συσκευής τηλεφώνου."</string>
+    <string name="permgrouplab_phoneCalls">"Τηλεφωνικές κλήσεις"</string>
+    <string name="permgroupdesc_phoneCalls">"Παρακολούθηση, καταγραφή και επεξεργασία τηλεφωνικών κλήσεων."</string>
+    <string name="permgrouplab_systemTools">"Εργαλεία συστήματος"</string>
+    <string name="permgroupdesc_systemTools">"Χαμηλού επιπέδου πρόσβαση και έλεγχος του συστήματος."</string>
+    <string name="permgrouplab_developmentTools">"Εργαλεία ανάπτυξης"</string>
+    <string name="permgroupdesc_developmentTools">"Δυνατότητες που είναι απαραίτητες μόνο σε προγραμματιστές εφαρμογών."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"απενεργοποίηση ή τροποποίηση γραμμής κατάστασης"</string>
+    <string name="permdesc_statusBar">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string>
+    <string name="permlab_expandStatusBar">"ανάπτυξη/σύμπτυξη γραμμής κατάστασης"</string>
+    <string name="permdesc_expandStatusBar">"Επιτρέπει σε μια εφαρμογή να αναπτύξει ή να συμπτύξει την γραμμή κατάστασης."</string>
+    <string name="permlab_processOutgoingCalls">"φραγή εξερχόμενων κλήσεων"</string>
+    <string name="permdesc_processOutgoingCalls">"Επιτρέπει σε μια εφαρμογή την επεξεργασία εξερχόμενων κλήσεων και την αλλαγή του αριθμού που πρόκειται να κληθεί. Κακόβουλες εφαρμογές ενδέχεται να παρακολουθούν, να ανακατευθύνουν ή να παρεμποδίζουν εξερχόμενες κλήσεις."</string>
+    <string name="permlab_receiveSms">"λήψη SMS"</string>
+    <string name="permdesc_receiveSms">"Επιτρέπει σε μια εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων SMS. Κακόβουλες εφαρμογές ενδέχεται να παρακολουθούν τα μηνύματά σας ή να τα διαγράφουν χωρίς να σας ειδοποιούν."</string>
+    <string name="permlab_receiveMms">"λήψη MMS"</string>
+    <string name="permdesc_receiveMms">"Επιτρέπει σε μια εφαρμογή την λήψη και την επεξεργασία μηνυμάτων MMS. Κακόβουλες εφαρμογές ενδέχεται να παρακολουθούν τα μηνύματά σας ή να τα διαγράφουν χωρίς να σας ειδοποιούν."</string>
+    <string name="permlab_sendSms">"αποστολή μηνυμάτων SMS"</string>
+    <string name="permdesc_sendSms">"Επιτρέπει σε μια εφαρμογή την αποστολή μηνυμάτων SMS. Κακόβουλες εφαρμογές ενδέχεται να σας χρεώσουν αποστέλλοντας μηνύματα χωρίς την έγκρισή σας."</string>
+    <string name="permlab_readSms">"ανάγνωση μηνυμάτων SMS ή MMS"</string>
+    <string name="permdesc_readSms">"Επιτρέπει σε μια εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα SIM. Κακόβουλες εφαρμογές ενδέχεται να αναγνώσουν τα εμπιστευτικά σας μηνύματα."</string>
+    <string name="permlab_writeSms">"επεξεργασία SMS ή MMS"</string>
+    <string name="permdesc_writeSms">"Επιτρέπει σε μια εφαρμογή την εγγραφή σε μηνύματα SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα SIM. Κακόβουλες εφαρμογές ενδέχεται να διαγράψουν τα μηνύματά σας."</string>
+    <string name="permlab_receiveWapPush">"λήψη WAP"</string>
+    <string name="permdesc_receiveWapPush">"Επιτρέπει σε μια εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων WAP. Κακόβουλες εφαρμογές ενδέχεται να παρακολουθούν τα μηνύματά σας ή να τα διαγράφουν χωρίς να σας ειδοποιούν."</string>
+    <string name="permlab_getTasks">"ανάκτηση εκτελούμενων εφαρμογών"</string>
+    <string name="permdesc_getTasks">"Επιτρέπει σε μια εφαρμογή να ανακτήσει πληροφορίες σχετικά με τις τρέχουσες εκτελούμενες εργασίες και στις εργασίες που έχουν πρόσφατα εκτελεστεί. Ενδέχεται να δώσει τη δυνατότητα σε κακόβουλες εφαρμογές να ανακαλύψουν ιδιωτικές πληροφορίες σχετικά με άλλες εφαρμογές."</string>
+    <string name="permlab_reorderTasks">"αναδιάταξη εκτελούμενων εφαρμογών"</string>
+    <string name="permdesc_reorderTasks">"Επιτρέπει σε μια εφαρμογή τη μετακίνηση εργασιών στο προσκήνιο και στο φόντο. Κακόβουλες εφαρμογές μπορούν να προωθηθούν στο προσκήνιο χωρίς να μπορείτε να τις ελέγξετε."</string>
+    <string name="permlab_setDebugApp">"ενεργοποίηση εντοπισμού σφαλμάτων εφαρμογής"</string>
+    <string name="permdesc_setDebugApp">"Επιτρέπει σε μια εφαρμογή να ενεργοποιήσει τον εντοπισμό σφαλμάτων για μια άλλη εφαρμογή. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να τερματίσουν άλλες εφαρμογές."</string>
+    <string name="permlab_changeConfiguration">"αλλαγή των ρυθμίσεων του UI"</string>
+    <string name="permdesc_changeConfiguration">"Επιτρέπει σε μια εφαρμογή την αλλαγή της τρέχουσας διαμόρφωσης, όπως οι τοπικές ρυθμίσεις ή το μέγεθος γραμματοσειράς γενικά."</string>
+    <string name="permlab_restartPackages">"επανεκκίνηση άλλων εφαρμογών"</string>
+    <string name="permdesc_restartPackages">"Επιτρέπει σε μια εφαρμογή να πραγματοποιήσει αναγκαστική επανεκκίνηση άλλων εφαρμογών."</string>
+    <string name="permlab_forceBack">"αναγκαστικός τερματισμός εφαρμογής"</string>
+    <string name="permdesc_forceBack">"Επιτρέπει σε μια εφαρμογή να εξαναγκάσει οποιαδήποτε δραστηριότητα που βρίσκεται στο προσκήνιο να κλείσει και να μεταβεί στο φόντο. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
+    <string name="permlab_dump">"ανάκτηση εσωτερικής κατάστασης συστήματος"</string>
+    <string name="permdesc_dump">"Επιτρέπει σε μια εφαρμογή να ανακτήσει την εσωτερική κατάσταση του συστήματος. Κακόβουλες εφαρμογές ενδέχεται να ανακτήσουν μεγάλο εύρος ιδιωτικών και ασφαλών πληροφοριών, τις οποίες δεν χρειάζονται."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"παρακολούθηση και έλεγχος όλων των εκκινήσεων εφαρμογών"</string>
+    <string name="permdesc_runSetActivityWatcher">"Επιτρέπει σε μια εφαρμογή να παρακολουθεί και να ελέγχει τον τρόπο με τον οποίο το σύστημα εκκινεί δραστηριότητες. Κακόβουλες εφαρμογές ενδέχεται να θέσουν σε κίνδυνο το σύστημα. Αυτή η άδεια είναι απαραίτητη μόνο για ανάπτυξη και ποτέ για κανονική χρήση τηλεφώνου."</string>
+    <string name="permlab_broadcastPackageRemoved">"αποστολή εκπομπής χωρίς πακέτο"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Επιτρέπει σε μια εφαρμογή την εκπομπή μια ειδοποίησης σχετικά με την κατάργηση ενός πακέτου εφαρμογών. Κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν για να τερματίσουν άλλες εκτελούμενες εφαρμογές."</string>
+    <string name="permlab_broadcastSmsReceived">"αποστολή εκπομπής που έχει ληφθεί με μήνυμα SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Επιτρέπει σε μια εφαρμογή την εκπομπή ειδοποίησης σχετικά με τη λήψη μηνύματος SMS. Κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν για την δημιουργία πλαστών εισερχόμενων μηνυμάτων SMS."</string>
+    <string name="permlab_broadcastWapPush">"αποστολή εκπομπής που έχει ληφθεί με WAP-PUSH"</string>
+    <string name="permdesc_broadcastWapPush">"Επιτρέπει σε μια εφαρμογή να εκπέμψει μια ειδοποίηση σχετικά με τη λήψη μηνύματος WAP PUSH. Κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν για να δημιουργήσουν ψευδείς λήψεις μηνυμάτων MMS ή για να αντικαταστήσουν χωρίς ειδοποίηση το περιεχόμενο μιας ιστοσελίδας με κακόβουλες παραλλαγές."</string>
+    <string name="permlab_setProcessLimit">"περιορισμός αριθμού εκτελούμενων διαδικασιών"</string>
+    <string name="permdesc_setProcessLimit">"Επιτρέπει σε μια εφαρμογή τον έλεγχο του μέγιστου αριθμού διαδικασιών που θα εκτελούνται. Δεν είναι ποτέ απαραίτητο για κανονικές εφαρμογές."</string>
+    <string name="permlab_setAlwaysFinish">"κλείσιμο όλων των εφαρμογών στο φόντο"</string>
+    <string name="permdesc_setAlwaysFinish">"Επιτρέπει σε μια εφαρμογή να ελέγχει εάν οι δραστηριότητες ολοκληρώνονται πάντοτε μόλις μεταβούν στο φόντο. Δεν είναι ποτέ απαραίτητο για κανονικές εφαρμογές."</string>
+    <string name="permlab_batteryStats">"τροποποίηση στατιστικών μπαταρίας"</string>
+    <string name="permdesc_batteryStats">"Επιτρέπει την τροποποίηση στατιστικών μπαταρίας που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"προβολή μη εξουσιοδοτημένων παραθύρων"</string>
+    <string name="permdesc_internalSystemWindow">"Επιτρέπει τη δημιουργία παραθύρων που πρόκειται να χρησιμοποιηθούν από την εσωτερική διεπαφή χρήστη του συστήματος. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permlab_systemAlertWindow">"εμφάνιση ειδοποιήσεων επιπέδου συστήματος"</string>
+    <string name="permdesc_systemAlertWindow">"Επιτρέπει σε μια εφαρμογή την προβολή παραθύρων ειδοποίησης συστήματος. Κακόβουλες εφαρμογές μπορούν να εμφανιστούν σε ολόκληρη την οθόνη του τηλεφώνου."</string>
+    <string name="permlab_setAnimationScale">"τροποποίηση καθολικής ταχύτητας κίνησης εικόνας"</string>
+    <string name="permdesc_setAnimationScale">"Επιτρέπει σε μια εφαρμογή την αλλαγή της καθολικής ταχύτητας κίνησης εικόνας (ταχύτερη ή βραδύτερη κίνηση) οποιαδήποτε στιγμή."</string>
+    <string name="permlab_manageAppTokens">"διαχείριση αναγνωριστικών εφαρμογής"</string>
+    <string name="permdesc_manageAppTokens">"Επιτρέπει σε εφαρμογές τη δημιουργία και τη διαχείριση των δικών τους αναγνωριστικών, παρακάμπτοντας την κανονική διάταξη Z. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
+    <string name="permlab_injectEvents">"πάτημα πλήκτρων και κουμπιών ελέγχου"</string>
+    <string name="permdesc_injectEvents">"Επιτρέπει σε μια εφαρμογή την απόδοση των γεγονότων εισόδου της (πατήματα πλήκτρων κ.λπ.) σε άλλες εφαρμογές. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να αναλάβουν τον έλεγχο του τηλεφώνου."</string>
+    <string name="permlab_readInputState">"καταγραφή των ενεργειών σας και των στοιχείων που πληκτρολογείτε"</string>
+    <string name="permdesc_readInputState">"Επιτρέπει σε εφαρμογές να παρακολουθούν τα πλήκτρα που πατάτε, ακόμη και σε μια άλλη εφαρμογή (όπως π.χ. η καταχώρηση ενός κωδικού πρόσβασης). Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string>
+    <string name="permlab_bindInputMethod">"δέσμευση σε μέθοδο εισόδου"</string>
+    <string name="permdesc_bindInputMethod">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας μεθόδου εισόδου. Δεν είναι απαραίτητο για συνήθεις εφαρμογές."</string>
+    <string name="permlab_setOrientation">"αλλαγή προσανατολισμού οθόνης"</string>
+    <string name="permdesc_setOrientation">"Επιτρέπει σε μια εφαρμογή την αλλαγή της περιστροφής της οθόνης οποιαδήποτε στιγμή. Δεν είναι απαραίτητο για κανονικές εφαρμογές."</string>
+    <string name="permlab_signalPersistentProcesses">"αποστολή σημάτων Linux σε εφαρμογές"</string>
+    <string name="permdesc_signalPersistentProcesses">"Επιτρέπει σε μια εφαρμογή την αποστολή αιτήματος για την αποστολή του παρεχόμενου σήματος σε όλες τις υπάρχουσες διαδικασίες."</string>
+    <string name="permlab_persistentActivity">"η εφαρμογή να εκτελείται συνεχώς"</string>
+    <string name="permdesc_persistentActivity">"Επιτρέπει σε μια εφαρμογή την μετατροπή τμημάτων της σε συνεχή, ώστε το σύστημα να μην μπορεί να τη χρησιμοποιήσει για άλλες εφαρμογές."</string>
+    <string name="permlab_deletePackages">"διαγραφή εφαρμογών"</string>
+    <string name="permdesc_deletePackages">"Επιτρέπει σε μια εφαρμογή τη διαγραφή πακέτων Android. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διαγράψουν σημαντικές εφαρμογές."</string>
+    <string name="permlab_clearAppUserData">"διαγραφή δεδομένων άλλων εφαρμογών"</string>
+    <string name="permdesc_clearAppUserData">"Επιτρέπει σε μια εφαρμογή να εκκαθαρίζει τα δεδομένα χρήστη."</string>
+    <string name="permlab_deleteCacheFiles">"διαγραφή προσωρινών μνημών άλλων εφαρμογών"</string>
+    <string name="permdesc_deleteCacheFiles">"Επιτρέπει σε μια εφαρμογή τη διαγραφή αρχείων προσωρινής μνήμης."</string>
+    <string name="permlab_getPackageSize">"μέτρηση αποθηκευτικού χώρου εφαρμογής"</string>
+    <string name="permdesc_getPackageSize">"Επιτρέπει σε μια εφαρμογή να ανακτήσει τα μεγέθη κώδικα, δεδομένων και προσωρινής μνήμης"</string>
+    <string name="permlab_installPackages">"απευθείας εγκατάσταση εφαρμογών"</string>
+    <string name="permdesc_installPackages">"Επιτρέπει σε μια εφαρμογή την εγκατάσταση νέων ή ενημερωμένων πακέτων Android. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να προσθέσουν νέες εφαρμογές με πολλές αυθαίρετες άδειες."</string>
+    <string name="permlab_clearAppCache">"διαγραφή όλων των δεδομένων προσωρινής μνήμης εφαρμογής"</string>
+    <string name="permdesc_clearAppCache">"Επιτρέπει σε μια εφαρμογή να αυξήσει τον ελεύθερο χώρο αποθήκευσης του τηλεφώνου διαγράφοντας αρχεία από τον κατάλογο προσωρινής μνήμης της εφαρμογής. Η πρόσβαση είναι συνήθως πολύ περιορισμένη στη διαδικασία συστήματος."</string>
+    <string name="permlab_readLogs">"ανάγνωση αρχείων καταγραφής συστήματος"</string>
+    <string name="permdesc_readLogs">"Επιτρέπει σε μια εφαρμογή να αναγνώσει τα αρχεία καταγραφής του συστήματος. Έτσι μπορεί να ανακαλύψει γενικές πληροφορίες σχετικά με τις δραστηριότητές σας στο τηλέφωνο, όμως δεν θα πρέπει να περιέχουν προσωπικές ή ιδιωτικές πληροφορίες."</string>
+    <string name="permlab_diagnostic">"ανάγνωση/εγγραφή σε πόρους που ανήκουν στο διαγνωστικό"</string>
+    <string name="permdesc_diagnostic">"Επιτρέπει σε μια εφαρμογή την ανάγνωση και την εγγραφή σε πόρο που ανήκει στην ομάδα διαγνωστικού (π.χ. αρχεία στον κατάλογο /dev). Αυτό ενδέχεται να επηρεάσει την σταθερότητα και την ασφάλεια του συστήματος. Θα πρέπει να χρησιμοποιείται ΜΟΝΟ για διαγνωστικά υλικού του κατασκευαστή ή του χειριστή."</string>
+    <string name="permlab_changeComponentState">"ενεργοποίηση ή απενεργοποίηση στοιχείων εφαρμογής"</string>
+    <string name="permdesc_changeComponentState">"Επιτρέπει σε μια εφαρμογή την επιλογή ενεργοποίησης ή μη ενός στοιχείου μιας άλλης εφαρμογής. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να απενεργοποιήσουν σημαντικές δυνατότητες του τηλεφώνου. Η χορήγηση άδειας πρέπει να γίνεται με προσοχή, καθώς είναι πιθανό τα στοιχεία μιας εφαρμογής να καταστούν ασυνεχή, ασταθή ή να είναι αδύνατον να χρησιμοποιηθούν."</string>
+    <string name="permlab_setPreferredApplications">"ορισμός προτιμώμενων εφαρμογών"</string>
+    <string name="permdesc_setPreferredApplications">"Επιτρέπει σε μια εφαρμογή να τροποποιεί τις εφαρμογές που προτιμάτε. Αυτό ενδέχεται να δώσει τη δυνατότητα σε κακόβουλες εφαρμογές να αλλάξουν χωρίς ειδοποίηση τις εφαρμογές που εκτελούνται, \"ξεγελώντας\" τις υπάρχουσες εφαρμογές ώστε να συλλέξουν ιδιωτικά δεδομένα."</string>
+    <string name="permlab_writeSettings">"τροποποίηση καθολικών ρυθμίσεων συστήματος"</string>
+    <string name="permdesc_writeSettings">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των δεδομένων των ρυθμίσεων του συστήματος. Κακόβουλες εφαρμογές μπορούν να καταστρέψουν τη διαμόρφωση του συστήματός σας."</string>
+    <string name="permlab_writeSecureSettings">"τροποποίηση ασφαλών ρυθμίσεων συστήματος"</string>
+    <string name="permdesc_writeSecureSettings">"Επιτρέπει σε μια εφαρμογή να τροποποιεί τα δεδομένα ασφαλών ρυθμίσεων συστήματος. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permlab_writeGservices">"μετατροπή του χάρτη υπηρεσιών Google"</string>
+    <string name="permdesc_writeGservices">"Επιτρέπει σε μια εφαρμογή την τροποποίηση του χάρτη υπηρεσιών Google. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permlab_receiveBootCompleted">"αυτόματη εκκίνηση κατά την εκκίνηση του υπολογιστή"</string>
+    <string name="permdesc_receiveBootCompleted">"Επιτρέπει σε μια εφαρμογή να ξεκινήσει αυτόματα μόλις ολοκληρωθεί η εκκίνηση του συστήματος. Αυτό ενδέχεται να καθυστερήσει την εκκίνηση του τηλεφώνου και να προκαλέσει γενική μείωση της ταχύτητας λειτουργίας του τηλεφώνου, καθώς η εφαρμογή θα εκτελείται συνεχώς."</string>
+    <string name="permlab_broadcastSticky">"αποστολή εκπομπής sticky"</string>
+    <string name="permdesc_broadcastSticky">"Επιτρέπει σε μια εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Κακόβουλες εφαρμογές μπορούν να μειώσουν την ταχύτητα λειτουργίας του τηλεφώνου ή να την καταστήσουν ασταθή χρησιμοποιώντας πολύ μεγάλο ποσό μνήμης."</string>
+    <string name="permlab_readContacts">"ανάγνωση δεδομένων επαφής"</string>
+    <string name="permdesc_readContacts">"Επιτρέπει σε μια εφαρμογή την ανάγνωση όλων των δεδομένων επαφής (διεύθυνσης) που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να αποστείλουν τα δεδομένα σας σε τρίτους."</string>
+    <string name="permlab_writeContacts">"εγγραφή δεδομένων επαφής"</string>
+    <string name="permdesc_writeContacts">"Επιτρέπει σε μια εφαρμογή να τροποποιεί τα δεδομένα επαφής (διεύθυνσης) που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν τα δεδομένα επαφών σας."</string>
+    <string name="permlab_writeOwnerData">"εγγραφή δεδομένων κατόχου"</string>
+    <string name="permdesc_writeOwnerData">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει τα δεδομένα κατόχου τηλεφώνου στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να τροποποιήσουν τα δεδομένα κατόχου."</string>
+    <string name="permlab_readOwnerData">"ανάγνωση δεδομένων κατόχου"</string>
+    <string name="permdesc_readOwnerData">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των δεδομένων κατόχου τηλεφώνου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για την ανάγνωση δεδομένων κατόχου τηλεφώνου."</string>
+    <string name="permlab_readCalendar">"ανάγνωση δεδομένων ημερολογίου"</string>
+    <string name="permdesc_readCalendar">"Επιτρέπει σε μια εφαρμογή να αναγνώσει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να αποστείλουν συμβάντα ημερολογίου σε άλλους χρήστες."</string>
+    <string name="permlab_writeCalendar">"εγγραφή δεδομένων ημερολογίου"</string>
+    <string name="permdesc_writeCalendar">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των συμβάντων ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να διαγράψουν ή για να τροποποιήσουν τα δεδομένα ημερολογίου σας."</string>
+    <string name="permlab_accessMockLocation">"δημιουργία ψευδών πηγών τοποθεσίας για δοκιμή"</string>
+    <string name="permdesc_accessMockLocation">"Δημιουργία εικονικών πηγών τοποθεσίας για δοκιμή. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να παρακάμψουν την τοποθεσία και/ή την κατάσταση που βρίσκουν πραγματικές πηγές τοποθεσίας, όπως πάροχοι GPS ή πάροχοι δικτύου."</string>
+    <string name="permlab_accessLocationExtraCommands">"πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας. Κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν ώστε να παρέμβουν στη λειτουργία του GPS ή άλλων πηγών τοποθεσίας."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"ακριβής τοποθεσία (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Πρόσβαση σε πηγές ακριβούς τοποθεσίας, όπως το Παγκόσμιο Σύστημα Εντοπισμού (GPS) στο τηλέφωνο, όπου αυτό είναι διαθέσιμο. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να προσδιορίσουν τη θέση που βρίσκεστε και ενδέχεται να καταναλώσουν επιπλέον ισχύ μπαταρίας."</string>
+    <string name="permlab_accessCoarseLocation">"κατά προσέγγιση (βασισμένη στο δίκτυο) τοποθεσία"</string>
+    <string name="permdesc_accessCoarseLocation">"Πρόσβαση σε πηγές κατά προσέγγιση τοποθεσίας, όπως η βάση δεδομένων δικτύου κινητής τηλεφωνίας για τον κατά προσέγγιση προσδιορισμό της τοποθεσίας του τηλεφώνου, όπου αυτό είναι διαθέσιμο. Κακόβουλες εφαρμογές μπορούν να το χρησιμοποιήσουν για να προσδιορίσουν κατά προσέγγιση τη θέση σας."</string>
+    <string name="permlab_accessSurfaceFlinger">"πρόσβαση στο SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Επιτρέπει σε μια εφαρμογή να χρησιμοποιεί λειτουργίες SurfaceFlinger χαμηλού επιπέδου."</string>
+    <string name="permlab_readFrameBuffer">"ανάγνωση προσωρινής μνήμης πλαισίου"</string>
+    <string name="permdesc_readFrameBuffer">"Επιτρέπει στην εφαρμογή να χρησιμοποιήσει και να αναγνώσει το περιεχόμενο της προσωρινής μνήμης πλαισίου."</string>
+    <string name="permlab_modifyAudioSettings">"αλλαγή των ρυθμίσεων ήχου"</string>
+    <string name="permdesc_modifyAudioSettings">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει καθολικές ρυθμίσεις ήχου όπως ένταση ήχου και δρομολόγηση ήχου."</string>
+    <string name="permlab_recordAudio">"εγγραφή ήχου"</string>
+    <string name="permdesc_recordAudio">"Επιτρέπει σε μια εφαρμογή την πρόσβαση στη διαδρομή εγγραφής ήχου."</string>
+    <string name="permlab_camera">"λήψη φωτογραφιών"</string>
+    <string name="permdesc_camera">"Επιτρέπει σε μια εφαρμογή τη λήψη φωτογραφιών με την κάμερα. Αυτό επιτρέπει στην εφαρμογή να συλλέξει εικόνες, στις οποίες εστιάζει η κάμερα οποιαδήποτε στιγμή."</string>
+    <string name="permlab_brick">"μόνιμη απενεργοποίηση τηλεφώνου"</string>
+    <string name="permdesc_brick">"Επιτρέπει στην εφαρμογή τη μόνιμη απενεργοποίηση όλων των λειτουργιών του τηλεφώνου, το οποίο είναι εξαιρετικά επικίνδυνο."</string>
+    <string name="permlab_reboot">"αναγκαστική επανεκκίνηση τηλεφώνου"</string>
+    <string name="permdesc_reboot">"Επιτρέπει στην εφαρμογή να προκαλέσει αναγκαστική επανεκκίνηση του τηλεφώνου."</string>
+    <string name="permlab_mount_unmount_filesystems">"Προσάρτηση και αποπροσάρτηση συστημάτων αρχείων"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Επιτρέπει στην εφαρμογή την προσάρτηση και αποπροσάρτηση συστημάτων αρχείων για αφαιρούμενο αποθηκευτικό χώρο."</string>
+    <string name="permlab_mount_format_filesystems">"διαμόρφωση εξωτερικού αποθηκευτικού χώρου"</string>
+    <string name="permdesc_mount_format_filesystems">"Επιτρέπει στην εφαρμογή τη διαμόρφωση αφαιρούμενου αποθηκευτικού χώρου."</string>
+    <string name="permlab_vibrate">"έλεγχος δόνησης"</string>
+    <string name="permdesc_vibrate">"Επιτρέπει στην εφαρμογή τον έλεγχο του δονητή."</string>
+    <string name="permlab_flashlight">"έλεγχος φακού"</string>
+    <string name="permdesc_flashlight">"Επιτρέπει στην εφαρμογή τον έλεγχο του φακού."</string>
+    <string name="permlab_hardware_test">"δοκιμή υλικού"</string>
+    <string name="permdesc_hardware_test">"Επιτρέπει σε μια εφαρμογή τον έλεγχο διαφόρων περιφερειακών για την εκτέλεση δοκιμών υλικού."</string>
+    <string name="permlab_callPhone">"απευθείας κλήση τηλεφωνικών αριθμών"</string>
+    <string name="permdesc_callPhone">"Επιτρέπει σε μια εφαρμογή την κλήση τηλεφωνικών αριθμών χωρίς την παρέμβασή σας. Κακόβουλες εφαρμογές ενδέχεται να ευθύνονται για μη αναμενόμενες κλήσεις στον λογαριασμό τηλεφώνου σας. Λάβετε υπόψη ότι αυτό δεν επιτρέπει την κλήση αριθμών έκτακτης ανάγκης."</string>
+    <string name="permlab_callPrivileged">"απευθείας κλήση τηλεφωνικών αριθμών"</string>
+    <string name="permdesc_callPrivileged">"Επιτρέπει στην εφαρμογή την κλήση τηλεφωνικού αριθμού, συμπεριλαμβανομένων και αριθμών έκτακτης ανάγκης, χωρίς την παρέμβασή σας. Κακόβουλες εφαρμογές ενδέχεται να πραγματοποιήσουν μη αναγκαίες και παράνομες κλήσεις σε υπηρεσίες έκτακτης ανάγκης."</string>
+    <string name="permlab_locationUpdates">"έλεγχος ειδοποιήσεων ενημέρωσης τοποθεσίας"</string>
+    <string name="permdesc_locationUpdates">"Επιτρέπει την ενεργοποίηση/απενεργοποίηση ειδοποιήσεων ενημέρωσης τοποθεσίας από τον πομπό. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="permlab_checkinProperties">"πρόσβαση σε ιδιότητες ελέγχου εισόδου"</string>
+    <string name="permdesc_checkinProperties">"Επιτρέπει την πρόσβαση για ανάγνωση/εγγραφή σε ιδιότητες που έχουν μεταφορτωθεί από την υπηρεσία ελέγχου εισόδου. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
+    <string name="permlab_bindGadget">"επιλογή γραφικών στοιχείων"</string>
+    <string name="permdesc_bindGadget">"Επιτρέπει στην εφαρμογή να ορίσει στο σύστημα ποια γραφικά στοιχεία μπορεί να χρησιμοποιήσει κάθε εφαρμογή. Με αυτή την άδεια, οι εφαρμογές μπορούν να παρέχουν πρόσβαση σε προσωπικά δεδομένα σε άλλες εφαρμογές. Δεν πρέπει να χρησιμοποιείται από συνήθεις εφαρμογές."</string>
+    <string name="permlab_modifyPhoneState">"τροποποίηση κατάστασης τηλεφώνου"</string>
+    <string name="permdesc_modifyPhoneState">"Επιτρέπει στην εφαρμογή τον έλεγχο των τηλεφωνικών δυνατοτήτων της συσκευής. Μια εφαρμογή με αυτήν την άδεια μπορεί να πραγματοποιήσει εναλλαγή μεταξύ δικτύων, να ενεργοποιήσει και να απενεργοποιήσει τον πομπό του τηλεφώνου κ.λπ. χωρίς να σας ειδοποιήσει."</string>
+    <string name="permlab_readPhoneState">"ανάγνωση κατάστασης τηλεφώνου"</string>
+    <string name="permdesc_readPhoneState">"Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Μια εφαρμογή με αυτή την άδεια μπορεί να προσδιορίσει τον τηλεφωνικό αριθμό του τηλεφώνου, αν μια κλήση είναι ενεργή ή όχι, τον τηλεφωνικό αριθμό της κλήσης κ.λπ.."</string>
+    <string name="permlab_wakeLock">"παρεμπόδιση μετάβασης του τηλεφώνου σε κατάσταση αδράνειας"</string>
+    <string name="permdesc_wakeLock">"Επιτρέπει σε μια εφαρμογή την παρεμπόδιση της μετάβασης του τηλεφώνου σε κατάσταση αδράνειας."</string>
+    <string name="permlab_devicePower">"ενεργοποίηση και απενεργοποίηση τηλεφώνου"</string>
+    <string name="permdesc_devicePower">"Επιτρέπει σε μια εφαρμογή να ενεργοποιήσει ή να απενεργοποιήσει το τηλέφωνο."</string>
+    <string name="permlab_factoryTest">"εκτέλεση σε λειτουργία εργοστασιακής δοκιμής"</string>
+    <string name="permdesc_factoryTest">"Εκτέλεση ως χαμηλού επιπέδου δοκιμή κατασκευαστή, ώστε να επιτρέπεται πλήρης πρόσβαση στο υλικό του τηλεφώνου. Διαθέσιμο μόνο όταν το τηλέφωνο βρίσκεται σε λειτουργία δοκιμής κατασκευαστή."</string>
+    <string name="permlab_setWallpaper">"ορισμός ταπετσαρίας"</string>
+    <string name="permdesc_setWallpaper">"Επιτρέπει στην εφαρμογή τον ορισμό της ταπετσαρίας συστήματος."</string>
+    <string name="permlab_setWallpaperHints">"ορισμός συμβουλών μεγέθους ταπετσαρίας"</string>
+    <string name="permdesc_setWallpaperHints">"Επιτρέπει στην εφαρμογή τον ορισμό συμβουλών μεγέθους ταπετσαρίας συστήματος."</string>
+    <string name="permlab_masterClear">"επαναφορά συστήματος στις εργοστασιακές προεπιλογές"</string>
+    <string name="permdesc_masterClear">"Επιτρέπει σε μια εφαρμογή να επαναφέρει πλήρως το σύστημα στις εργοστασιακές ρυθμίσεις, διαγράφοντας όλα τα δεδομένα, τις διαμορφώσεις και τις εγκατεστημένες εφαρμογές."</string>
+    <string name="permlab_setTimeZone">"ορισμός ζώνης ώρας"</string>
+    <string name="permdesc_setTimeZone">"Επιτρέπει σε μια εφαρμογή την αλλαγή της ζώνης ώρας του τηλεφώνου."</string>
+    <string name="permlab_getAccounts">"ανακάλυψη γνωστών λογαριασμών"</string>
+    <string name="permdesc_getAccounts">"Επιτρέπει σε μια εφαρμογή να λάβει τη λίστα λογαριασμών του τηλεφώνου."</string>
+    <string name="permlab_accessNetworkState">"προβολή κατάστασης δικτύου"</string>
+    <string name="permdesc_accessNetworkState">"Επιτρέπει σε μια εφαρμογή την προβολή της κατάστασης όλων των δικτύων."</string>
+    <string name="permlab_createNetworkSockets">"πλήρης πρόσβαση στο Διαδίκτυο"</string>
+    <string name="permdesc_createNetworkSockets">"Επιτρέπει σε μια εφαρμογή τη δημιουργία υποδοχών δικτύου (sockets)."</string>
+    <string name="permlab_writeApnSettings">"εγγραφή ρυθμίσεων Ονόματος σημείου πρόσβασης (APN)"</string>
+    <string name="permdesc_writeApnSettings">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει τις ρυθμίσεις APN, όπως Διακομιστής μεσολάβησης και Θύρα για ένα APN."</string>
+    <string name="permlab_changeNetworkState">"αλλαγή συνδεσιμότητας δικτύου"</string>
+    <string name="permdesc_changeNetworkState">"Επιτρέπει σε μια εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου."</string>
+    <string name="permlab_changeBackgroundDataSetting">"αλλαγή ρύθμισης της χρήσης δεδομένων στο παρασκήνιο"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Επιτρέπει σε μια εφαρμογή την αλλαγή της ρύθμισης χρήσης δεδομένων φόντου."</string>
+    <string name="permlab_accessWifiState">"προβολή κατάστασης Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Επιτρέπει σε μια εφαρμογή την προβολή των πληροφοριών σχετικά με την κατάσταση του Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"αλλαγή κατάστασης Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Επιτρέπει σε μια εφαρμογή τη σύνδεση σε σημεία πρόσβασης Wi-Fi και την αποσύνδεση από αυτά, καθώς και την πραγματοποίηση αλλαγών σε διαμορφωμένα δίκτυα Wi-Fi."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"διαχείριση bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Επιτρέπει σε μια εφαρμογή τη διαμόρφωση του τοπικού τηλεφώνου Bluetooth και την ανακάλυψη και σύζευξη με απομακρυσμένες συσκευές."</string>
+    <string name="permlab_bluetooth">"δημιουργία συνδέσεων Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Επιτρέπει σε μια εφαρμογή να προβάλει τη διαμόρφωση του τοπικού τηλεφώνου Bluetooth και επίσης να πραγματοποιεί και να αποδέχεται συνδέσεις με συζευγμένες συσκευές."</string>
+    <string name="permlab_disableKeyguard">"απενεργοποίηση κλειδώματος πληκτρολογίου"</string>
+    <string name="permdesc_disableKeyguard">"Επιτρέπει σε μια εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, η απενεργοποίηση του κλειδώματος πληκτρολογίου όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και η επανενεργοποίηση του κλειδώματος πληκτρολογίου όταν η κλήση τερματιστεί."</string>
+    <string name="permlab_readSyncSettings">"ανάγνωση ρυθμίσεων συγχρονισμού"</string>
+    <string name="permdesc_readSyncSettings">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού, όπως π.χ. εάν ο συγχρονισμός είναι ενεργοποιημένος για τις Επαφές."</string>
+    <string name="permlab_writeSyncSettings">"καταγραφή ρυθμίσεων συγχρονισμού"</string>
+    <string name="permdesc_writeSyncSettings">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των ρυθμίσεων συγχρονισμού (π.χ. εάν ο συγχρονισμός είναι ενεργοποιημένος για τις Επαφές)."</string>
+    <string name="permlab_readSyncStats">"ανάγνωση στατιστικών συγχρονισμού"</string>
+    <string name="permdesc_readSyncStats">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των στατιστικών συγχρονισμού (π.χ. το ιστορικό των συγχρονισμών που έχουν πραγματοποιηθεί)."</string>
+    <string name="permlab_subscribedFeedsRead">"ανάγνωση ροών δεδομένων στις οποίες έχετε εγγραφεί"</string>
+    <string name="permdesc_subscribedFeedsRead">"Επιτρέπει σε μια εφαρμογή τη λήψη λεπτομερειών σχετικά με τις τρέχουσες συγχρονισμένες ροές δεδομένων."</string>
+    <string name="permlab_subscribedFeedsWrite">"εγγραφή ροών δεδομένων στις οποίες έχετε εγγραφεί"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Επιτρέπει σε μια εφαρμογή να τροποποιήσει τις ροές δεδομένων, με τις οποίες είστε συγχρονισμένοι αυτή τη στιγμή. Αυτό θα μπορούσε να δώσει τη δυνατότητα σε μια κακόβουλη εφαρμογή να αλλάξει τις συγχρονισμένες ροές δεδομένων σας."</string>
+    <string name="permlab_readDictionary">"ανάγνωση καθορισμένου από τον χρήστη λεξικού"</string>
+    <string name="permdesc_readDictionary">"Επιτρέπει σε μια εφαρμογή να αναγνώσει ιδιωτικές λέξεις και φράσεις και ιδιωτικά ονόματα, τα οποία ο χρήστης ενδέχεται να έχει αποθηκεύσει στο λεξικό χρήστη."</string>
+    <string name="permlab_writeDictionary">"εγγραφή σε καθορισμένο από τον χρήστη λεξικό"</string>
+    <string name="permdesc_writeDictionary">"Επιτρέπει σε μια εφαρμογή την εγγραφή νέων λέξεων στο λεξικό χρήστη."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
+  <string-array name="phoneTypes">
+    <item>"Οικία"</item>
+    <item>"Κινητό"</item>
+    <item>"Εργασία"</item>
+    <item>"Φαξ εργασίας"</item>
+    <item>"Φαξ οικίας"</item>
+    <item>"Pager"</item>
+    <item>"Άλλο"</item>
+    <item>"Προσαρμοσμένο"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Οικία"</item>
+    <item>"Εργασία"</item>
+    <item>"Άλλο"</item>
+    <item>"Προσαρμοσμένο"</item>
+  </string-array>
+    <string name="mobileEmailTypeName">"Κινητό"</string>
+  <string-array name="postalAddressTypes">
+    <item>"Οικία"</item>
+    <item>"Εργασία"</item>
+    <item>"Άλλο"</item>
+    <item>"Προσαρμοσμένο"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Οικία"</item>
+    <item>"Εργασία"</item>
+    <item>"Άλλο"</item>
+    <item>"Προσαρμοσμένο"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Εργασία"</item>
+    <item>"Άλλο"</item>
+    <item>"Προσαρμοσμένο"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Πληκτρολογήστε τον κωδικό αριθμό PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"Εσφαλμένος κωδικός αριθμός PIN!"</string>
+    <string name="keyguard_label_text">"Για ξεκλείδωμα, πατήστε το πλήκτρο Menu και, στη συνέχεια, το πλήκτρο 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Αριθμός έκτακτης ανάγκης"</string>
+    <string name="lockscreen_carrier_default">"(Καμία υπηρεσία)"</string>
+    <string name="lockscreen_screen_locked">"Η οθόνη κλειδώθηκε."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Πατήστε \"Menu\" για ξεκλείδωμα ή για κλήση έκτακτης ανάγκης."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Πατήστε \"Μενού\" για ξεκλείδωμα."</string>
+    <string name="lockscreen_pattern_instructions">"Σχεδιασμός μοτίβου για ξεκλείδωμα"</string>
+    <string name="lockscreen_emergency_call">"Κλήση έκτακτης ανάγκης"</string>
+    <string name="lockscreen_pattern_correct">"Σωστό!"</string>
+    <string name="lockscreen_pattern_wrong">"Προσπαθήστε αργότερα"</string>
+    <string name="lockscreen_plugged_in">"Φόρτιση (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
+    <string name="lockscreen_low_battery">"Συνδέστε τον φορτιστή."</string>
+    <string name="lockscreen_missing_sim_message_short">"Δεν υπάρχει κάρτα SIM."</string>
+    <string name="lockscreen_missing_sim_message">"Δεν υπάρχει κάρτα SIM στο τηλέφωνο."</string>
+    <string name="lockscreen_missing_sim_instructions">"Τοποθετήστε μια κάρτα SIM."</string>
+    <string name="lockscreen_network_locked_message">"Το δίκτυο κλειδώθηκε"</string>
+    <string name="lockscreen_sim_puk_locked_message">"Η κάρτα SIM είναι κλειδωμένη με κωδικό PUK."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Ανατρέξτε στον οδηγό χρήσης ή επικοινωνήστε με την εξυπηρέτηση πελατών."</string>
+    <string name="lockscreen_sim_locked_message">"Η κάρτα SIM είναι κλειδωμένη."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Ξεκλείδωμα κάρτας SIM..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Σχεδιάσατε εσφαλμένα το μοτίβο ξεκλειδώματος<xliff:g id="NUMBER_0">%d</xliff:g> φορές. "\n\n"Προσπαθήστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση της σύνδεσής σας Google."\n\n" Προσπαθήστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> \nδευτερόλεπτα."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Προσπαθήστε ξανά σε <xliff:g id="NUMBER">%d</xliff:g> δευτερόλεπτα."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Ξεχάσατε το μοτίβο;"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Πάρα πολλές προσπάθειες μοτίβου!"</string>
+    <string name="lockscreen_glogin_instructions">"Για ξεκλείδωμα, συνδεθείτε με τον λογαριασμό σας Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Όνομα χρήστη (διεύθυνση ηλεκτρονικού ταχυδρομείου)"</string>
+    <string name="lockscreen_glogin_password_hint">"Κωδικός πρόσβασης"</string>
+    <string name="lockscreen_glogin_submit_button">"Σύνδεση"</string>
+    <string name="lockscreen_glogin_invalid_input">"Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης."</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
+    <string name="status_bar_no_notifications_title">"Δεν υπάρχουν ειδοποιήσεις"</string>
+    <string name="status_bar_ongoing_events_title">"Εν εξελίξει"</string>
+    <string name="status_bar_latest_events_title">"Ειδοποιήσεις"</string>
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="battery_status_charging">"Φόρτιση..."</string>
+    <string name="battery_low_title">"Συνδέστε τον φορτιστή"</string>
+    <string name="battery_low_subtitle">"Η στάθμη της μπαταρίας είναι χαμηλή:"</string>
+    <string name="battery_low_percent_format">"απομένουν λιγότερο από <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"Η εργοστασιακή δοκιμή απέτυχε"</string>
+    <string name="factorytest_not_system">"Η ενέργεια FACTORY_TEST υποστηρίζεται μόνο για πακέτα που είναι εγκατεστημένα στον κατάλογο /system/app."</string>
+    <string name="factorytest_no_action">"Δεν βρέθηκε πακέτο που να παρέχει την ενέργεια FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Επανεκκίνηση"</string>
+    <string name="js_dialog_title">"Η σελίδα στο \'<xliff:g id="TITLE">%s</xliff:g>\' λέει:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Απομάκρυνση από αυτή τη σελίδα;"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Επιλέξτε OK για συνέχεια, ή Ακύρωση για παραμονή στην τρέχουσα σελίδα."</string>
+    <string name="save_password_label">"Επιβεβαίωση"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Θέλετε το πρόγραμμα περιήγησης να διατηρήσει αυτόν τον κωδικό πρόσβασης;"</string>
+    <string name="save_password_notnow">"Να μην γίνει τώρα"</string>
+    <string name="save_password_remember">"Διατήρηση"</string>
+    <string name="save_password_never">"Ποτέ"</string>
+    <string name="open_permission_deny">"Δεν έχετε άδεια για να ανοίξετε αυτή τη σελίδα."</string>
+    <string name="text_copied">"Το κείμενο αντιγράφηκε στο πρόχειρο."</string>
+    <string name="more_item_label">"Περισσότερα"</string>
+    <string name="prepend_shortcut_label">"Πλήκτρο Menu+"</string>
+    <string name="menu_space_shortcut_label">"διάστημα"</string>
+    <string name="menu_enter_shortcut_label">"εισαγωγή"</string>
+    <string name="menu_delete_shortcut_label">"διαγραφή"</string>
+    <string name="search_go">"Αναζήτηση"</string>
+    <string name="oneMonthDurationPast">"πριν από 1 μήνα"</string>
+    <string name="beforeOneMonthDurationPast">"Παλαιότερα από 1 μήνα"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"πριν από 1 δευτερόλεπτο"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"πριν από 1 λεπτό"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> λεπτά"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"πριν από 1 ώρα"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> ώρες"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"χθες"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> ημέρες"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"σε 1 δευτερόλεπτο"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"σε 1 λεπτό"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> λεπτά"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"σε 1 ώρα"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> ώρες"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"αύριο"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> ημέρες"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"πριν από 1 δευτερόλεπτο"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"πριν από 1 λεπτό"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> λεπτά"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"πριν από 1 ώρα"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> ώρες"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"χθες"</item>
+    <item quantity="other">"πριν από <xliff:g id="COUNT">%d</xliff:g> ημέρες"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"σε 1 δευτερόλεπτο"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"σε 1 λεπτό"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> λεπτά"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"σε 1 ώρα"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> ώρες"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"αύριο"</item>
+    <item quantity="other">"σε <xliff:g id="COUNT">%d</xliff:g> ημέρες"</item>
+  </plurals>
+    <string name="preposition_for_date">"σε %s"</string>
+    <string name="preposition_for_time">"στο %s"</string>
+    <string name="preposition_for_year">"σε %s"</string>
+    <string name="day">"ημέρα"</string>
+    <string name="days">"ημέρες"</string>
+    <string name="hour">"ώρα"</string>
+    <string name="hours">"ώρες"</string>
+    <string name="minute">"λεπτά"</string>
+    <string name="minutes">"λεπτά"</string>
+    <string name="second">"δευτερόλεπτο"</string>
+    <string name="seconds">"δευτερόλεπτα"</string>
+    <string name="week">"εβδομάδα"</string>
+    <string name="weeks">"εβδομάδες"</string>
+    <string name="year">"έτος"</string>
+    <string name="years">"έτη"</string>
+    <string name="every_weekday">"Καθημερινές (Δευ-Παρ)"</string>
+    <string name="daily">"Καθημερινά"</string>
+    <string name="weekly">"Κάθε εβδομάδα στο <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Μηνιαία"</string>
+    <string name="yearly">"Ετήσια"</string>
+    <string name="VideoView_error_title">"Δεν είναι δυνατή η αναπαραγωγή βίντεο"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Αυτό το βίντεο δεν είναι έγκυρο για ροή σε αυτή τη συσκευή."</string>
+    <string name="VideoView_error_text_unknown">"Δεν είναι δυνατή η προβολή αυτού του βίντεο."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon">"μεσημέρι"</string>
+    <string name="Noon">"Μεσημέρι"</string>
+    <string name="midnight">"μεσάνυχτα"</string>
+    <string name="Midnight">"Μεσάνυχτα"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Επιλογή όλων"</string>
+    <string name="selectText">"Επιλογή κειμένου"</string>
+    <string name="stopSelectingText">"Διακοπή επιλογής κειμένου"</string>
+    <string name="cut">"Αποκοπή"</string>
+    <string name="cutAll">"Αποκοπή όλων"</string>
+    <string name="copy">"Αντιγραφή"</string>
+    <string name="copyAll">"Αντιγραφή όλων"</string>
+    <string name="paste">"Επικόλληση"</string>
+    <string name="copyUrl">"Αντιγραφή διεύθυνσης URL"</string>
+    <string name="inputMethod">"Μέθοδος εισόδου"</string>
+    <string name="addToDictionary">"Προσθήκη \"%s\" στο λεξικό"</string>
+    <string name="editTextMenuTitle">"Επεξεργασία κειμένου"</string>
+    <string name="low_internal_storage_view_title">"Απομένει λίγος ελεύθερος χώρος"</string>
+    <string name="low_internal_storage_view_text">"Έχει απομείνει λίγος ελεύθερος αποθηκευτικός χώρος στο τηλέφωνο."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Ακύρωση"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Ακύρωση"</string>
+    <string name="dialog_alert_title">"Προσοχή"</string>
+    <string name="capital_on">"Ενεργοποιημένο"</string>
+    <string name="capital_off">"Απενεργοποίηση"</string>
+    <string name="whichApplication">"Ολοκλήρωση ενέργειας με τη χρήση"</string>
+    <string name="alwaysUse">"Χρήση από προεπιλογή για αυτήν την ενέργεια."</string>
+    <string name="clearDefaultHintMsg">"Εκκαθάριση προεπιλεγμένων σε Ρυθμίσεις αρχικής σελίδας &gt; Εφαρμογές &gt; Διαχείριση εφαρμογών."</string>
+    <string name="chooseActivity">"Επιλέξτε μια ενέργεια"</string>
+    <string name="noApplications">"Δεν υπάρχουν εφαρμογές, οι οποίες μπορούν να εκτελέσουν αυτήν την ενέργεια."</string>
+    <string name="aerr_title">"Λυπούμαστε!"</string>
+    <string name="aerr_application">"Υπήρξε μη αναμενόμενη διακοπή της εφαρμογής <xliff:g id="APPLICATION">%1$s</xliff:g> (διαδικασία <xliff:g id="PROCESS">%2$s</xliff:g>). Προσπαθήστε ξανά."</string>
+    <string name="aerr_process">"Υπήρξε μη αναμενόμενη διακοπή της διαδικασίας <xliff:g id="PROCESS">%1$s</xliff:g>. Προσπαθήστε αργότερα."</string>
+    <string name="anr_title">"Λυπούμαστε!"</string>
+    <string name="anr_activity_application">"Η δραστηριότητα <xliff:g id="ACTIVITY">%1$s</xliff:g> (στην εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>) δεν αποκρίνεται."</string>
+    <string name="anr_activity_process">"Η δραστηριότητα <xliff:g id="ACTIVITY">%1$s</xliff:g> (στη διαδικασία <xliff:g id="PROCESS">%2$s</xliff:g>) δεν αποκρίνεται."</string>
+    <string name="anr_application_process">"Η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> (στη διαδικασία <xliff:g id="PROCESS">%2$s</xliff:g>) δεν αποκρίνεται."</string>
+    <string name="anr_process">"Η διαδικασία <xliff:g id="PROCESS">%1$s</xliff:g> δεν αποκρίνεται."</string>
+    <string name="force_close">"Αναγκαστικό κλείσιμο"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Αναμονή"</string>
+    <string name="debug">"Εντοπισμός σφαλμάτων"</string>
+    <string name="sendText">"Επιλέξτε μια ενέργεια για το κείμενο"</string>
+    <string name="volume_ringtone">"Ένταση ειδοποίησης ήχου"</string>
+    <string name="volume_music">"Ένταση ήχου πολυμέσων"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Αναπαραγωγή μέσω Bluetooth"</string>
+    <string name="volume_call">"Ένταση ήχου κλήσης"</string>
+    <string name="volume_bluetooth_call">"Ένταση ήχου για εισερχόμενη κληση μέσω Bluetooth"</string>
+    <string name="volume_alarm">"Ένταση ήχου ξυπνητηριού"</string>
+    <string name="volume_notification">"Ένταση ήχου ειδοποίησης"</string>
+    <string name="volume_unknown">"Ένταση ήχου"</string>
+    <string name="ringtone_default">"Προεπιλεγμένος ήχος κλήσης"</string>
+    <string name="ringtone_default_with_actual">"Προεπιλεγμένος ήχος κλήσης (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Σίγαση"</string>
+    <string name="ringtone_picker_title">"Ήχοι κλήσης"</string>
+    <string name="ringtone_unknown">"Άγνωστος ήχος κλήσης"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Υπάρχει διαθέσιμο δίκτυο Wi-Fi"</item>
+    <item quantity="other">"Υπάρχουν διαθέσιμα δίκτυα Wi-Fi"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Υπάρχει διαθέσιμο ανοικτό δίκτυο Wi-Fi"</item>
+    <item quantity="other">"Υπάρχουν διαθέσιμα ανοικτά δίκτυα Wi-Fi"</item>
+  </plurals>
+    <string name="select_character">"Εισαγωγή χαρακτήρα"</string>
+    <string name="sms_control_default_app_name">"Άγνωστη εφαρμογή"</string>
+    <string name="sms_control_title">"Αποστολή μηνυμάτων SMS"</string>
+    <string name="sms_control_message">"Αποστέλλεται μεγάλος αριθμός μηνυμάτων SMS. Επιλέξτε \"OK\" για συνέχεια, ή \"Ακύρωση\" για διακοπή αποστολής."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Ακύρωση"</string>
+    <string name="date_time_set">"Ορισμός"</string>
+    <string name="default_permission_group">"Προεπιλεγμένο"</string>
+    <string name="no_permissions">"Δεν απαιτούνται άδειες"</string>
+    <string name="perms_hide"><b>"Απόκρυψη"</b></string>
+    <string name="perms_show_all"><b>"Εμφάνιση όλων"</b></string>
+    <string name="googlewebcontenthelper_loading">"Φόρτωση..."</string>
+    <string name="usb_storage_title">"Το USB είναι συνδεδεμένο"</string>
+    <string name="usb_storage_message">"Συνδέσατε το τηλέφωνό σας στον υπολογιστή μέσω USB. Επιλέξτε \"Προσάρτηση\" αν θέλετε να αντιγράψετε αρχεία μεταξύ του υπολογιστή και της κάρτας SD του τηλεφώνου."</string>
+    <string name="usb_storage_button_mount">"Προσάρτηση"</string>
+    <string name="usb_storage_button_unmount">"Να μην γίνει προσάρτηση"</string>
+    <string name="usb_storage_error_message">"Παρουσιάστηκε ένα πρόβλημα στη χρήση της κάρτας SD ως αποθηκευτικό χώρο USB."</string>
+    <string name="usb_storage_notification_title">"Το USB είναι συνδεδεμένο"</string>
+    <string name="usb_storage_notification_message">"Επιλέξτε για αντιγραφή προς/από τον υπολογιστή σας."</string>
+    <string name="usb_storage_stop_notification_title">"Απενεργοποίηση αποθηκευτικού χώρου USB"</string>
+    <string name="usb_storage_stop_notification_message">"Επιλογή για απενεργοποίηση αποθηκευτικού χώρου USB."</string>
+    <string name="usb_storage_stop_title">"Απενεργοποίηση αποθηκευτικού χώρου USB"</string>
+    <string name="usb_storage_stop_message">"Πριν από την απενεργοποίηση του αποθηκευτικού χώρου USB, βεβαιωθείτε ότι έχετε αποπροσαρτήσει την υποδοχή USB. Επιλέξτε \"Απενεργοποίηση\" για να απενεργοποιήσετε τον αποθηκευτικό χώρο USB."</string>
+    <string name="usb_storage_stop_button_mount">"Απενεργοποίηση"</string>
+    <string name="usb_storage_stop_button_unmount">"Ακύρωση"</string>
+    <string name="usb_storage_stop_error_message">"Παρουσιάστηκε ένα πρόβλημα κατά την απενεργοποίηση του αποθηκευτικού χώρου USB. Βεβαιωθείτε ότι έχετε αποπροσαρτήσει την υποδοχή USB και προσπαθήστε ξανά."</string>
+    <string name="extmedia_format_title">"Διαμόρφωση κάρτας SD"</string>
+    <string name="extmedia_format_message">"Είστε βέβαιοι ότι θέλετε να διαμορφώσετε την κάρτα SD; Όλα τα δεδομένα στην κάρτα σας θα χαθούν."</string>
+    <string name="extmedia_format_button_format">"Διαμόρφωση"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Επιλογή μεθόδου εισόδου"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"υποψήφιοι"</u></string>
+    <string name="ext_media_checking_notification_title">"Προετοιμασία κάρτας SD"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
+    <string name="ext_media_nofs_notification_title">"Κενή κάρτα SD"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
+    <string name="ext_media_unmountable_notification_title">"Κατεστραμμένη κάρτα SD"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
+    <string name="ext_media_badremoval_notification_title">"Μη αναμενόμενη αφαίρεση κάρτας SD"</string>
+    <string name="ext_media_badremoval_notification_message">"Αποπροσαρτήστε την κάρτα SD πριν την αφαιρέσετε για την αποφυγή απώλειας δεδομένων."</string>
+    <string name="ext_media_safe_unmount_notification_title">"Η κάρτα SD μπορεί να αφαιρεθεί με ασφάλεια"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"Η κάρτα SD αφαιρέθηκε"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
+    <string name="activity_list_empty">"Δεν βρέθηκαν δραστηριότητες που να αντιστοιχούν"</string>
+    <string name="permlab_pkgUsageStats">"ενημέρωση στατιστικών χρήσης στοιχείου"</string>
+    <string name="permdesc_pkgUsageStats">"Επιτρέπει την τροποποίηση στατιστικών χρήσης στοιχείων που έχουν συλλεχθεί. Δεν πρέπει να χρησιμοποιείται από κανονικές εφαρμογές."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Πατήστε δύο φορές για έλεγχο εστίασης"</string>
+    <string name="gadget_host_error_inflating">"Σφάλμα αύξησης μεγέθους γραφικού στοιχείου"</string>
+    <string name="ime_action_go">"Μετάβαση"</string>
+    <string name="ime_action_search">"Αναζήτηση"</string>
+    <string name="ime_action_send">"Αποστολή"</string>
+    <string name="ime_action_next">"Επόμενο"</string>
+    <string name="ime_action_done">"Ολοκληρώθηκε"</string>
+    <string name="ime_action_default">"Εκτέλεση"</string>
+    <string name="dial_number_using">"Κλήση αριθμού"\n"με τη χρήση <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Δημιουργία επαφής"\n"με τη χρήση του <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
+</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 84435aa..6eb1c01 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -21,6 +21,8 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;sin título&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(No hay número de teléfono)"</string>
@@ -60,22 +62,17 @@
     <skip />
     <!-- no translation found for DndMmi (1265478932418334331) -->
     <skip />
-    <string name="CLIRDefaultOnNextCallOn">"El Identificador de llamadas está predeterminado en restringido. Llamada siguiente: restringida"</string>
+    <string name="CLIRDefaultOnNextCallOn">"El identificador de llamadas está predeterminado en restringido. Llamada siguiente: restringida"</string>
     <string name="CLIRDefaultOnNextCallOff">"El Identificador de llamadas está predeterminado en restringido. Llamada siguiente: no restringido"</string>
-    <string name="CLIRDefaultOffNextCallOn">"El Identificador de llamadas está predeterminado en no restringido. Llamada siguiente: restringida"</string>
+    <string name="CLIRDefaultOffNextCallOn">"El identificador de llamadas está predeterminado en no restringido. Llamada siguiente: restringida"</string>
     <string name="CLIRDefaultOffNextCallOff">"El Identificador de llamadas está predeterminado en no restringido. Llamada siguiente: no restringido"</string>
     <string name="serviceNotProvisioned">"Servicio no suministrado."</string>
     <string name="CLIRPermanent">"La configuración del identificador de llamadas no se puede cambiar."</string>
-    <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
-    <skip />
-    <!-- no translation found for RestrictedOnData (8653794784690065540) -->
-    <skip />
-    <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
-    <skip />
-    <!-- no translation found for RestrictedOnNormal (2045364908281990708) -->
-    <skip />
-    <!-- no translation found for RestrictedOnAll (4923139582141626159) -->
-    <skip />
+    <string name="RestrictedChangedTitle">"Se ha cambiado el acceso restringido"</string>
+    <string name="RestrictedOnData">"El servicio de datos está bloqueado."</string>
+    <string name="RestrictedOnEmergency">"El servicio de emergencias está bloqueado."</string>
+    <string name="RestrictedOnNormal">"El servicio de voz/SMS está bloqueado."</string>
+    <string name="RestrictedOnAll">"Todos los servicios de voz/SMS están bloqueados."</string>
     <string name="serviceClassVoice">"Voz"</string>
     <string name="serviceClassData">"Datos"</string>
     <string name="serviceClassFAX">"FAX"</string>
@@ -84,11 +81,43 @@
     <string name="serviceClassDataSync">"Sincronización"</string>
     <string name="serviceClassPacket">"Paquete"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha remitido"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> después de <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha remitido"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: no se ha remitido"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"Aceptar"</string>
     <string name="httpError">"La página web contiene un error."</string>
     <string name="httpErrorLookup">"No se ha podido encontrar la URL."</string>
@@ -105,6 +134,8 @@
     <string name="httpErrorFile">"No se ha podido acceder al archivo."</string>
     <string name="httpErrorFileNotFound">"No se ha encontrado el archivo solicitado."</string>
     <string name="httpErrorTooManyRequests">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"Sincronización"</string>
     <string name="contentServiceSyncNotificationTitle">"Sincronización"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string>
@@ -150,6 +181,10 @@
     <string name="permgroupdesc_systemTools">"Acceso y control de nivel más bajo del sistema."</string>
     <string name="permgrouplab_developmentTools">"Herramientas de desarrollo"</string>
     <string name="permgroupdesc_developmentTools">"Las funciones sólo son necesarias para los desarrolladores de aplicaciones."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
     <string name="permlab_statusBar">"desactivar o modificar la barra de estado"</string>
     <string name="permdesc_statusBar">"Admite que la aplicación desactive la barra de estado, o agregue y elimine íconos del sistema."</string>
     <string name="permlab_expandStatusBar">"expandir o reducir la barra de estado"</string>
@@ -182,6 +217,14 @@
     <string name="permdesc_forceBack">"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">"recuperar el estado interno del sistema"</string>
     <string name="permdesc_dump">"Admite que la aplicación recupere el estado interno del sistema. Las aplicaciones maliciosas pueden recuperar una gran variedad de información privada y segura que normalmente nunca necesitaría."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher">"verificar y controlar todos los lanzamientos de actividades"</string>
     <string name="permdesc_runSetActivityWatcher">"Admite una aplicación que verifica y controla el lanzamiento de actividades por parte del sistema. Las aplicaciones maliciosas pueden comprometer totalmente al sistema. Este permiso sólo es necesario para el desarrollo, nunca para el uso normal del teléfono."</string>
     <string name="permlab_broadcastPackageRemoved">"enviar emisión de paquete eliminado"</string>
@@ -196,6 +239,10 @@
     <string name="permdesc_setAlwaysFinish">"Admite una aplicación que controla si las actividades siempre finalizan cuando van al fondo. No se utiliza nunca en aplicaciones normales."</string>
     <string name="permlab_batteryStats">"modificar la estadística de la batería"</string>
     <string name="permdesc_batteryStats">"Admite la modificación de estadísticas recopiladas sobre la batería. Las aplicaciones normales no deben utilizarlo."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
     <string name="permlab_internalSystemWindow">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow">"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">"mostrar alertas a nivel del sistema"</string>
@@ -255,13 +302,17 @@
     <string name="permlab_readOwnerData">"leer datos del propietario"</string>
     <string name="permdesc_readOwnerData">"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">"leer datos de calendario"</string>
-    <string name="permdesc_readCalendar">"Admite una aplicación que lee 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="permdesc_readCalendar">"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">"escribir datos de calendario"</string>
     <string name="permdesc_writeCalendar">"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>
     <string name="permlab_accessMockLocation">"crear fuentes de ubicación de prueba"</string>
     <string name="permdesc_accessMockLocation">"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">"acceder a comandos adicionales del proveedor del lugar"</string>
     <string name="permdesc_accessLocationExtraCommands">"Accede a comandos adicionales del proveedor del lugar. Las aplicaciones maliciosas pueden utilizarlo para interferir en la operación del GPS u otras fuentes de ubicación."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
     <string name="permlab_accessFineLocation">"ubicación precisa (GPS)"</string>
     <string name="permdesc_accessFineLocation">"Accede a las fuentes de ubicación precisa, como el Sistema de posicionamiento global en el teléfono, si está disponible. Las aplicaciones maliciosas pueden utilizarlo para determinar donde te encuentras y puede consumir energía adicional de la batería."</string>
     <string name="permlab_accessCoarseLocation">"ubicación aproximada (basada en la red)"</string>
@@ -269,7 +320,7 @@
     <string name="permlab_accessSurfaceFlinger">"acceder a SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger">"Admite que la aplicación utilice funciones de bajo nivel de SurfaceFlinger."</string>
     <string name="permlab_readFrameBuffer">"leer el búfer de tramas"</string>
-    <string name="permdesc_readFrameBuffer">"Admite que la aplicación que se utilizará lea el contenido del búfer de tramas."</string>
+    <string name="permdesc_readFrameBuffer">"Admite que la aplicación que se utilizará lea el contenido del búfer de marco."</string>
     <string name="permlab_modifyAudioSettings">"cambiar tu configuración de audio"</string>
     <string name="permdesc_modifyAudioSettings">"Admite que la aplicación modifique la configuración global de audio, como el volumen y el enrutamiento."</string>
     <string name="permlab_recordAudio">"grabar audio"</string>
@@ -334,6 +385,10 @@
     <string name="permdesc_accessWifiState">"Admite una aplicación que observa la información sobre el estado de Wi-Fi."</string>
     <string name="permlab_changeWifiState">"cambiar el estado de Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Admite una aplicación que se conecta y desconecta de los puntos de acceso de Wi-Fi y que hace cambios en las redes de Wi-Fi configuradas."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
     <string name="permlab_bluetoothAdmin">"administración de bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Admite una aplicación que configura el teléfono Bluetooth local y descubre y se vincula con dispositivos remotos."</string>
     <string name="permlab_bluetooth">"crear conexiones de Bluetooth"</string>
@@ -354,6 +409,10 @@
     <string name="permdesc_readDictionary">"Admite una aplicación para leer palabras, nombres y frases privadas que posiblemente el usuario haya almacenado en el diccionario del usuario."</string>
     <string name="permlab_writeDictionary">"escribir al diccionario definido por el usuario"</string>
     <string name="permdesc_writeDictionary">"Admite una aplicación que escribe palabras nuevas en el diccionario del usuario."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
     <item>"Página principal"</item>
     <item>"Celular"</item>
@@ -370,6 +429,7 @@
     <item>"Otros"</item>
     <item>"Personalización"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Celular"</string>
   <string-array name="postalAddressTypes">
     <item>"Página principal"</item>
     <item>"Trabajo"</item>
@@ -410,14 +470,15 @@
     <string name="lockscreen_pattern_correct">"Correcto"</string>
     <string name="lockscreen_pattern_wrong">"Lo sentimos, vuelve a intentarlo"</string>
     <string name="lockscreen_plugged_in">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Conecta tu cargador."</string>
     <string name="lockscreen_missing_sim_message_short">"No hay tarjeta SIM."</string>
     <string name="lockscreen_missing_sim_message">"No hay tarjeta SIM en el teléfono."</string>
     <string name="lockscreen_missing_sim_instructions">"Inserta una tarjeta SIM."</string>
     <string name="lockscreen_network_locked_message">"Red bloqueada"</string>
     <string name="lockscreen_sim_puk_locked_message">"La tarjeta SIM está bloqueada con PUK."</string>
-    <!-- no translation found for lockscreen_sim_puk_locked_instructions (635967534992394321) -->
-    <skip />
+    <string name="lockscreen_sim_puk_locked_instructions">"Consulta la guía del usuario o comunícate con el servicio de atención al cliente."</string>
     <string name="lockscreen_sim_locked_message">"La tarjeta SIM está bloqueada."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"Desbloqueando tarjeta SIM…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message">"Has extraído incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. "\n\n"Vuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -432,7 +493,8 @@
     <string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña incorrecta."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Borrar notificaciones"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"No hay notificaciones"</string>
     <string name="status_bar_ongoing_events_title">"Continuo"</string>
     <string name="status_bar_latest_events_title">"Notificaciones"</string>
@@ -441,6 +503,8 @@
     <string name="battery_low_title">"Conecta el cargador"</string>
     <string name="battery_low_subtitle">"Hay poca batería:"</string>
     <string name="battery_low_percent_format">"menos de <xliff:g id="NUMBER">%d%%</xliff:g> restante."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"Error en la prueba de fábrica"</string>
     <string name="factorytest_not_system">"La acción FACTORY_TEST se admite solamente en paquetes instalados en /system/app."</string>
     <string name="factorytest_no_action">"No se ha encontrado ningún paquete que proporcione la acción FACTORY_TEST ."</string>
@@ -449,6 +513,14 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"¿Deseas salir de esta página?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Selecciona Aceptar para continuar o Cancelar para permanecer en la página actual."</string>
     <string name="save_password_label">"Confirmar"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
     <string name="save_password_message">"¿Quieres recordar esta contraseña en el navegador?"</string>
     <string name="save_password_notnow">"Ahora no."</string>
     <string name="save_password_remember">"Recuerda"</string>
@@ -556,10 +628,6 @@
     <string name="Noon">"Mediodía"</string>
     <string name="midnight">"medianoche"</string>
     <string name="Midnight">"Medianoche"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Seleccionar todos"</string>
@@ -597,6 +665,8 @@
     <string name="anr_application_process">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (en proceso <xliff:g id="PROCESS">%2$s</xliff:g>) no responde."</string>
     <string name="anr_process">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> no responde."</string>
     <string name="force_close">"Provocar acercamiento"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
     <string name="wait">"Espera"</string>
     <string name="debug">"Depurar"</string>
     <string name="sendText">"Selecciona una acción para el texto"</string>
@@ -650,22 +720,31 @@
     <string name="extmedia_format_title">"Formatear tarjeta SD"</string>
     <string name="extmedia_format_message">"¿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">"Formato"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Seleccionar método de entrada"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"candidatos"</u></string>
     <string name="ext_media_checking_notification_title">"Preparación de la tarjeta SD"</string>
-    <string name="ext_media_checking_notification_message">"Verificando errores"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"Tarjeta SD vacía"</string>
-    <string name="ext_media_nofs_notification_message">"La tarjeta SD está vacía o utiliza un filesystem no admitido."</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"Tarjeta SD dañada"</string>
-    <string name="ext_media_unmountable_notification_message">"La tarjeta SD está dañada. Es posible que debas reformatear tu tarjeta."</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"Tarjeta SD extraída de forma imprevista"</string>
     <string name="ext_media_badremoval_notification_message">"Desmontar la tarjeta SD antes de extraerla para evitar la pérdida de datos."</string>
     <string name="ext_media_safe_unmount_notification_title">"Tarjeta SD fácil de extraer"</string>
-    <string name="ext_media_safe_unmount_notification_message">"La tarjeta SD ahora se puede extraer de manera segura."</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
     <string name="ext_media_nomedia_notification_title">"Tarjeta SD extraída"</string>
-    <string name="ext_media_nomedia_notification_message">"Se ha extraído la SD. Inserta una nueva tarjeta SD para aumentar el espacio de almacenamiento de tu dispositivo."</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"No se encontraron actividades coincidentes"</string>
     <string name="permlab_pkgUsageStats">"actualizar la estadística de uso de los componentes"</string>
     <string name="permdesc_pkgUsageStats">"Permite la modificación de estadísticas recopiladas sobre el uso de componentes. Las aplicaciones normales no deben utilizarlo."</string>
@@ -677,8 +756,10 @@
     <string name="ime_action_next">"Siguiente"</string>
     <string name="ime_action_done">"Finalizado"</string>
     <string name="ime_action_default">"Ejecutar"</string>
-    <!-- no translation found for dial_number_using (5789176425167573586) -->
+    <string name="dial_number_using">"Marcar el número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Crear contacto "\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
     <skip />
-    <!-- no translation found for create_contact_using (4947405226788104538) -->
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 920ac3e..464e1a2 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;sin título&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Sin número de teléfono)"</string>
@@ -48,12 +49,18 @@
     <string name="BaMmi">"Bloqueo de llamada"</string>
     <string name="PwdMmi">"Cambio de contraseña"</string>
     <string name="PinMmi">"Cambio de PIN"</string>
+    <string name="CnipMmi">"Número de llamada entrante presente"</string>
+    <string name="CnirMmi">"Número de llamada entrante restringido"</string>
+    <string name="ThreeWCMmi">"Llamada a tres"</string>
+    <string name="RuacMmi">"Rechazo de llamadas molestas no deseadas"</string>
+    <string name="CndMmi">"Entrega de número de llamada entrante"</string>
+    <string name="DndMmi">"No molestar"</string>
     <string name="CLIRDefaultOnNextCallOn">"El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: Restringido"</string>
     <string name="CLIRDefaultOnNextCallOff">"El ID de emisor presenta el valor predeterminado de restringido. Siguiente llamada: No restringido"</string>
     <string name="CLIRDefaultOffNextCallOn">"El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: Restringido"</string>
     <string name="CLIRDefaultOffNextCallOff">"El ID de emisor presenta el valor predeterminado de no restringido. Siguiente llamada: No restringido"</string>
     <string name="serviceNotProvisioned">"El servicio no se suministra."</string>
-    <string name="CLIRPermanent">"El ID del emisor no se puede modificar."</string>
+    <string name="CLIRPermanent">"El ID de emisor no se puede modificar."</string>
     <string name="RestrictedChangedTitle">"El acceso restringido se ha modificado."</string>
     <string name="RestrictedOnData">"El servicio de datos está bloqueado."</string>
     <string name="RestrictedOnEmergency">"El servicio de emergencia está bloqueado."</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Sincronización"</string>
     <string name="serviceClassPacket">"Paquete"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Indicador de itinerancia activado"</string>
+    <string name="roamingText1">"Indicador de itinerancia desactivado"</string>
+    <string name="roamingText2">"Indicador de itinerancia parpadeante"</string>
+    <string name="roamingText3">"Fuera del vecindario"</string>
+    <string name="roamingText4">"Fuera del edificio"</string>
+    <string name="roamingText5">"Itinerancia: sistema preferido"</string>
+    <string name="roamingText6">"Itinerancia: sistema disponible"</string>
+    <string name="roamingText7">"Itinerancia: partner de alianza"</string>
+    <string name="roamingText8">"Itinerancia: partner de gran calidad"</string>
+    <string name="roamingText9">"Itinerancia: funcionalidad de servicio completa"</string>
+    <string name="roamingText10">"Itinerancia: funcionalidad de servicio parcial"</string>
+    <string name="roamingText11">"Banner de itinerancia activado"</string>
+    <string name="roamingText12">"Banner de itinerancia desactivado"</string>
+    <string name="roamingTextSearching">"Buscando servicio"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> transcurridos <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string>
+    <string name="fcComplete">"Código de función completo"</string>
+    <string name="fcError">"Se ha producido un problema de conexión o el código de la función no es válido."</string>
     <string name="httpErrorOk">"Aceptar"</string>
     <string name="httpError">"La página web contiene un error."</string>
     <string name="httpErrorLookup">"No se ha podido encontrar la URL."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"No se ha podido acceder al archivo."</string>
     <string name="httpErrorFileNotFound">"No se ha encontrado el archivo solicitado."</string>
     <string name="httpErrorTooManyRequests">"Se están procesando demasiadas solicitudes. Vuelve a intentarlo más tarde."</string>
+    <string name="certificateSaved">"El certificado se guarda en el almacén de claves del sistema."</string>
     <string name="contentServiceSync">"Sincronización"</string>
     <string name="contentServiceSyncNotificationTitle">"Sincronización"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminaciones de <xliff:g id="CONTENT_TYPE">%s</xliff:g>"</string>
@@ -109,8 +133,8 @@
     <string name="global_action_silent_mode_on_status">"El sonido está desactivado. Activar."</string>
     <string name="global_action_silent_mode_off_status">"El sonido está activado. Desactivar."</string>
     <string name="global_actions_toggle_airplane_mode">"Modo avión"</string>
-    <string name="global_actions_airplane_mode_on_status">"Modo avión ACTIVADO"</string>
-    <string name="global_actions_airplane_mode_off_status">"Modo avión DESACTIVADO"</string>
+    <string name="global_actions_airplane_mode_on_status">"Modo avión desactivado. Activar."</string>
+    <string name="global_actions_airplane_mode_off_status">"Modo avión desactivado. Activar."</string>
     <string name="safeMode">"Modo seguro"</string>
     <string name="android_system_label">"Sistema Android"</string>
     <string name="permgrouplab_costMoney">"Servicios por los que tienes que pagar"</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Acceso de nivel inferior y control del sistema"</string>
     <string name="permgrouplab_developmentTools">"Herramientas de desarrollo"</string>
     <string name="permgroupdesc_developmentTools">"Funciones necesarias sólo para desarrolladores de aplicaciones"</string>
+    <string name="permgrouplab_storage">"Almacenamiento"</string>
+    <string name="permgroupdesc_storage">"Acceder a la tarjeta SD"</string>
     <string name="permlab_statusBar">"inhabilitar o modificar la barra de estado"</string>
     <string name="permdesc_statusBar">"Permite que las aplicaciones inhabiliten la barra de estado, o añadan y eliminen iconos del sistema."</string>
     <string name="permlab_expandStatusBar">"expandir/contraer la barra de estado"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"recuperar estado interno del sistema"</string>
     <string name="permdesc_dump">"Permite que la aplicación recupere el estado interno del sistema. Las aplicaciones malintencionadas pueden recuperar una amplia variedad de información protegida y privada que normalmente no deberían necesitar."</string>
+    <string name="permlab_shutdown">"cierre parcial"</string>
+    <string name="permdesc_shutdown">"Pone el administrador de actividades en estado de cierre. No realiza un cierre completo."</string>
+    <string name="permlab_stopAppSwitches">"evitar cambios de aplicación"</string>
+    <string name="permdesc_stopAppSwitches">"Evita que el usuario cambie a otra aplicación."</string>
     <string name="permlab_runSetActivityWatcher">"supervisar y controlar la ejecución de todas las aplicaciones"</string>
     <string name="permdesc_runSetActivityWatcher">"Permite que una aplicación supervise y controle la ejecución de las actividades por parte del sistema. Las aplicaciones malintencionadas pueden vulnerar la seguridad del sistema. Este permiso sólo es necesario para tareas de desarrollo, nunca para el uso habitual del teléfono."</string>
     <string name="permlab_broadcastPackageRemoved">"enviar emisión eliminada de paquete"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Permite que una aplicación controle si las actividades finalizan siempre en cuanto pasan a segundo plano. No es necesario nunca para las aplicaciones normales."</string>
     <string name="permlab_batteryStats">"modificar estadísticas de la batería"</string>
     <string name="permdesc_batteryStats">"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">"controlar las copias de seguridad y las restauraciones del sistema"</string>
+    <string name="permdesc_backup">"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_internalSystemWindow">"mostrar ventanas no autorizadas"</string>
     <string name="permdesc_internalSystemWindow">"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">"mostrar alertas de nivel del sistema"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"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">"acceder a comandos de proveedor de ubicación adicional"</string>
     <string name="permdesc_accessLocationExtraCommands">"Acceder a comandos de proveedor de ubicación adicional. Las aplicaciones malintencionadas podrían utilizar este permiso para interferir en el funcionamiento del sistema GPS o de otras fuentes de ubicación."</string>
+    <string name="permlab_installLocationProvider">"permiso para instalar un proveedor de ubicación"</string>
+    <string name="permdesc_installLocationProvider">"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, o para controlar y notificar tu ubicación a una fuente externa."</string>
     <string name="permlab_accessFineLocation">"precisar la ubicación (GPS)"</string>
     <string name="permdesc_accessFineLocation">"Permite precisar las fuentes de ubicación como, por ejemplo, el sistema de posicionamiento global, en el teléfono, en los casos en que estén disponibles. Las aplicaciones malintencionadas pueden utilizar este permiso para determinar dónde se encuentra en usuario y pueden consumir batería adicional."</string>
     <string name="permlab_accessCoarseLocation">"ubicación común (basada en red)"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Permite que una aplicación vea la información sobre el estado de la conectividad Wi-Fi."</string>
     <string name="permlab_changeWifiState">"cambiar estado de Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Permite que una aplicación se conecte a puntos de acceso Wi-Fi y se desconecte de ellos, y realice modificaciones en las redes Wi-Fi configuradas."</string>
+    <string name="permlab_changeWifiMulticastState">"permitir recepción multidifusión Wi-Fi"</string>
+    <string name="permdesc_changeWifiMulticastState">"Permite que una aplicación reciba paquetes no dirigidos directamente a tu dispositivo. Esta función puede resultar útil para descubrir servicios cercanos. Utiliza más energía que el modo de no multidifusión."</string>
     <string name="permlab_bluetoothAdmin">"administración de Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Permite que una aplicación configure el teléfono Bluetooth local, y vea dispositivos remotos y sincronice el teléfono con ellos."</string>
     <string name="permlab_bluetooth">"crear conexiones de Bluetooth"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Permite a una aplicación leer cualquier frase, palabra o nombre privado que el usuario haya almacenado en su diccionario."</string>
     <string name="permlab_writeDictionary">"escribir en el diccionario definido por el usuario"</string>
     <string name="permdesc_writeDictionary">"Permite a una aplicación escribir palabras nuevas en el diccionario del usuario."</string>
+    <string name="permlab_sdcardWrite">"modificar/eliminar contenido de la tarjeta SD"</string>
+    <string name="permdesc_sdcardWrite">"Permite que una aplicación escriba en la tarjeta SD."</string>
   <string-array name="phoneTypes">
     <item>"Casa"</item>
     <item>"Móvil"</item>
@@ -353,6 +391,7 @@
     <item>"Otra"</item>
     <item>"Personalizar"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Móvil"</string>
   <string-array name="postalAddressTypes">
     <item>"Casa"</item>
     <item>"Trabajo"</item>
@@ -393,6 +432,8 @@
     <string name="lockscreen_pattern_correct">"Correcto"</string>
     <string name="lockscreen_pattern_wrong">"Inténtalo de nuevo"</string>
     <string name="lockscreen_plugged_in">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Conecta el cargador"</string>
     <string name="lockscreen_missing_sim_message_short">"Falta la tarjeta SIM"</string>
     <string name="lockscreen_missing_sim_message">"No se ha insertado ninguna tarjeta SIM en el teléfono."</string>
@@ -400,7 +441,7 @@
     <string name="lockscreen_network_locked_message">"Bloqueada para la red"</string>
     <string name="lockscreen_sim_puk_locked_message">"La tarjeta SIM está bloqueada con el código PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"Consulta la guía del usuario o ponte en contacto con el servicio de atención al cliente."</string>
-    <string name="lockscreen_sim_locked_message">"La tarjeta SIM está bloqueada."</string>
+    <string name="lockscreen_sim_locked_message">"Introduce el código PIN."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"Desbloqueando tarjeta SIM..."</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación de un patrón de desbloqueo. "\n\n"Inténtalo de nuevo dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
     <string name="lockscreen_failed_attempts_almost_glogin">"Has realizado <xliff:g id="NUMBER_0">%d</xliff:g> intentos fallidos de creación del patrón de desbloqueo. Si realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos fallidos más, se te pedirá que desbloquees el teléfono con tus credenciales de acceso de Google."\n\n" Espera <xliff:g id="NUMBER_2">%d</xliff:g> segundos e inténtalo de nuevo."</string>
@@ -412,9 +453,10 @@
     <string name="lockscreen_glogin_password_hint">"Contraseña"</string>
     <string name="lockscreen_glogin_submit_button">"Acceder"</string>
     <string name="lockscreen_glogin_invalid_input">"Nombre de usuario o contraseña no válido"</string>
-    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
-    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Cerrar notificaciones"</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"No tienes notificaciones"</string>
     <string name="status_bar_ongoing_events_title">"Entrante"</string>
     <string name="status_bar_latest_events_title">"Notificaciones"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Conecta el cargador"</string>
     <string name="battery_low_subtitle">"Se está agotando la batería:"</string>
     <string name="battery_low_percent_format">"menos del <xliff:g id="NUMBER">%d%%</xliff:g> disponible."</string>
+    <string name="battery_low_why">"¿Por qué?"</string>
     <string name="factorytest_failed">"Fallo en la prueba de fábrica"</string>
     <string name="factorytest_not_system">"La acción FACTORY_TEST sólo es compatible con los paquetes instalados en /system/app."</string>
     <string name="factorytest_no_action">"No se ha encontrado ningún paquete que proporcione la acción FACTORY_TEST."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"¿Quieres salir de esta página?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Selecciona \"Aceptar\" para continuar o \"Cancelar\" para permanecer en la página actual."</string>
     <string name="save_password_label">"Confirmar"</string>
+    <string name="permlab_readHistoryBookmarks">"leer información de marcadores y del historial del navegador"</string>
+    <string name="permdesc_readHistoryBookmarks">"Permite que la aplicación lea todas las URL que ha visitado el navegador y todos sus marcadores."</string>
+    <string name="permlab_writeHistoryBookmarks">"escribir en marcadores y en el historial del navegador"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"¿Deseas que el navegador recuerde esta contraseña?"</string>
     <string name="save_password_notnow">"Ahora no"</string>
     <string name="save_password_remember">"Recordar"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Mediodía"</string>
     <string name="midnight">"medianoche"</string>
     <string name="Midnight">"Medianoche"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Seleccionar todo"</string>
@@ -579,6 +622,7 @@
     <string name="anr_application_process">"La aplicación <xliff:g id="APPLICATION">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g> en curso) no está respondiendo."</string>
     <string name="anr_process">"El proceso <xliff:g id="PROCESS">%1$s</xliff:g> no está respondiendo."</string>
     <string name="force_close">"Forzar cierre"</string>
+    <string name="report">"Informe"</string>
     <string name="wait">"Esperar"</string>
     <string name="debug">"Depurar"</string>
     <string name="sendText">"Seleccionar la opción para compartir"</string>
@@ -621,8 +665,8 @@
     <string name="usb_storage_button_unmount">"No activar"</string>
     <string name="usb_storage_error_message">"Se ha producido un problema al intentar utilizar la tarjeta SD para el almacenamiento USB."</string>
     <string name="usb_storage_notification_title">"Conectado por USB"</string>
-    <string name="usb_storage_notification_message">"Seleccionar para copiar archivos al/desde el equipo"</string>
-    <string name="usb_storage_stop_notification_title">"Desactivar almacenar en USB"</string>
+    <string name="usb_storage_notification_message">"Para copiar archivos al/desde el equipo"</string>
+    <string name="usb_storage_stop_notification_title">"Desactivar almacenamiento USB"</string>
     <string name="usb_storage_stop_notification_message">"Seleccionar para desactivar USB."</string>
     <string name="usb_storage_stop_title">"Desactivar almacenamiento USB"</string>
     <string name="usb_storage_stop_message">"Antes de desactivar el almacenamiento USB, asegúrate de haber desactivado el host USB. Selecciona \"Desactivar\" para desactivar el almacenamiento USB."</string>
@@ -632,26 +676,30 @@
     <string name="extmedia_format_title">"Formatear tarjeta SD"</string>
     <string name="extmedia_format_message">"¿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">"Formato"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Seleccionar método de introducción de texto"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"candidatos"</u></string>
     <string name="ext_media_checking_notification_title">"Preparando tarjeta SD"</string>
-    <string name="ext_media_checking_notification_message">"Comprobando errores"</string>
+    <string name="ext_media_checking_notification_message">"Comprobando errores..."</string>
     <string name="ext_media_nofs_notification_title">"Tarjeta SD vacía"</string>
-    <string name="ext_media_nofs_notification_message">"La tarjeta SD está vacía o utiliza un sistema de archivos incompatible."</string>
+    <string name="ext_media_nofs_notification_message">"La tarjeta SD está vacía o su sistema de archivos es incompatible."</string>
     <string name="ext_media_unmountable_notification_title">"Tarjeta SD dañada"</string>
     <string name="ext_media_unmountable_notification_message">"La tarjeta SD está dañada. Es posible que sea necesario volver a formatearla."</string>
     <string name="ext_media_badremoval_notification_title">"La tarjeta SD se ha extraído inesperadamente."</string>
     <string name="ext_media_badremoval_notification_message">"Desactiva la tarjeta SD antes de extraerla para evitar la pérdida de datos."</string>
     <string name="ext_media_safe_unmount_notification_title">"Es seguro extraer la tarjeta SD."</string>
-    <string name="ext_media_safe_unmount_notification_message">"Ya puedes extraer la tarjeta SD."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Puedes extraer la tarjeta SD de forma segura."</string>
     <string name="ext_media_nomedia_notification_title">"Tarjeta SD extraída"</string>
-    <string name="ext_media_nomedia_notification_message">"La tarjeta SD se ha extraído. Inserta una nueva tarjeta SD para aumentar la capacidad de almacenamiento de tu dispositivo."</string>
+    <string name="ext_media_nomedia_notification_message">"La tarjeta SD se ha extraído. Inserta una nueva."</string>
     <string name="activity_list_empty">"No se ha encontrado ninguna actividad coincidente."</string>
     <string name="permlab_pkgUsageStats">"actualizar estadísticas de uso de componentes"</string>
     <string name="permdesc_pkgUsageStats">"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="tutorial_double_tap_to_zoom_message_short">"Pulsa dos veces para acceder al control de zoom."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Da dos toques para acceder al control de zoom."</string>
     <string name="gadget_host_error_inflating">"Error al aumentar el widget"</string>
     <string name="ime_action_go">"Ir"</string>
     <string name="ime_action_search">"Buscar"</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Ejecutar"</string>
     <string name="dial_number_using">"Marcar número"\n"con <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Crear un contacto"\n"a partir de <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="accessibility_compound_button_selected">"seleccionado"</string>
+    <string name="accessibility_compound_button_unselected">"no seleccionado"</string>
 </resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index ce650c1..6bd9389 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -21,40 +21,46 @@
     <string name="gigabyteShort">"Go"</string>
     <string name="terabyteShort">"To"</string>
     <string name="petabyteShort">"Po"</string>
-    <string name="fileSizeSuffix"><xliff:g id="number" example="123">%1$s</xliff:g> <xliff:g id="unit" example="KB">%2$s</xliff:g></string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;sans titre&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Aucun numéro de téléphone)"</string>
     <string name="unknownName">"(Inconnu)"</string>
     <string name="defaultVoiceMailAlphaTag">"Messagerie vocale"</string>
     <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
-    <string name="mmiError">"Problème de connexion ou code MMI non valide."</string>
+    <string name="mmiError">"Problème de connexion ou code IHM non valide."</string>
     <string name="serviceEnabled">"Le service a été activé."</string>
     <string name="serviceEnabledFor">"Ce service a été activé pour :"</string>
     <string name="serviceDisabled">"Ce service a été désactivé."</string>
     <string name="serviceRegistered">"Enregistrement réussi."</string>
     <string name="serviceErased">"Effacement réussi."</string>
     <string name="passwordIncorrect">"Le mot de passe est incorrect."</string>
-    <string name="mmiComplete">"MMI terminé."</string>
+    <string name="mmiComplete">"IHM terminée."</string>
     <string name="badPin">"L\'ancien code PIN saisi est incorrect."</string>
-    <string name="badPuk">"Le code PUK saisi est incorrect."</string>
+    <string name="badPuk">"La clé PUK saisie est incorrecte."</string>
     <string name="mismatchPin">"Les codes PIN saisis ne correspondent pas."</string>
     <string name="invalidPin">"Le code PIN doit compter de 4 à 8 chiffres."</string>
-    <string name="needPuk">"Votre carte SIM est verrouillée par code PUK. Saisissez le code PUK pour la déverrouiller."</string>
-    <string name="needPuk2">"Saisissez le code PUK2 pour débloquer la carte SIM."</string>
-    <string name="ClipMmi">"Identifiant d\'appelant entrant"</string>
-    <string name="ClirMmi">"Identifiant d\'appelant sortant"</string>
+    <string name="needPuk">"Votre carte SIM est verrouillée par clé PUK. Saisissez la clé PUK pour la déverrouiller."</string>
+    <string name="needPuk2">"Saisissez la clé PUK2 pour débloquer la carte SIM."</string>
+    <string name="ClipMmi">"Numéro de l\'appelant (entrant)"</string>
+    <string name="ClirMmi">"Numéro de l\'appelant (sortant)"</string>
     <string name="CfMmi">"Transfert d\'appel"</string>
     <string name="CwMmi">"Appel en attente"</string>
     <string name="BaMmi">"Interdiction d\'appel"</string>
     <string name="PwdMmi">"Modification du mot de passe"</string>
     <string name="PinMmi">"Modification du code PIN"</string>
-    <string name="CLIRDefaultOnNextCallOn">"Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : restreint"</string>
-    <string name="CLIRDefaultOnNextCallOff">"Par défaut, les identifiants d\'appelant sont restreints. Appel suivant : non restreint"</string>
-    <string name="CLIRDefaultOffNextCallOn">"Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : restreint"</string>
-    <string name="CLIRDefaultOffNextCallOff">"Par défaut, les identifiants d\'appelant ne sont pas restreints. Appel suivant : non restreint"</string>
+    <string name="CnipMmi">"Présentation du numéro d\'appelant"</string>
+    <string name="CnirMmi">"Numéro de l\'appelant masqué"</string>
+    <string name="ThreeWCMmi">"Conférence téléphonique à trois"</string>
+    <string name="RuacMmi">"Rejeter les appels indésirables"</string>
+    <string name="CndMmi">"Livraison du numéro d\'appel"</string>
+    <string name="DndMmi">"Ne pas déranger"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : restreint"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Par défaut, les numéros des appelants ne sont pas restreints. Appel suivant : non restreint"</string>
     <string name="serviceNotProvisioned">"Ce service n\'est pas pris en charge."</string>
-    <string name="CLIRPermanent">"Le paramètre Identifiant d\'appelant ne peut pas être modifié."</string>
+    <string name="CLIRPermanent">"Le paramètre Numéro de l\'appelant ne peut pas être modifié."</string>
     <string name="RestrictedChangedTitle">"L\'accès limité a été modifié."</string>
     <string name="RestrictedOnData">"Le service de données est bloqué."</string>
     <string name="RestrictedOnEmergency">"Le service d\'appel d\'urgence est bloqué."</string>
@@ -68,11 +74,27 @@
     <string name="serviceClassDataSync">"Synchrones"</string>
     <string name="serviceClassPacket">"Paquet"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Indicateur d\'itinérance activé"</string>
+    <string name="roamingText1">"Indicateur d\'itinérance désactivé"</string>
+    <string name="roamingText2">"Indicateur d\'itinérance clignotant"</string>
+    <string name="roamingText3">"Hors zone"</string>
+    <string name="roamingText4">"Hors du bâtiment"</string>
+    <string name="roamingText5">"Itinérance - Système préféré"</string>
+    <string name="roamingText6">"Itinérance - Système disponible"</string>
+    <string name="roamingText7">"Itinérance - Partenaire Alliance"</string>
+    <string name="roamingText8">"Itinérance - Partenaire Premium"</string>
+    <string name="roamingText9">"Itinérance - Tous services disponibles"</string>
+    <string name="roamingText10">"Itinérance - Services partiellement disponibles"</string>
+    <string name="roamingText11">"Bannière d\'itinérance activée"</string>
+    <string name="roamingText12">"Bannière d\'itinérance désactivée"</string>
+    <string name="roamingTextSearching">"Recherche des services disponibles"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : <xliff:g id="DIALING_NUMBER">{1}</xliff:g> au bout de <xliff:g id="TIME_DELAY">{2}</xliff:g> secondes"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> : non transféré"</string>
+    <string name="fcComplete">"Code de service terminé"</string>
+    <string name="fcError">"Problème de connexion ou code de service non valide"</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"La page Web contient une erreur."</string>
     <string name="httpErrorLookup">"URL introuvable."</string>
@@ -89,6 +111,7 @@
     <string name="httpErrorFile">"Impossible d\'accéder au fichier."</string>
     <string name="httpErrorFileNotFound">"Le fichier demandé est introuvable."</string>
     <string name="httpErrorTooManyRequests">"Trop de requêtes sont en cours de traitement. Veuillez réessayer ultérieurement."</string>
+    <string name="certificateSaved">"Le certificat est enregistré dans le magasin de clés du système."</string>
     <string name="contentServiceSync">"Synchroniser"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchronisation"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Trop de contenus supprimés (<xliff:g id="CONTENT_TYPE">%s</xliff:g>)."</string>
@@ -134,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Accès et contrôle de faible niveau du système."</string>
     <string name="permgrouplab_developmentTools">"Outils de développement"</string>
     <string name="permgroupdesc_developmentTools">"Ces fonctionnalités sont réservées aux développeurs d\'applications."</string>
+    <string name="permgrouplab_storage">"Stockage"</string>
+    <string name="permgroupdesc_storage">"Accès à la carte SD"</string>
     <string name="permlab_statusBar">"Désactivation ou modification de la barre d\'état"</string>
     <string name="permdesc_statusBar">"Permet à une application de désactiver la barre d\'état ou d\'ajouter/supprimer des icônes système."</string>
     <string name="permlab_expandStatusBar">"Agrandir/réduire la barre d\'état"</string>
@@ -166,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"Vérification de l\'état interne du système"</string>
     <string name="permdesc_dump">"Permet à l\'application de récupérer l\'état interne du système. Des applications malveillantes peuvent obtenir de nombreuses informations personnelles et sécurisées auxquelles elles ne devraient pas avoir accès."</string>
+    <string name="permlab_shutdown">"arrêt partiel"</string>
+    <string name="permdesc_shutdown">"Place le gestionnaire d\'activités en état d\'arrêt. N\'effectue pas un arrêt complet."</string>
+    <string name="permlab_stopAppSwitches">"empêcher les changements d\'applications"</string>
+    <string name="permdesc_stopAppSwitches">"Empêche l\'utilisateur de changer d\'application."</string>
     <string name="permlab_runSetActivityWatcher">"Contrôle du lancement des applications"</string>
     <string name="permdesc_runSetActivityWatcher">"Permet à une application de suivre et de contrôler la façon dont le système lance des activités. Des applications malveillantes peuvent entièrement déstabiliser le système. Cette autorisation est uniquement nécessaire au développement et non pour l\'utilisation normale du téléphone."</string>
     <string name="permlab_broadcastPackageRemoved">"Envoyer une diffusion sans paquet"</string>
@@ -180,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Permet à une application de vérifier si des activités sont systématiquement interrompues lorsqu\'elles sont placées en tâche de fond. Cette fonctionnalité n\'est jamais utilisée par les applications normales."</string>
     <string name="permlab_batteryStats">"Modification des statistiques de la batterie"</string>
     <string name="permdesc_batteryStats">"Autoriser la modification des statistiques de la batterie. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permlab_backup">"contrôler la sauvegarde et la restauration du système"</string>
+    <string name="permdesc_backup">"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_internalSystemWindow">"Affichage de fenêtres non autorisées"</string>
     <string name="permdesc_internalSystemWindow">"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">"Affichage d\'alertes système"</string>
@@ -242,12 +273,14 @@
     <string name="permdesc_readCalendar">"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">"Écriture des données de l\'agenda"</string>
     <string name="permdesc_writeCalendar">"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>
-    <string name="permlab_accessMockLocation">"Création de sources géographiques fictives à des fins de test"</string>
-    <string name="permdesc_accessMockLocation">"Permet de créer des sources de position géographique 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_accessMockLocation">"Création de sources de positionnement fictives à des fins de test"</string>
+    <string name="permdesc_accessMockLocation">"Permet de créer des sources de positionnement 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">"Accès aux commandes de fournisseur de position géographique supplémentaires"</string>
     <string name="permdesc_accessLocationExtraCommands">"Permet d\'accéder à des commandes de fournisseur de position géographique supplémentaires. Des applications malveillantes peuvent utiliser cette fonctionnalité pour interférer avec l\'utilisation du GPS ou d\'autres sources de positionnement géographique."</string>
+    <string name="permlab_installLocationProvider">"autoriser l\'installation d\'un fournisseur de services de localisation"</string>
+    <string name="permdesc_installLocationProvider">"Créer des sources de données de localisation factices à des fins de test. Les applications malveillantes peuvent exploiter cette fonction pour remplacer la position géographique et/ou l\'état renvoyé par les sources de données de localisation réelles, telles que le GPS ou les fournisseurs réseau, ou pour surveiller et transmettre votre position géographique à une source externe."</string>
     <string name="permlab_accessFineLocation">"Localisation OK (GPS)"</string>
-    <string name="permdesc_accessFineLocation">"Permet d\'accéder à des sources de positionnement géographique précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone."</string>
+    <string name="permdesc_accessFineLocation">"Permet d\'accéder à des sources de positionnement précises comme le Global Positioning System (GPS) sur le téléphone, lorsque ces services sont disponibles. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer l\'endroit où vous vous trouvez et augmenter la consommation de la batterie de votre téléphone."</string>
     <string name="permlab_accessCoarseLocation">"Position géo. approximative (selon le réseau)"</string>
     <string name="permdesc_accessCoarseLocation">"Accès à des sources de positionnement approximatif (par ex. des bases de données de réseaux mobiles) pour déterminer la position géographique du téléphone, lorsque cette option est disponible. Des applications malveillantes peuvent utiliser cette fonctionnalité pour déterminer approximativement l\'endroit où vous vous trouvez."</string>
     <string name="permlab_accessSurfaceFlinger">"Accès à SurfaceFlinger"</string>
@@ -279,13 +312,13 @@
     <string name="permlab_callPrivileged">"Appel direct de tout numéro de téléphone"</string>
     <string name="permdesc_callPrivileged">"Permet à une application d\'appeler tout numéro de téléphone (y compris les numéros d\'urgence) sans votre intervention. Des applications malveillantes peuvent passer des appels non nécessaires ou illégitimes à des services d\'urgence."</string>
     <string name="permlab_locationUpdates">"Contrôle des notifications de mise à jour de position géo."</string>
-    <string name="permdesc_locationUpdates">"Permet l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant de la radio. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
+    <string name="permdesc_locationUpdates">"Permet l\'activation/la désactivation des notifications de mises à jour de la position géographique provenant du signal radio. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_checkinProperties">"Accès aux propriétés d\'enregistrement"</string>
     <string name="permdesc_checkinProperties">"Permet un accès en lecture/écriture à des propriétés envoyées par le service d\'inscription. Les applications normales n\'utilisent pas cette fonctionnalité."</string>
     <string name="permlab_bindGadget">"choisir les widgets"</string>
     <string name="permdesc_bindGadget">"Permet à l\'application de signaler au système quels widgets peuvent être utilisés par quelle application. Grâce à cette autorisation, les applications peuvent accorder l\'accès à des données personnelles à d\'autres applications. Cette option n\'est pas utilisée par les applications standard."</string>
     <string name="permlab_modifyPhoneState">"Modification de l\'état du téléphone"</string>
-    <string name="permdesc_modifyPhoneState">"Permet à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer la radio du téléphone, etc., sans vous en avertir."</string>
+    <string name="permdesc_modifyPhoneState">"Permet à une application de contrôler les fonctionnalités téléphoniques de l\'appareil. Une application bénéficiant de cette autorisation peut changer de réseau, éteindre et allumer le signal radio du téléphone, etc., sans vous en avertir."</string>
     <string name="permlab_readPhoneState">"Lecture de l\'état du téléphone"</string>
     <string name="permdesc_readPhoneState">"Permet à l\'application d\'accéder aux fonctionnalités d\'appel du téléphone. L\'application peut alors déterminer le numéro de téléphone de l\'appareil, savoir si un appel est en cours, identifier le numéro appelé, etc."</string>
     <string name="permlab_wakeLock">"Arrêt du mode veille sur le téléphone"</string>
@@ -295,9 +328,9 @@
     <string name="permlab_factoryTest">"Exécution en mode Test d\'usine"</string>
     <string name="permdesc_factoryTest">"Permet d\'exécuter en tant que test fabricant de faible niveau en autorisant l\'accès au matériel du téléphone. Cette fonctionnalité est uniquement disponible lorsque le téléphone est en mode de test fabricant."</string>
     <string name="permlab_setWallpaper">"Configuration du fond d\'écran"</string>
-    <string name="permdesc_setWallpaper">"Permet à une application de définir l\'arrière-plan du système."</string>
+    <string name="permdesc_setWallpaper">"Permet à une application de définir le fond d\'écran du système."</string>
     <string name="permlab_setWallpaperHints">"Sélection de la la taille du fond d\'écran"</string>
-    <string name="permdesc_setWallpaperHints">"Permet à une application de définir la taille d\'arrière-plan du système."</string>
+    <string name="permdesc_setWallpaperHints">"Permet à une application de définir la taille du fond d\'écran."</string>
     <string name="permlab_masterClear">"Réinitialisation du système à ses paramètres d\'usine"</string>
     <string name="permdesc_masterClear">"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_setTimeZone">"Sélection du fuseau horaire"</string>
@@ -318,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Permet à une application d\'afficher des informations concernant l\'état du Wi-Fi."</string>
     <string name="permlab_changeWifiState">"Modifier l\'état du Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Permet à une application de se connecter à des points d\'accès Wi-Fi, de s\'en déconnecter et de modifier des réseaux Wi-Fi configurés."</string>
+    <string name="permlab_changeWifiMulticastState">"autoriser la réception de données en Wi-Fi multidiffusion"</string>
+    <string name="permdesc_changeWifiMulticastState">"Autorise une application à recevoir des paquets qui ne sont pas directement adressés à votre mobile. Cela peut être utile pour la recherche de services disponibles à proximité. Consomme plus que le mode non multidiffusion."</string>
     <string name="permlab_bluetoothAdmin">"Gestion Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Permet à une application de configurer le téléphone Bluetooth local, d\'identifier des périphériques distants et de les associer au téléphone."</string>
     <string name="permlab_bluetooth">"Création de connexions Bluetooth"</string>
@@ -338,9 +373,11 @@
     <string name="permdesc_readDictionary">"Permet à une application de lire tous les mots, noms et expressions que l\'utilisateur a pu enregistrer dans son dictionnaire personnel."</string>
     <string name="permlab_writeDictionary">"Enregistrement dans le dictionnaire défini par l\'utilisateur"</string>
     <string name="permdesc_writeDictionary">"Permet à une application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string>
+    <string name="permlab_sdcardWrite">"modifier/supprimer le contenu de la carte SD"</string>
+    <string name="permdesc_sdcardWrite">"Autorise une application à écrire sur la carte SD."</string>
   <string-array name="phoneTypes">
     <item>"Domicile"</item>
-    <item>"Mobile"</item>
+    <item>"Portable"</item>
     <item>"Bureau"</item>
     <item>"Télécopie bureau"</item>
     <item>"Télécopie domicile"</item>
@@ -354,6 +391,7 @@
     <item>"Autre"</item>
     <item>"Personnalisée"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Mobile"</string>
   <string-array name="postalAddressTypes">
     <item>"Domicile"</item>
     <item>"Bureau"</item>
@@ -389,25 +427,27 @@
     <string name="lockscreen_screen_locked">"Écran verrouillé"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"Appuyez sur \"Menu\" pour débloquer le téléphone ou appeler un numéro d\'urgence"</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"Appuyez sur \"Menu\" pour déverrouiller le téléphone."</string>
-    <string name="lockscreen_pattern_instructions">"Dessinez un motif pour déverrouiller le téléphone"</string>
+    <string name="lockscreen_pattern_instructions">"Dessinez un schéma pour déverrouiller le téléphone"</string>
     <string name="lockscreen_emergency_call">"Appel d\'urgence"</string>
     <string name="lockscreen_pattern_correct">"Combinaison correcte !"</string>
     <string name="lockscreen_pattern_wrong">"Désolé. Merci de réessayer."</string>
     <string name="lockscreen_plugged_in">"Chargement (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Branchez votre chargeur."</string>
     <string name="lockscreen_missing_sim_message_short">"Aucune carte SIM n\'a été trouvée."</string>
     <string name="lockscreen_missing_sim_message">"Aucune carte SIM n\'est insérée dans le téléphone."</string>
     <string name="lockscreen_missing_sim_instructions">"Insérez une carte SIM."</string>
     <string name="lockscreen_network_locked_message">"Réseau verrouillé"</string>
-    <string name="lockscreen_sim_puk_locked_message">"La carte SIM est verrouillée par code PUK."</string>
+    <string name="lockscreen_sim_puk_locked_message">"La carte SIM est verrouillée par clé PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"Veuillez consulter le guide d\'utilisation ou contacter l\'assistance clientèle."</string>
-    <string name="lockscreen_sim_locked_message">"Téléphone verrouillé"</string>
+    <string name="lockscreen_sim_locked_message">"La carte SIM est verrouillée."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"Déblocage de la carte SIM..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Vous avez mal reproduit le motif de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"Vous avez mal saisi le motif de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Vous avez mal reproduit le schéma de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. "\n\n"Veuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Vous avez mal saisi le schéma de déverrouillage <xliff:g id="NUMBER_0">%d</xliff:g> fois. Au bout de <xliff:g id="NUMBER_1">%d</xliff:g> tentatives supplémentaires, vous devrez débloquer votre téléphone à l\'aide de votre identifiant Google."\n\n"Merci de réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string>
-    <string name="lockscreen_forgot_pattern_button_text">"Motif oublié ?"</string>
-    <string name="lockscreen_glogin_too_many_attempts">"Trop de tentatives de motif !"</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Schéma oublié ?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Trop de tentatives !"</string>
     <string name="lockscreen_glogin_instructions">"Pour déverrouiller le téléphone, connectez-vous à l\'aide de votre compte Google."</string>
     <string name="lockscreen_glogin_username_hint">"Nom d\'utilisateur (e-mail)"</string>
     <string name="lockscreen_glogin_password_hint">"Mot de passe"</string>
@@ -415,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Nom d\'utilisateur ou mot de passe incorrect."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Effacer les notifications"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Aucune notification"</string>
     <string name="status_bar_ongoing_events_title">"En cours"</string>
     <string name="status_bar_latest_events_title">"Notifications"</string>
@@ -424,6 +465,7 @@
     <string name="battery_low_title">"Branchez le chargeur"</string>
     <string name="battery_low_subtitle">"Le niveau de la batterie est bas :"</string>
     <string name="battery_low_percent_format">"Batterie restante inférieure à <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="battery_low_why">"Pourquoi ?"</string>
     <string name="factorytest_failed">"Échec du test usine"</string>
     <string name="factorytest_not_system">"L\'action FACTORY_TEST est uniquement prise en charge pour les paquets de données installés dans in/system/app."</string>
     <string name="factorytest_no_action">"Impossible de trouver un paquet proposant l\'action FACTORY_TEST."</string>
@@ -432,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Vous souhaitez quitter cette page ?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Sélectionnez OK pour continuer ou Annuler pour rester sur la page actuelle."</string>
     <string name="save_password_label">"Confirmer"</string>
+    <string name="permlab_readHistoryBookmarks">"lire l\'historique et les favoris du navigateur"</string>
+    <string name="permdesc_readHistoryBookmarks">"Autorise l\'application à lire toutes les URL auxquelles le navigateur a accédé et tous ses favoris."</string>
+    <string name="permlab_writeHistoryBookmarks">"écrire dans l\'historique et les favoris du navigateur"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Voulez-vous que le navigateur se souvienne de ce mot de passe ?"</string>
     <string name="save_password_notnow">"Pas maintenant"</string>
     <string name="save_password_remember">"Se souvenir du mot de passe"</string>
@@ -517,8 +563,8 @@
     <string name="days">"jours"</string>
     <string name="hour">"heure"</string>
     <string name="hours">"heures"</string>
-    <string name="minute">"min"</string>
-    <string name="minutes">"min"</string>
+    <string name="minute">"mn"</string>
+    <string name="minutes">"mn"</string>
     <string name="second">"s"</string>
     <string name="seconds">"s"</string>
     <string name="week">"semaine"</string>
@@ -539,10 +585,6 @@
     <string name="Noon">"Midi"</string>
     <string name="midnight">"minuit"</string>
     <string name="Midnight">"Minuit"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Tout sélectionner"</string>
@@ -580,6 +622,7 @@
     <string name="anr_application_process">"L\'application <xliff:g id="APPLICATION">%1$s</xliff:g> (du processus <xliff:g id="PROCESS">%2$s</xliff:g>) ne répond pas."</string>
     <string name="anr_process">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> ne répond pas."</string>
     <string name="force_close">"Forcer la fermeture"</string>
+    <string name="report">"Rapport"</string>
     <string name="wait">"Attendre"</string>
     <string name="debug">"Débogage"</string>
     <string name="sendText">"Sélectionner une action pour le texte"</string>
@@ -601,8 +644,8 @@
     <item quantity="other">"Réseaux Wi-Fi disponibles"</item>
   </plurals>
   <plurals name="wifi_available_detailed">
-    <item quantity="one">"Ouvrir le réseau Wi-Fi disponible"</item>
-    <item quantity="other">"Ouvrir les réseaux Wi-Fi disponibles"</item>
+    <item quantity="one">"Réseau Wi-Fi ouvert disponible"</item>
+    <item quantity="other">"Réseaux Wi-Fi ouverts disponibles"</item>
   </plurals>
     <string name="select_character">"Insérer un caractère"</string>
     <string name="sms_control_default_app_name">"Application inconnue"</string>
@@ -617,7 +660,7 @@
     <string name="perms_show_all"><b>"Tout afficher"</b></string>
     <string name="googlewebcontenthelper_loading">"Chargement..."</string>
     <string name="usb_storage_title">"Connecté à l\'aide d\'un câble USB"</string>
-    <string name="usb_storage_message">"Vous avez connecté votre téléphone à votre ordinateur à l\'aide d\'un câble USB. Sélectionnez Monter pour copier des fichiers depuis votre ordinateur vers votre carte SD ou inversement."</string>
+    <string name="usb_storage_message">"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">"Monter"</string>
     <string name="usb_storage_button_unmount">"Ne pas monter"</string>
     <string name="usb_storage_error_message">"Un problème est survenu lors de l\'utilisation de votre carte SD en tant que périphérique de stockage USB."</string>
@@ -633,6 +676,10 @@
     <string name="extmedia_format_title">"Formater la carte SD"</string>
     <string name="extmedia_format_message">"Voulez-vous vraiment formater la carte SD ? Toutes les données de cette carte seront perdues."</string>
     <string name="extmedia_format_button_format">"Format"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Sélectionner un mode de saisie"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -640,15 +687,15 @@
     <string name="ext_media_checking_notification_title">"Préparation de la carte SD"</string>
     <string name="ext_media_checking_notification_message">"Recherche d\'erreurs"</string>
     <string name="ext_media_nofs_notification_title">"Carte SD vide"</string>
-    <string name="ext_media_nofs_notification_message">"La carte SD est vide ou utilise un système de fichiers non pris en charge."</string>
+    <string name="ext_media_nofs_notification_message">"La carte SD est vide ou son système de fichiers n\'est pas pris en charge."</string>
     <string name="ext_media_unmountable_notification_title">"Carte SD endommagée"</string>
-    <string name="ext_media_unmountable_notification_message">"La carte SD est endommagée. Vous devrez peut-être reformater votre carte."</string>
+    <string name="ext_media_unmountable_notification_message">"La carte SD est endommagée. Vous devrez peut-être la reformater."</string>
     <string name="ext_media_badremoval_notification_title">"Carte SD retirée inopinément"</string>
     <string name="ext_media_badremoval_notification_message">"Désactiver la carte SD avant de la retirer pour éviter toute perte de données."</string>
     <string name="ext_media_safe_unmount_notification_title">"La carte SD peut être retirée en toute sécurité"</string>
-    <string name="ext_media_safe_unmount_notification_message">"Vous pouvez désormais retirer la carte SD en toute sécurité."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Vous pouvez retirer la carte SD en toute sécurité."</string>
     <string name="ext_media_nomedia_notification_title">"Carte SD manquante"</string>
-    <string name="ext_media_nomedia_notification_message">"Carte SD manquante. Insérez une autre carte pour augmenter la capacité de stockage."</string>
+    <string name="ext_media_nomedia_notification_message">"La carte SD a été retirée. Insérez-en une autre."</string>
     <string name="activity_list_empty">"Aucune activité correspondante trouvée"</string>
     <string name="permlab_pkgUsageStats">"mettre à jour les données statistiques du composant"</string>
     <string name="permdesc_pkgUsageStats">"Permet de modifier les données statistiques collectées du composant. Cette option n\'est pas utilisée par les applications standard."</string>
@@ -658,8 +705,10 @@
     <string name="ime_action_search">"Rechercher"</string>
     <string name="ime_action_send">"Envoyer"</string>
     <string name="ime_action_next">"Suivant"</string>
-    <string name="ime_action_done">"Terminé"</string>
+    <string name="ime_action_done">"OK"</string>
     <string name="ime_action_default">"Exécuter"</string>
     <string name="dial_number_using">"Composer le numéro"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Ajouter un contact"\n"en utilisant <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="accessibility_compound_button_selected">"sélectionné"</string>
+    <string name="accessibility_compound_button_unselected">"non sélectionné"</string>
 </resources>
diff --git a/core/res/res/values-he-rIL/donottranslate-cldr.xml b/core/res/res/values-he-rIL/donottranslate-cldr.xml
index e3feb1e..3378ed7 100644
--- a/core/res/res/values-he-rIL/donottranslate-cldr.xml
+++ b/core/res/res/values-he-rIL/donottranslate-cldr.xml
@@ -61,20 +61,20 @@
     <string name="day_of_week_long_friday">יום שישי</string>
     <string name="day_of_week_long_saturday">יום שבת</string>
 
-    <string name="day_of_week_medium_sunday">יום א'</string>
-    <string name="day_of_week_medium_monday">יום ב'</string>
-    <string name="day_of_week_medium_tuesday">יום ג'</string>
-    <string name="day_of_week_medium_wednesday">יום ד'</string>
-    <string name="day_of_week_medium_thursday">יום ה'</string>
-    <string name="day_of_week_medium_friday">יום ו'</string>
+    <string name="day_of_week_medium_sunday">יום א\'</string>
+    <string name="day_of_week_medium_monday">יום ב\'</string>
+    <string name="day_of_week_medium_tuesday">יום ג\'</string>
+    <string name="day_of_week_medium_wednesday">יום ד\'</string>
+    <string name="day_of_week_medium_thursday">יום ה\'</string>
+    <string name="day_of_week_medium_friday">יום ו\'</string>
     <string name="day_of_week_medium_saturday">שבת</string>
 
-    <string name="day_of_week_short_sunday">יום א'</string>
-    <string name="day_of_week_short_monday">יום ב'</string>
-    <string name="day_of_week_short_tuesday">יום ג'</string>
-    <string name="day_of_week_short_wednesday">יום ד'</string>
-    <string name="day_of_week_short_thursday">יום ה'</string>
-    <string name="day_of_week_short_friday">יום ו'</string>
+    <string name="day_of_week_short_sunday">יום א\'</string>
+    <string name="day_of_week_short_monday">יום ב\'</string>
+    <string name="day_of_week_short_tuesday">יום ג\'</string>
+    <string name="day_of_week_short_wednesday">יום ד\'</string>
+    <string name="day_of_week_short_thursday">יום ה\'</string>
+    <string name="day_of_week_short_friday">יום ו\'</string>
     <string name="day_of_week_short_saturday">שבת</string>
 
     <string name="day_of_week_shortest_sunday">א</string>
diff --git a/core/res/res/values-hr-rHR/donottranslate-cldr.xml b/core/res/res/values-hr-rHR/donottranslate-cldr.xml
new file mode 100644
index 0000000..6f8d6e5
--- /dev/null
+++ b/core/res/res/values-hr-rHR/donottranslate-cldr.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="month_long_standalone_january">siječanj</string>
+    <string name="month_long_standalone_february">veljača</string>
+    <string name="month_long_standalone_march">ožujak</string>
+    <string name="month_long_standalone_april">travanj</string>
+    <string name="month_long_standalone_may">svibanj</string>
+    <string name="month_long_standalone_june">lipanj</string>
+    <string name="month_long_standalone_july">srpanj</string>
+    <string name="month_long_standalone_august">kolovoz</string>
+    <string name="month_long_standalone_september">rujan</string>
+    <string name="month_long_standalone_october">listopad</string>
+    <string name="month_long_standalone_november">studeni</string>
+    <string name="month_long_standalone_december">prosinac</string>
+
+    <string name="month_long_january">siječnja</string>
+    <string name="month_long_february">veljače</string>
+    <string name="month_long_march">ožujka</string>
+    <string name="month_long_april">travnja</string>
+    <string name="month_long_may">svibnja</string>
+    <string name="month_long_june">lipnja</string>
+    <string name="month_long_july">srpnja</string>
+    <string name="month_long_august">kolovoza</string>
+    <string name="month_long_september">rujna</string>
+    <string name="month_long_october">listopada</string>
+    <string name="month_long_november">studenoga</string>
+    <string name="month_long_december">prosinca</string>
+
+    <string name="month_medium_january">01.</string>
+    <string name="month_medium_february">02.</string>
+    <string name="month_medium_march">03.</string>
+    <string name="month_medium_april">04.</string>
+    <string name="month_medium_may">05.</string>
+    <string name="month_medium_june">06.</string>
+    <string name="month_medium_july">07.</string>
+    <string name="month_medium_august">08.</string>
+    <string name="month_medium_september">09.</string>
+    <string name="month_medium_october">10.</string>
+    <string name="month_medium_november">11.</string>
+    <string name="month_medium_december">12.</string>
+
+    <string name="month_shortest_january">1.</string>
+    <string name="month_shortest_february">2.</string>
+    <string name="month_shortest_march">3.</string>
+    <string name="month_shortest_april">4.</string>
+    <string name="month_shortest_may">5.</string>
+    <string name="month_shortest_june">6.</string>
+    <string name="month_shortest_july">7.</string>
+    <string name="month_shortest_august">8.</string>
+    <string name="month_shortest_september">9.</string>
+    <string name="month_shortest_october">10.</string>
+    <string name="month_shortest_november">11.</string>
+    <string name="month_shortest_december">12.</string>
+
+    <string name="day_of_week_long_sunday">nedjelja</string>
+    <string name="day_of_week_long_monday">ponedjeljak</string>
+    <string name="day_of_week_long_tuesday">utorak</string>
+    <string name="day_of_week_long_wednesday">srijeda</string>
+    <string name="day_of_week_long_thursday">četvrtak</string>
+    <string name="day_of_week_long_friday">petak</string>
+    <string name="day_of_week_long_saturday">subota</string>
+
+    <string name="day_of_week_medium_sunday">ned</string>
+    <string name="day_of_week_medium_monday">pon</string>
+    <string name="day_of_week_medium_tuesday">uto</string>
+    <string name="day_of_week_medium_wednesday">sri</string>
+    <string name="day_of_week_medium_thursday">čet</string>
+    <string name="day_of_week_medium_friday">pet</string>
+    <string name="day_of_week_medium_saturday">sub</string>
+
+    <string name="day_of_week_short_sunday">ned</string>
+    <string name="day_of_week_short_monday">pon</string>
+    <string name="day_of_week_short_tuesday">uto</string>
+    <string name="day_of_week_short_wednesday">sri</string>
+    <string name="day_of_week_short_thursday">čet</string>
+    <string name="day_of_week_short_friday">pet</string>
+    <string name="day_of_week_short_saturday">sub</string>
+
+    <string name="day_of_week_shortest_sunday">n</string>
+    <string name="day_of_week_shortest_monday">p</string>
+    <string name="day_of_week_shortest_tuesday">u</string>
+    <string name="day_of_week_shortest_wednesday">s</string>
+    <string name="day_of_week_shortest_thursday">č</string>
+    <string name="day_of_week_shortest_friday">p</string>
+    <string name="day_of_week_shortest_saturday">s</string>
+
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="yesterday">jučer</string>
+    <string name="today">danas</string>
+    <string name="tomorrow">sutra</string>
+
+    <string name="hour_minute_24">%-k:%M</string>
+    <string name="hour_minute_ampm">%-l:%M %p</string>
+    <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
+    <string name="twelve_hour_time_format">h:mm a</string>
+    <string name="twenty_four_hour_time_format">H:mm</string>
+    <string name="numeric_date">%-e.%-m.%Y.</string>
+    <string name="numeric_date_format">d.M.yyyy.</string>
+    <string name="numeric_date_template">"%s.%s.%s."</string>
+    <string name="month_day_year">%-e. %B %Y.</string>
+    <string name="time_of_day">%H:%M:%S</string>
+    <string name="date_and_time">%H:%M:%S %-e.%b.%Y.</string>
+    <string name="date_time">%2$s %1$s</string>
+    <string name="time_date">%1$s %3$s</string>
+    <string name="abbrev_month_day_year">%-e.%b.%Y.</string>
+    <string name="month_day">%-e. %B</string>
+    <string name="month">%-B</string>
+    <string name="month_year">%B %Y.</string>
+    <string name="abbrev_month_day">%-e.%b.</string>
+    <string name="abbrev_month">%-b.</string>
+    <string name="abbrev_month_year">%b.%Y.</string>
+    <string name="time1_time2">%1$s - %2$s</string>
+    <string name="date1_date2">%2$s - %5$s</string>
+    <string name="numeric_md1_md2">%3$s.%2$s. - %8$s.%7$s.</string>
+    <string name="numeric_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string>
+    <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s. - %8$s.%7$s.%9$s.</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s. - %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s. - %10$s %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s. - %10$s %8$s.%7$s.</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s. - %10$s %8$s.%7$s.%9$s.</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s, %2$s - %6$s %4$s, %5$s</string>
+    <string name="wday1_date1_wday2_date2">%1$s, %2$s - %4$s, %5$s</string>
+    <string name="date1_time1_date2_time2">%3$s %2$s - %6$s %5$s</string>
+    <string name="time_wday_date">%1$s %2$s, %3$s</string>
+    <string name="wday_date">%2$s, %3$s</string>
+    <string name="time_wday">%1$s %2$s</string>
+    <string name="same_year_md1_md2">%3$s. %2$s - %8$s. %7$s</string>
+    <string name="same_year_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string>
+    <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string>
+    <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s - %10$s %8$s. %7$s</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s, %3$s.%2$s. - %10$s %6$s, %8$s.%7$s.</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s. - %10$s %8$s.%7$s.%9$s.</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s. - %10$s %8$s.%7$s.%9$s.</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s. - %10$s %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s, %3$s.%2$s.%4$s. - %10$s %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s.%4$s. - %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="same_month_md1_md2">%3$s. - %8$s.%2$s.</string>
+    <string name="same_month_wday1_md1_wday2_md2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.</string>
+    <string name="same_year_mdy1_mdy2">%3$s.%2$s. - %8$s.%7$s.%9$s.</string>
+    <string name="same_month_mdy1_mdy2">%3$s. - %8$s.%2$s.%9$s.</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s, %3$s.%2$s. - %6$s, %8$s.%7$s.%9$s.</string>
+    <string name="short_format_month">%b</string>
+</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 5bfbc49..1a18450 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;senza nome&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Nessun numero di telefono)"</string>
@@ -48,6 +49,12 @@
     <string name="BaMmi">"Blocco chiamate"</string>
     <string name="PwdMmi">"Modifica password"</string>
     <string name="PinMmi">"Modifica PIN"</string>
+    <string name="CnipMmi">"Numero chiamante presente"</string>
+    <string name="CnirMmi">"Numero chiamante con restrizioni"</string>
+    <string name="ThreeWCMmi">"Chiamata a tre"</string>
+    <string name="RuacMmi">"Rifiuto di chiamate fastidiose non desiderate"</string>
+    <string name="CndMmi">"Recapito numero chiamante"</string>
+    <string name="DndMmi">"Non disturbare"</string>
     <string name="CLIRDefaultOnNextCallOn">"ID chiamante generalmente limitato. Prossima chiamata: limitato"</string>
     <string name="CLIRDefaultOnNextCallOff">"ID chiamante generalmente limitato. Prossima chiamata: non limitato"</string>
     <string name="CLIRDefaultOffNextCallOn">"ID chiamante generalmente non limitato. Prossima chiamata: limitato"</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Sinc"</string>
     <string name="serviceClassPacket">"Pacchetto"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Indicatore roaming attivato"</string>
+    <string name="roamingText1">"Indicatore roaming disattivato"</string>
+    <string name="roamingText2">"Indicatore roaming lampeggiante"</string>
+    <string name="roamingText3">"Fuori dal vicinato"</string>
+    <string name="roamingText4">"Fuori dall\'edificio"</string>
+    <string name="roamingText5">"Roaming - Sistema preferito"</string>
+    <string name="roamingText6">"Roaming - Sistema disponibile"</string>
+    <string name="roamingText7">"Roaming - Partner Alliance"</string>
+    <string name="roamingText8">"Roaming - Partner Premium"</string>
+    <string name="roamingText9">"Roaming - Funzionalità servizio completo"</string>
+    <string name="roamingText10">"Roaming - Funzionalità servizio parziale"</string>
+    <string name="roamingText11">"Banner roaming attivato"</string>
+    <string name="roamingText12">"Banner roaming disattivato"</string>
+    <string name="roamingTextSearching">"Ricerca servizio"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: inoltro non effettuato"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> dopo <xliff:g id="TIME_DELAY">{2}</xliff:g> secondi"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: inoltro non effettuato"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: inoltro non effettuato"</string>
+    <string name="fcComplete">"Codice funzione completo."</string>
+    <string name="fcError">"Problema di connessione o codice funzione non valido."</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"La pagina web contiene un errore."</string>
     <string name="httpErrorLookup">"Impossibile trovare l\'URL."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"Impossibile accedere al file."</string>
     <string name="httpErrorFileNotFound">"Impossibile trovare il file richiesto."</string>
     <string name="httpErrorTooManyRequests">"Troppe richieste in fase di elaborazione. Riprova più tardi."</string>
+    <string name="certificateSaved">"Il certificato viene salvato nell\'archivio chiavi del sistema."</string>
     <string name="contentServiceSync">"Sinc"</string>
     <string name="contentServiceSyncNotificationTitle">"Sincronizzazione"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Troppe eliminazioni di <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -108,9 +132,9 @@
     <string name="global_action_toggle_silent_mode">"Modalità silenziosa"</string>
     <string name="global_action_silent_mode_on_status">"Audio non attivo"</string>
     <string name="global_action_silent_mode_off_status">"Audio attivo"</string>
-    <string name="global_actions_toggle_airplane_mode">"Modalità in volo"</string>
-    <string name="global_actions_airplane_mode_on_status">"Modalità in volo attiva"</string>
-    <string name="global_actions_airplane_mode_off_status">"Modalità in volo non attiva"</string>
+    <string name="global_actions_toggle_airplane_mode">"Modalità aereo attiva"</string>
+    <string name="global_actions_airplane_mode_on_status">"Modalità aereo attiva"</string>
+    <string name="global_actions_airplane_mode_off_status">"Modalità aereo non attiva"</string>
     <string name="safeMode">"Modalità provvisoria"</string>
     <string name="android_system_label">"Sistema Android"</string>
     <string name="permgrouplab_costMoney">"Servizi che prevedono un costo"</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Accesso al sistema e controllo di livello inferiore."</string>
     <string name="permgrouplab_developmentTools">"Strumenti di sviluppo"</string>
     <string name="permgroupdesc_developmentTools">"Funzionalità necessarie soltanto agli sviluppatori di applicazioni."</string>
+    <string name="permgrouplab_storage">"Archiviazione"</string>
+    <string name="permgroupdesc_storage">"Accesso alla scheda SD."</string>
     <string name="permlab_statusBar">"disattivare o modificare la barra di stato"</string>
     <string name="permdesc_statusBar">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string>
     <string name="permlab_expandStatusBar">"espansione/compressione barra di stato"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"recupero stato interno del sistema"</string>
     <string name="permdesc_dump">"Consente all\'applicazione di recuperare lo stato interno del sistema. Le applicazioni dannose potrebbero recuperare molte informazioni riservate e protette di cui non dovrebbero avere mai bisogno."</string>
+    <string name="permlab_shutdown">"chiusura parziale"</string>
+    <string name="permdesc_shutdown">"Mette il gestore delle attività in uno stato di chiusura. Non esegue una chiusura completa."</string>
+    <string name="permlab_stopAppSwitches">"impedire commutazione applicazione"</string>
+    <string name="permdesc_stopAppSwitches">"Impedisce all\'utente di passare a un\'altra applicazione."</string>
     <string name="permlab_runSetActivityWatcher">"monitoraggio e controllo avvio applicazioni"</string>
     <string name="permdesc_runSetActivityWatcher">"Consente a un\'applicazione di monitorare e controllare la modalità di avvio delle attività nel sistema. Le applicazioni dannose potrebbero compromettere totalmente il sistema. Questa autorizzazione è necessaria soltanto per lo sviluppo, mai per il normale utilizzo del telefono."</string>
     <string name="permlab_broadcastPackageRemoved">"invio broadcast rimossi dal pacchetto"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Consente a un\'applicazione di controllare se le attività sono sempre completate quando vengono messe in secondo piano. Mai necessario per le normali applicazioni."</string>
     <string name="permlab_batteryStats">"modifica statistiche batteria"</string>
     <string name="permdesc_batteryStats">"Consente la modifica delle statistiche sulla batteria raccolte. Da non usare per normali applicazioni."</string>
+    <string name="permlab_backup">"controllo del backup di sistema e ripristino"</string>
+    <string name="permdesc_backup">"Consente all\'applicazione di controllare i backup dei sistemi e il meccanismo di ripristino. Da non usare per normali applicazioni."</string>
     <string name="permlab_internalSystemWindow">"visualizzazione finestre non autorizzate"</string>
     <string name="permdesc_internalSystemWindow">"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">"visualizzazione avvisi di sistema"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"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">"accesso a comandi aggiuntivi del provider di localizz."</string>
     <string name="permdesc_accessLocationExtraCommands">"Accedere a comandi aggiuntivi del provider di localizzazione. Le applicazioni dannose possono sfruttare questa possibilità per interferire con il funzionamento del GPS o di altre fonti di localizzazione."</string>
+    <string name="permlab_installLocationProvider">"autorizzazione a installare un provider di localizzazione"</string>
+    <string name="permdesc_installLocationProvider">"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 oppure per monitorare e segnalare la tua posizione a una fonte esterna."</string>
     <string name="permlab_accessFineLocation">"localizzazione precisa (GPS)"</string>
     <string name="permdesc_accessFineLocation">"Consente l\'accesso a fonti di localizzazione precisa, come il sistema GPS del telefono, se disponibile. Le applicazioni dannose possono sfruttare questa possibilità per determinare la tua posizione e, nel farlo, far esaurire più in fretta la batteria."</string>
     <string name="permlab_accessCoarseLocation">"localizzazione approssimativa (basata sulla rete)"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Consente a un\'applicazione di visualizzare le informazioni relative allo stato della connessione Wi-Fi."</string>
     <string name="permlab_changeWifiState">"modifica stato Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Consente a un\'applicazione di connettersi/disconnettersi da punti di accesso Wi-Fi e di apportare modifiche alle reti Wi-Fi configurate."</string>
+    <string name="permlab_changeWifiMulticastState">"consenti ricezione multicast Wi-Fi"</string>
+    <string name="permdesc_changeWifiMulticastState">"Consente a un\'applicazione di ricevere pacchetti non direttamente indirizzati al tuo dispositivo. Può essere utile durante la ricerca di servizi offerti nelle vicinanze. Consuma di più rispetto alla modalità non multicast."</string>
     <string name="permlab_bluetoothAdmin">"gestione Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Consente a un\'applicazione di configurare il telefono Bluetooth locale e di rilevare e abbinare dispositivi remoti."</string>
     <string name="permlab_bluetooth">"creazione connessioni Bluetooth"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Consente a un\'applicazione di leggere parole, nomi e frasi private che l\'utente potrebbe aver memorizzato nel dizionario utente."</string>
     <string name="permlab_writeDictionary">"scrittura nel dizionario definito dall\'utente"</string>
     <string name="permdesc_writeDictionary">"Consente a un\'applicazione di scrivere nuove parole nel dizionario utente."</string>
+    <string name="permlab_sdcardWrite">"modificare/eliminare i contenuti della scheda SD"</string>
+    <string name="permdesc_sdcardWrite">"Consente a un\'applicazione di scrivere sulla scheda SD."</string>
   <string-array name="phoneTypes">
     <item>"Casa"</item>
     <item>"Cellulare"</item>
@@ -353,6 +391,7 @@
     <item>"Altro"</item>
     <item>"Personalizzato"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Cellulare"</string>
   <string-array name="postalAddressTypes">
     <item>"Casa"</item>
     <item>"Ufficio"</item>
@@ -393,6 +432,8 @@
     <string name="lockscreen_pattern_correct">"Corretta."</string>
     <string name="lockscreen_pattern_wrong">"Riprova"</string>
     <string name="lockscreen_plugged_in">"In carica (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Collegare il caricabatterie."</string>
     <string name="lockscreen_missing_sim_message_short">"Nessuna SIM presente."</string>
     <string name="lockscreen_missing_sim_message">"Nessuna SIM presente nel telefono."</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Password o nome utente non valido."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Cancella notifiche"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Nessuna notifica"</string>
     <string name="status_bar_ongoing_events_title">"In corso"</string>
     <string name="status_bar_latest_events_title">"Notifiche"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Collegare il caricabatterie"</string>
     <string name="battery_low_subtitle">"Batteria quasi scarica:"</string>
     <string name="battery_low_percent_format">"energia residua inferiore a <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="battery_low_why">"Perché?"</string>
     <string name="factorytest_failed">"Test di fabbrica non riuscito"</string>
     <string name="factorytest_not_system">"L\'azione FACTORY_TEST è supportata soltanto per i pacchetti installati in /system/app."</string>
     <string name="factorytest_no_action">"Nessun pacchetto trovato che fornisca l\'azione FACTORY_TEST."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Uscire da questa pagina?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Seleziona OK per continuare o Annulla per rimanere nella pagina corrente."</string>
     <string name="save_password_label">"Conferma"</string>
+    <string name="permlab_readHistoryBookmarks">"lettura cronologia e segnalibri del browser"</string>
+    <string name="permdesc_readHistoryBookmarks">"Consente all\'applicazione di leggere tutti gli URL visitati e tutti i segnalibri del browser."</string>
+    <string name="permlab_writeHistoryBookmarks">"creazione cronologia e segnalibri del browser"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Memorizzare la password nel browser?"</string>
     <string name="save_password_notnow">"Non ora"</string>
     <string name="save_password_remember">"Memorizza"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Mezzogiorno"</string>
     <string name="midnight">"mezzanotte"</string>
     <string name="Midnight">"Mezzanotte"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Seleziona tutto"</string>
@@ -579,9 +622,10 @@
     <string name="anr_application_process">"L\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g> (nel processo <xliff:g id="PROCESS">%2$s</xliff:g>) non risponde."</string>
     <string name="anr_process">"Il processo <xliff:g id="PROCESS">%1$s</xliff:g> non risponde."</string>
     <string name="force_close">"Termina"</string>
+    <string name="report">"Segnala"</string>
     <string name="wait">"Attendi"</string>
     <string name="debug">"Debug"</string>
-    <string name="sendText">"Seleziona un\'azione per il testo"</string>
+    <string name="sendText">"Selezione un\'opzione di invio"</string>
     <string name="volume_ringtone">"Volume suoneria"</string>
     <string name="volume_music">"Volume app. multimediali"</string>
     <string name="volume_music_hint_playing_through_bluetooth">"Riproduzione tramite Bluetooth"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"Formatta scheda SD"</string>
     <string name="extmedia_format_message">"Formattare la scheda SD? Tutti i dati sulla scheda verranno persi."</string>
     <string name="extmedia_format_button_format">"Formatta"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Seleziona metodo di inserimento"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"candidati"</u></string>
     <string name="ext_media_checking_notification_title">"Preparazione scheda SD"</string>
-    <string name="ext_media_checking_notification_message">"Ricerca errori"</string>
+    <string name="ext_media_checking_notification_message">"Ricerca errori."</string>
     <string name="ext_media_nofs_notification_title">"Scheda SD vuota"</string>
-    <string name="ext_media_nofs_notification_message">"La scheda SD è vuota o utilizza un file system non supportato."</string>
+    <string name="ext_media_nofs_notification_message">"Scheda SD vuota o con filesystem non supportato."</string>
     <string name="ext_media_unmountable_notification_title">"Scheda SD danneggiata"</string>
-    <string name="ext_media_unmountable_notification_message">"La scheda SD è danneggiata. Potrebbe essere necessario riformattarla."</string>
+    <string name="ext_media_unmountable_notification_message">"Scheda SD danneggiata. Potrebbe essere necessario riformattarla."</string>
     <string name="ext_media_badremoval_notification_title">"Rimozione imprevista della scheda SD"</string>
     <string name="ext_media_badremoval_notification_message">"Smonta scheda SD prima della rimozione per evitare la perdita di dati."</string>
     <string name="ext_media_safe_unmount_notification_title">"È possibile rimuovere la scheda SD"</string>
-    <string name="ext_media_safe_unmount_notification_message">"È ora possibile rimuovere la scheda SD in modo sicuro."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Puoi rimuovere la scheda SD in tutta sicurezza."</string>
     <string name="ext_media_nomedia_notification_title">"Scheda SD rimossa"</string>
-    <string name="ext_media_nomedia_notification_message">"Inserisci una nuova scheda SD per aumentare la memoria del dispositivo."</string>
+    <string name="ext_media_nomedia_notification_message">"Scheda SD rimossa. Inseriscine un\'altra."</string>
     <string name="activity_list_empty">"Nessuna attività corrispondente trovata"</string>
     <string name="permlab_pkgUsageStats">"aggiornare le statistiche di utilizzo dei componenti"</string>
     <string name="permdesc_pkgUsageStats">"Consente la modifica delle statistiche di utilizzo dei componenti raccolte. Da non usare per normali applicazioni."</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Esegui"</string>
     <string name="dial_number_using">"Componi numero"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Crea contatto"\n"utilizzando <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="accessibility_compound_button_selected">"selezionato"</string>
+    <string name="accessibility_compound_button_unselected">"non selezionato"</string>
 </resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index a2e3e51..618d16b 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -21,6 +21,8 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;新規&gt;"</string>
     <string name="ellipsis">"..."</string>
     <string name="emptyPhoneNumber">"(電話番号なし)"</string>
@@ -48,6 +50,18 @@
     <string name="BaMmi">"発信制限"</string>
     <string name="PwdMmi">"パスワードの変更"</string>
     <string name="PinMmi">"PINの変更"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
     <string name="CLIRDefaultOnNextCallOn">"既定: 発信者番号非通知、次の発信: 非通知"</string>
     <string name="CLIRDefaultOnNextCallOff">"既定: 発信者番号非通知、次の発信: 通知"</string>
     <string name="CLIRDefaultOffNextCallOn">"既定: 発信者番号通知、次の発信: 非通知"</string>
@@ -67,11 +81,43 @@
     <string name="serviceClassDataSync">"同期"</string>
     <string name="serviceClassPacket">"パケット"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:転送できません"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g> (<xliff:g id="TIME_DELAY">{2}</xliff:g>秒後)"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:転送できません"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:転送できません"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"ウェブページにエラーがあります。"</string>
     <string name="httpErrorLookup">"URLが見つかりません。"</string>
@@ -88,6 +134,8 @@
     <string name="httpErrorFile">"ファイルにアクセスできませんでした。"</string>
     <string name="httpErrorFileNotFound">"要求されたファイルが見つかりませんでした。"</string>
     <string name="httpErrorTooManyRequests">"処理中のリクエストが多すぎます。しばらくしてからもう一度試してください。"</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"同期"</string>
     <string name="contentServiceSyncNotificationTitle">"同期"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"<xliff:g id="CONTENT_TYPE">%s</xliff:g>での削除が多すぎます。"</string>
@@ -133,6 +181,10 @@
     <string name="permgroupdesc_systemTools">"システムの低レベルのアクセスと制御"</string>
     <string name="permgrouplab_developmentTools">"開発ツール"</string>
     <string name="permgroupdesc_developmentTools">"アプリケーションのデベロッパーにのみ必要な機能です。"</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
     <string name="permlab_statusBar">"ステータスバーの無効化や変更"</string>
     <string name="permdesc_statusBar">"ステータスバーの無効化やシステムアイコンの追加や削除をアプリケーションに許可します。"</string>
     <string name="permlab_expandStatusBar">"ステータスバーの拡大/縮小"</string>
@@ -145,9 +197,9 @@
     <string name="permdesc_receiveMms">"MMSメッセージの受信と処理をアプリケーションに許可します。悪意のあるアプリケーションがメッセージを監視したり、表示せずに削除する恐れがあります。"</string>
     <string name="permlab_sendSms">"SMSメッセージの送信"</string>
     <string name="permdesc_sendSms">"SMSメッセージの送信をアプリケーションに許可します。悪意のあるアプリケーションが確認なしでメッセージを送信し、料金が発生する恐れがあります。"</string>
-    <string name="permlab_readSms">"SMSやMMSの読み取り"</string>
+    <string name="permlab_readSms">"SMSの読み取り"</string>
     <string name="permdesc_readSms">"携帯電話やSIMカードに保存したSMSメッセージの読み取りをアプリケーションに許可します。悪意のあるアプリケーションが機密メッセージを読み取る恐れがあります。"</string>
-    <string name="permlab_writeSms">"SMSやMMSの編集"</string>
+    <string name="permlab_writeSms">"SMSの編集"</string>
     <string name="permdesc_writeSms">"携帯電話やSIMカードに保存したSMSメッセージへの書き込みをアプリケーションに許可します。悪意のあるアプリケーションがメッセージを削除する恐れがあります。"</string>
     <string name="permlab_receiveWapPush">"WAPの受信"</string>
     <string name="permdesc_receiveWapPush">"WAPメッセージの受信と処理をアプリケーションに許可します。悪意のあるアプリケーションがメッセージを監視したり、表示せずに削除する恐れがあります。"</string>
@@ -165,6 +217,14 @@
     <string name="permdesc_forceBack">"フォアグラウンドで実行されている操作を強制終了して戻ることをアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_dump">"システムの内部状態の取得"</string>
     <string name="permdesc_dump">"システムの内部状態の取得をアプリケーションに許可します。悪意のあるアプリケーションが、通常は必要としない広範囲にわたる非公開の機密情報を取得する恐れがあります。"</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher">"起動中のすべてのアプリケーションの監視と制御"</string>
     <string name="permdesc_runSetActivityWatcher">"システムが起動する操作の監視と制御をアプリケーションに許可します。悪意のあるアプリケーションがシステムを完全に破壊する恐れがあります。この許可は開発にのみ必要で、携帯電話の通常の使用にはまったく必要ありません。"</string>
     <string name="permlab_broadcastPackageRemoved">"パッケージ削除ブロードキャストの送信"</string>
@@ -179,6 +239,10 @@
     <string name="permdesc_setAlwaysFinish">"バックグラウンドになり次第必ず操作を終了させるかどうかの制御をアプリケーションに許可します。通常のアプリケーションではまったく必要ありません。"</string>
     <string name="permlab_batteryStats">"電池統計情報の変国"</string>
     <string name="permdesc_batteryStats">"収集した電池統計情報の変更を許可します。通常のアプリケーションでは使用しません。"</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
     <string name="permlab_internalSystemWindow">"未許可のウィンドウの表示"</string>
     <string name="permdesc_internalSystemWindow">"内部システムのユーザーインターフェースで使用するためのウィンドウ作成を許可します。通常のアプリケーションでは使用しません。"</string>
     <string name="permlab_systemAlertWindow">"システムレベルの警告の表示"</string>
@@ -243,8 +307,12 @@
     <string name="permdesc_writeCalendar">"端末に保存したカレンダーの予定の変更をアプリケーションに許可します。悪意のあるアプリケーションが、カレンダーデータを消去/変更する恐れがあります。"</string>
     <string name="permlab_accessMockLocation">"仮の位置情報でテスト"</string>
     <string name="permdesc_accessMockLocation">"テスト用に仮の位置情報源を作成します。これにより悪意のあるアプリケーションが、GPS、ネットワークプロバイダなどから返される本当の位置情報や状況を改ざんする恐れがあります。"</string>
-    <string name="permlab_accessLocationExtraCommands">"位置情報プロバイダのその他のコマンドへのアクセス"</string>
+    <string name="permlab_accessLocationExtraCommands">"位置情報提供者の追加コマンドアクセス"</string>
     <string name="permdesc_accessLocationExtraCommands">"位置情報提供元の追加コマンドにアクセスします。悪意のあるアプリケーションがGPSなどの位置提供の動作を妨害する恐れがあります。"</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
     <string name="permlab_accessFineLocation">"精細な位置情報(GPS)"</string>
     <string name="permdesc_accessFineLocation">"GPSなど携帯電話の位置情報にアクセスします(可能な場合)。今いる場所が悪意のあるアプリケーションに検出されたり、バッテリーの消費が増える恐れがあります。"</string>
     <string name="permlab_accessCoarseLocation">"おおよその位置情報(ネットワーク基地局)"</string>
@@ -317,6 +385,10 @@
     <string name="permdesc_accessWifiState">"Wi-Fi状態に関する情報の表示をアプリケーションに許可します。"</string>
     <string name="permlab_changeWifiState">"Wi-Fi状態の変更"</string>
     <string name="permdesc_changeWifiState">"Wi-Fiアクセスポイントへの接続や接続の切断、設定されたWi-Fiネットワークの変更をアプリケーションに許可します。"</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
     <string name="permlab_bluetoothAdmin">"Bluetoothの管理"</string>
     <string name="permdesc_bluetoothAdmin">"このBluetooth端末の設定、およびリモート端末を検出してペアに設定することをアプリケーションに許可します。"</string>
     <string name="permlab_bluetooth">"Bluetooth接続の作成"</string>
@@ -337,6 +409,10 @@
     <string name="permdesc_readDictionary">"アプリケーションがユーザー辞書に登録されている個人的な語句や名前を読み込むことを許可します。"</string>
     <string name="permlab_writeDictionary">"ユーザー定義辞書への書き込み"</string>
     <string name="permdesc_writeDictionary">"アプリケーションがユーザー辞書に新しい語句を書き込むことを許可します。"</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
     <item>"自宅"</item>
     <item>"携帯"</item>
@@ -353,6 +429,7 @@
     <item>"その他"</item>
     <item>"カスタム"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"携帯"</string>
   <string-array name="postalAddressTypes">
     <item>"自宅"</item>
     <item>"仕事"</item>
@@ -386,13 +463,15 @@
     <string name="emergency_call_dialog_number_for_display">"緊急通報番号"</string>
     <string name="lockscreen_carrier_default">"(通信サービスなし)"</string>
     <string name="lockscreen_screen_locked">"画面ロック中"</string>
-    <string name="lockscreen_instructions_when_pattern_enabled">"MENUキーでロック解除(または緊急通報)"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"MENUキーでロック解除(または緊急通報)"</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"MENUキーでロック解除"</string>
     <string name="lockscreen_pattern_instructions">"ロックを解除するパターンを入力"</string>
     <string name="lockscreen_emergency_call">"緊急通報"</string>
     <string name="lockscreen_pattern_correct">"一致しました"</string>
     <string name="lockscreen_pattern_wrong">"やり直してください"</string>
     <string name="lockscreen_plugged_in">"充電中(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"充電してください。"</string>
     <string name="lockscreen_missing_sim_message_short">"SIMカードが挿入されていません"</string>
     <string name="lockscreen_missing_sim_message">"SIMカードが挿入されていません"</string>
@@ -414,15 +493,18 @@
     <string name="lockscreen_glogin_invalid_input">"ユーザー名またはパスワードが正しくありません。"</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"通知を消去"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"通知なし"</string>
-    <string name="status_bar_ongoing_events_title">"操作中"</string>
+    <string name="status_bar_ongoing_events_title">"実行中"</string>
     <string name="status_bar_latest_events_title">"通知"</string>
     <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="battery_status_charging">"充電中..."</string>
     <string name="battery_low_title">"充電してください"</string>
     <string name="battery_low_subtitle">"電池が残り少なくなっています:"</string>
     <string name="battery_low_percent_format">"残量<xliff:g id="NUMBER">%d%%</xliff:g>以下"</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"出荷時試験が失敗"</string>
     <string name="factorytest_not_system">"FACTORY_TEST操作は、/system/appにインストールされたパッケージのみが対象です。"</string>
     <string name="factorytest_no_action">"FACTORY_TEST操作を行うパッケージは見つかりませんでした。"</string>
@@ -431,6 +513,14 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"このページから移動しますか?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"移動する場合は[OK]、今のページに残る場合は[キャンセル]を選択してください。"</string>
     <string name="save_password_label">"確認"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
     <string name="save_password_message">"このパスワードをブラウザで保存しますか?"</string>
     <string name="save_password_notnow">"今は保存しない"</string>
     <string name="save_password_remember">"保存"</string>
@@ -538,10 +628,6 @@
     <string name="Noon">"正午"</string>
     <string name="midnight">"午前0時"</string>
     <string name="Midnight">"午前0時"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"すべて選択"</string>
@@ -579,18 +665,20 @@
     <string name="anr_application_process">"<xliff:g id="APPLICATION">%1$s</xliff:g>(<xliff:g id="PROCESS">%2$s</xliff:g>)は応答していません。"</string>
     <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g>は応答していません。"</string>
     <string name="force_close">"強制終了"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
     <string name="wait">"待機"</string>
     <string name="debug">"デバッグ"</string>
     <string name="sendText">"アプリケーションを選択"</string>
     <string name="volume_ringtone">"着信音量"</string>
     <string name="volume_music">"メディアの音量"</string>
     <string name="volume_music_hint_playing_through_bluetooth">"Bluetooth経由で再生中です"</string>
-    <string name="volume_call">"着信音量"</string>
+    <string name="volume_call">"通話音量"</string>
     <string name="volume_bluetooth_call">"Bluetooth着信音量"</string>
     <string name="volume_alarm">"アラームの音量"</string>
     <string name="volume_notification">"通知音量"</string>
     <string name="volume_unknown">"音量"</string>
-    <string name="ringtone_default">"デフォルトの着信音"</string>
+    <string name="ringtone_default">"プリセット着信音"</string>
     <string name="ringtone_default_with_actual">"端末の基本着信音(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"サイレント"</string>
     <string name="ringtone_picker_title">"着信音"</string>
@@ -632,22 +720,31 @@
     <string name="extmedia_format_title">"SDカードをフォーマット"</string>
     <string name="extmedia_format_message">"SDカードをフォーマットしてもよろしいですか?カード内のすべてのデータが失われます。"</string>
     <string name="extmedia_format_button_format">"フォーマット"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"入力方法の選択"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"候補"</u></string>
     <string name="ext_media_checking_notification_title">"SDカードの準備中"</string>
-    <string name="ext_media_checking_notification_message">"エラーを確認中"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"空のSDカード"</string>
-    <string name="ext_media_nofs_notification_message">"SDカードが空か、サポート対象外のファイルシステムを使用しています。"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"破損したSDカード"</string>
-    <string name="ext_media_unmountable_notification_message">"SDカードが破損しています。カードのフォーマットが必要な可能性があります。"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"SDカードが予期せず取り外されました"</string>
     <string name="ext_media_badremoval_notification_message">"データの喪失を防ぐためSDカードを取り外す前にマウントを解除してください。"</string>
     <string name="ext_media_safe_unmount_notification_title">"SDカードを安全に取り外しました"</string>
-    <string name="ext_media_safe_unmount_notification_message">"SDカードを安全に取り外せます。"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
     <string name="ext_media_nomedia_notification_title">"SDカードが取り外されています"</string>
-    <string name="ext_media_nomedia_notification_message">"SDカードが取り外されました。新しいSDカードを挿入して端末のメモリを増やしてください。"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"一致するアクティビティが見つかりません"</string>
     <string name="permlab_pkgUsageStats">"コンポーネント使用状況に関する統計情報の更新"</string>
     <string name="permdesc_pkgUsageStats">"収集されたコンポーネント使用状況に関する統計情報の変更を許可します。通常のアプリケーションでは使用しません。"</string>
@@ -661,4 +758,8 @@
     <string name="ime_action_default">"実行"</string>
     <string name="dial_number_using">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"発信"</string>
     <string name="create_contact_using">"<xliff:g id="NUMBER">%s</xliff:g>を使って"\n"連絡先を新規登録"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index e2c6e57..d60ebaa 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -21,6 +21,8 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;제목없음&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(전화번호 없음)"</string>
@@ -28,17 +30,17 @@
     <string name="defaultVoiceMailAlphaTag">"음성메일"</string>
     <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
     <string name="mmiError">"연결에 문제가 있거나 MMI 코드가 잘못되었습니다."</string>
-    <string name="serviceEnabled">"서비스가 활성화되었습니다."</string>
+    <string name="serviceEnabled">"서비스를 사용하도록 설정했습니다."</string>
     <string name="serviceEnabledFor">"사용 설정된 서비스 목록:"</string>
-    <string name="serviceDisabled">"서비스가 비활성화되었습니다."</string>
+    <string name="serviceDisabled">"서비스가 사용 중지되었습니다."</string>
     <string name="serviceRegistered">"등록이 완료되었습니다."</string>
-    <string name="serviceErased">"지웠습니다."</string>
+    <string name="serviceErased">"삭제했습니다."</string>
     <string name="passwordIncorrect">"비밀번호가 잘못되었습니다."</string>
     <string name="mmiComplete">"MMI 완료"</string>
     <string name="badPin">"이전 PIN이 올바르지 않습니다."</string>
     <string name="badPuk">"입력한 PUK가 올바르지 않습니다."</string>
     <string name="mismatchPin">"입력한 PIN이 일치하지 않습니다."</string>
-    <string name="invalidPin">"4~8자리 숫자로 된 PIN을 입력하세요."</string>
+    <string name="invalidPin">"4~ 8자리 숫자로 된 PIN을 입력하세요."</string>
     <string name="needPuk">"SIM 카드의 PUK가 잠겨 있습니다. 잠금해제하려면 PUK 코드를 입력하세요."</string>
     <string name="needPuk2">"SIM 카드 잠금을 해제하려면 PUK2를 입력하세요."</string>
     <string name="ClipMmi">"수신 발신자 번호"</string>
@@ -48,6 +50,18 @@
     <string name="BaMmi">"착발신 제한"</string>
     <string name="PwdMmi">"비밀번호 변경"</string>
     <string name="PinMmi">"PIN 변경"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
     <string name="CLIRDefaultOnNextCallOn">"발신자 번호가 기본적으로 제한됨으로 설정됩니다. 다음 통화: 제한됨"</string>
     <string name="CLIRDefaultOnNextCallOff">"발신자 번호가 기본적으로 제한됨으로 설정됩니다. 다음 통화: 제한되지 않음"</string>
     <string name="CLIRDefaultOffNextCallOn">"발신자 번호가 기본적으로 제한되지 않음으로 설정됩니다. 다음 통화: 제한됨"</string>
@@ -56,7 +70,7 @@
     <string name="CLIRPermanent">"발신자 번호 설정을 변경할 수 없습니다."</string>
     <string name="RestrictedChangedTitle">"제한된 액세스가 변경되었습니다."</string>
     <string name="RestrictedOnData">"데이터 서비스가 차단되었습니다."</string>
-    <string name="RestrictedOnEmergency">"응급 서비스가 차단되었습니다."</string>
+    <string name="RestrictedOnEmergency">"긴급 서비스가 차단되었습니다."</string>
     <string name="RestrictedOnNormal">"음성/SMS 서비스가 차단되었습니다."</string>
     <string name="RestrictedOnAll">"모든 음성/SMS 서비스가 차단되었습니다."</string>
     <string name="serviceClassVoice">"음성"</string>
@@ -67,11 +81,43 @@
     <string name="serviceClassDataSync">"동기화"</string>
     <string name="serviceClassPacket">"패킷"</string>
     <string name="serviceClassPAD">"PAD"</string>
-    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안 됨"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안됨"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g>초 후 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안 됨"</string>
-    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안 됨"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g><xliff:g id="TIME_DELAY">{2}</xliff:g>초 후"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안됨"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: 착신전환 안됨"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"확인"</string>
     <string name="httpError">"웹페이지에 오류가 있습니다."</string>
     <string name="httpErrorLookup">"URL을 찾을 수 없습니다."</string>
@@ -79,7 +125,7 @@
     <string name="httpErrorAuth">"인증에 실패했습니다."</string>
     <string name="httpErrorProxyAuth">"프록시 서버를 통한 인증에 실패했습니다."</string>
     <string name="httpErrorConnect">"서버에 연결하지 못했습니다."</string>
-    <string name="httpErrorIO">"서버와 통신할 수 없습니다. 나중에 다시 시도하세요."</string>
+    <string name="httpErrorIO">"서버와 통신할 수 없습니다. 잠시 후에 다시 시도해 주세요."</string>
     <string name="httpErrorTimeout">"서버 연결 제한시간이 초과되었습니다."</string>
     <string name="httpErrorRedirectLoop">"페이지에 서버 리디렉션이 너무 많이 포함되어 있습니다."</string>
     <string name="httpErrorUnsupportedScheme">"지원되지 않는 프로토콜입니다."</string>
@@ -87,288 +133,319 @@
     <string name="httpErrorBadUrl">"URL이 올바르지 않아 페이지를 열 수 없습니다."</string>
     <string name="httpErrorFile">"파일에 액세스할 수 없습니다."</string>
     <string name="httpErrorFileNotFound">"요청한 파일을 찾을 수 없습니다."</string>
-    <string name="httpErrorTooManyRequests">"처리 중인 요청이 너무 많습니다. 잠시 후에 다시 시도하세요."</string>
+    <string name="httpErrorTooManyRequests">"처리 중인 요청이 너무 많습니다. 잠시 후에 다시 시도해 주세요."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"동기화"</string>
     <string name="contentServiceSyncNotificationTitle">"동기화"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"<xliff:g id="CONTENT_TYPE">%s</xliff:g> 삭제가 너무 많습니다."</string>
-    <string name="low_memory">"전화기 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
+    <string name="low_memory">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string>
     <string name="me">"나"</string>
-    <string name="power_dialog">"전화기 옵션"</string>
+    <string name="power_dialog">"휴대전화 옵션"</string>
     <string name="silent_mode">"무음 모드"</string>
-    <string name="turn_on_radio">"무선 켜기"</string>
+    <string name="turn_on_radio">"무선 사용"</string>
     <string name="turn_off_radio">"무선 끄기"</string>
     <string name="screen_lock">"화면 잠금"</string>
     <string name="power_off">"끄기"</string>
     <string name="shutdown_progress">"종료 중..."</string>
-    <string name="shutdown_confirm">"전화기가 종료됩니다."</string>
+    <string name="shutdown_confirm">"휴대전화가 종료됩니다."</string>
     <string name="no_recent_tasks">"최신 응용프로그램이 아닙니다."</string>
-    <string name="global_actions">"전화기 옵션"</string>
+    <string name="global_actions">"휴대전화 옵션"</string>
     <string name="global_action_lock">"화면 잠금"</string>
     <string name="global_action_power_off">"끄기"</string>
     <string name="global_action_toggle_silent_mode">"무음 모드"</string>
     <string name="global_action_silent_mode_on_status">"소리 꺼짐"</string>
     <string name="global_action_silent_mode_off_status">"소리 켜짐"</string>
-    <string name="global_actions_toggle_airplane_mode">"비행기 모드"</string>
-    <string name="global_actions_airplane_mode_on_status">"비행기 모드 사용 안함"</string>
-    <string name="global_actions_airplane_mode_off_status">"비행기 모드 사용"</string>
+    <string name="global_actions_toggle_airplane_mode">"비행 모드"</string>
+    <string name="global_actions_airplane_mode_on_status">"비행 모드 사용"</string>
+    <string name="global_actions_airplane_mode_off_status">"비행 모드 사용 안함"</string>
     <string name="safeMode">"안전 모드"</string>
     <string name="android_system_label">"Android 시스템"</string>
     <string name="permgrouplab_costMoney">"요금이 부과되는 서비스"</string>
-    <string name="permgroupdesc_costMoney">"응용프로그램이 요금이 부과될 수 있는 작업을 할 수 있습니다."</string>
+    <string name="permgroupdesc_costMoney">"응용프로그램이 요금이 부과될 수 있는 작업을 할 수 있도록 합니다."</string>
     <string name="permgrouplab_messages">"메시지"</string>
     <string name="permgroupdesc_messages">"SMS, 이메일 및 기타 메시지를 읽고 씁니다."</string>
-    <string name="permgrouplab_personalInfo">"개인 정보"</string>
-    <string name="permgroupdesc_personalInfo">"전화기에 저장된 연락처 및 캘린더에 직접 액세스합니다."</string>
+    <string name="permgrouplab_personalInfo">"개인정보"</string>
+    <string name="permgroupdesc_personalInfo">"휴대전화에 저장된 주소록 및 캘린더에 직접 액세스합니다."</string>
     <string name="permgrouplab_location">"위치"</string>
-    <string name="permgroupdesc_location">"물리적 위치 모니터링"</string>
+    <string name="permgroupdesc_location">"실제 위치 모니터링"</string>
     <string name="permgrouplab_network">"네트워크 통신"</string>
-    <string name="permgroupdesc_network">"응용프로그램이 다양한 네트워크 기능에 액세스할 수 있습니다."</string>
+    <string name="permgroupdesc_network">"응용프로그램이 다양한 네트워크 기능에 액세스할 수 있도록 합니다."</string>
     <string name="permgrouplab_accounts">"Google 계정"</string>
-    <string name="permgroupdesc_accounts">"사용가능한 Google 계정에 액세스합니다."</string>
+    <string name="permgroupdesc_accounts">"사용 가능한 Google 계정에 액세스합니다."</string>
     <string name="permgrouplab_hardwareControls">"하드웨어 제어"</string>
-    <string name="permgroupdesc_hardwareControls">"핸드셋의 하드웨어에 직접 액세스합니다."</string>
+    <string name="permgroupdesc_hardwareControls">"휴대전화의 하드웨어에 직접 액세스합니다."</string>
     <string name="permgrouplab_phoneCalls">"전화 통화"</string>
     <string name="permgroupdesc_phoneCalls">"전화 통화를 모니터링, 기록 및 처리합니다."</string>
     <string name="permgrouplab_systemTools">"시스템 도구"</string>
-    <string name="permgroupdesc_systemTools">"하위 수준의 액세스 및 시스템 제어"</string>
-    <string name="permgrouplab_developmentTools">"개발도구"</string>
+    <string name="permgroupdesc_systemTools">"시스템을 하위 수준에서 액세스하고 제어합니다."</string>
+    <string name="permgrouplab_developmentTools">"개발 도구"</string>
     <string name="permgroupdesc_developmentTools">"응용프로그램 개발자에게만 필요한 기능입니다."</string>
-    <string name="permlab_statusBar">"상태 표시줄 사용 안 함 또는 수정"</string>
-    <string name="permdesc_statusBar">"응용프로그램이 상태 표시줄을 비활성화하거나 시스템 아이콘을 추가 및 제거할 수 있습니다."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"상태 표시줄 사용 중지 또는 수정"</string>
+    <string name="permdesc_statusBar">"응용프로그램이 상태 표시줄을 사용 중지하거나 시스템 아이콘을 추가 및 제거할 수 있도록 합니다."</string>
     <string name="permlab_expandStatusBar">"상태 표시줄 확장/축소"</string>
-    <string name="permdesc_expandStatusBar">"응용프로그램이 상태 표시줄을 확장하거나 축소할 수 있습니다."</string>
+    <string name="permdesc_expandStatusBar">"응용프로그램이 상태 표시줄을 확장하거나 축소할 수 있도록 합니다."</string>
     <string name="permlab_processOutgoingCalls">"발신전화 가로채기"</string>
-    <string name="permdesc_processOutgoingCalls">"응용프로그램이 발신전화를 처리하고 전화를 걸 번호를 변경할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 발신전화를 모니터링하거나, 다른 방향으로 돌리거나, 중단시킬 수 있습니다."</string>
-    <string name="permlab_receiveSms">"SMS 받기"</string>
-    <string name="permdesc_receiveSms">"응용프로그램이 SMS 메시지를 받고 처리할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
-    <string name="permlab_receiveMms">"MMS 받기"</string>
-    <string name="permdesc_receiveMms">"응용프로그램이 MMS 메시지를 받고 처리할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
+    <string name="permdesc_processOutgoingCalls">"응용프로그램이 발신전화를 처리하고 전화를 걸 번호를 변경할 수 있도록 합니다. 이 경우 악성 응용프로그램이 발신전화를 모니터링하거나, 다른 방향으로 돌리거나, 중단시킬 수 있습니다."</string>
+    <string name="permlab_receiveSms">"SMS 수신"</string>
+    <string name="permdesc_receiveSms">"응용프로그램이 SMS 메시지를 받고 처리할 수 있도록 합니다. 이 경우 악성 응용프로그램이 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
+    <string name="permlab_receiveMms">"MMS 수신"</string>
+    <string name="permdesc_receiveMms">"응용프로그램이 MMS 메시지를 받고 처리할 수 있도록 합니다. 이 경우 악성 응용프로그램이 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
     <string name="permlab_sendSms">"SMS 메시지 보내기"</string>
-    <string name="permdesc_sendSms">"응용프로그램이 SMS 메시지를 보낼 수 있습니다. 악성 응용프로그램은 사용자의 확인 없이 메시지를 전송하여 요금을 부과할 수 있습니다."</string>
+    <string name="permdesc_sendSms">"응용프로그램이 SMS 메시지를 보낼 수 있도록 합니다. 이 경우 악성 응용프로그램이 사용자의 확인 없이 메시지를 전송하여 요금을 부과할 수 있습니다."</string>
     <string name="permlab_readSms">"SMS 또는 MMS 읽기"</string>
-    <string name="permdesc_readSms">"응용프로그램이 전화기 또는 SIM 카드에 저장된 SMS 메시지를 읽을 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 기밀 메시지를 읽을 수 있습니다."</string>
+    <string name="permdesc_readSms">"응용프로그램이 휴대전화 또는 SIM 카드에 저장된 SMS 메시지를 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 기밀 메시지를 읽을 수 있습니다."</string>
     <string name="permlab_writeSms">"SMS 또는 MMS 편집"</string>
-    <string name="permdesc_writeSms">"응용프로그램이 전화기 또는 SIM 카드에 저장된 SMS 메시지에 쓸 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 메시지를 삭제할 수 있습니다."</string>
-    <string name="permlab_receiveWapPush">"WAP 받기"</string>
-    <string name="permdesc_receiveWapPush">"응용프로그램이 WAP 메시지를 받고 처리할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
+    <string name="permdesc_writeSms">"응용프로그램이 휴대전화 또는 SIM 카드에 저장된 SMS 메시지에 쓸 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 메시지를 삭제할 수 있습니다."</string>
+    <string name="permlab_receiveWapPush">"WAP 수신"</string>
+    <string name="permdesc_receiveWapPush">"응용프로그램이 WAP 메시지를 받고 처리할 수 있도록 합니다. 이 경우 악성 응용프로그램이 메시지를 모니터링하거나 사용자가 보기 전에 삭제할 수 있습니다."</string>
     <string name="permlab_getTasks">"실행 중인 응용프로그램 검색"</string>
-    <string name="permdesc_getTasks">"응용프로그램이 현재 실행 중이거나 최근에 실행된 작업에 대한 정보를 검색할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 다른 응용프로그램에 대한 개인 정보를 검색할 수 있습니다."</string>
+    <string name="permdesc_getTasks">"응용프로그램이 현재 실행 중이거나 최근에 실행된 작업에 대한 정보를 검색할 수 있도록 합니다. 이 경우 악성 응용프로그램이 다른 응용프로그램에 대한 개인 정보를 검색할 수 있습니다."</string>
     <string name="permlab_reorderTasks">"실행 중인 응용프로그램 순서 재지정"</string>
-    <string name="permdesc_reorderTasks">"응용프로그램이 작업을 포그라운드나 백그라운드로 이동할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 사용자의 조작 없이 작업을 강제로 앞으로 이동할 수 있습니다."</string>
+    <string name="permdesc_reorderTasks">"응용프로그램이 작업을 포그라운드나 백그라운드로 이동할 수 있도록 합니다. 이 경우 악성 응용프로그램이 사용자의 조작 없이 앞으로 이동할 수 있습니다."</string>
     <string name="permlab_setDebugApp">"응용프로그램 디버깅 사용"</string>
-    <string name="permdesc_setDebugApp">"응용프로그램이 다른 응용프로그램에 대한 디버깅을 설정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 다른 응용프로그램을 중지시킬 수 있습니다."</string>
+    <string name="permdesc_setDebugApp">"응용프로그램이 다른 응용프로그램에 대해 디버깅을 사용할 수 있도록 합니다. 이 경우 악성 응용프로그램이 다른 응용프로그램을 중지시킬 수 있습니다."</string>
     <string name="permlab_changeConfiguration">"UI 설정 변경"</string>
-    <string name="permdesc_changeConfiguration">"응용프로그램이 로케일 또는 전체 글꼴 크기 같은 현재 구성을 변경할 수 있습니다."</string>
+    <string name="permdesc_changeConfiguration">"응용프로그램이 로케일 또는 전체 글꼴 크기와 같은 현재 구성을 변경할 수 있도록 합니다."</string>
     <string name="permlab_restartPackages">"다른 응용프로그램 다시 시작"</string>
-    <string name="permdesc_restartPackages">"응용프로그램이 다른 응용프로그램을 강제로 다시 시작할 수 있습니다."</string>
+    <string name="permdesc_restartPackages">"응용프로그램이 다른 응용프로그램을 강제로 다시 시작할 수 있도록 합니다."</string>
     <string name="permlab_forceBack">"강제로 응용프로그램 닫기"</string>
-    <string name="permdesc_forceBack">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫을 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_forceBack">"응용프로그램이 포그라운드에 있는 활동을 강제로 닫고 되돌아갈 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_dump">"시스템 내부 상태 검색"</string>
-    <string name="permdesc_dump">"응용프로그램이 시스템의 내부 상태를 검색할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 일반적으로 필요하지 않은 다양한 개인 정보와 보안 정보를 검색할 수 있습니다."</string>
+    <string name="permdesc_dump">"응용프로그램이 시스템의 내부 상태를 검색할 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 일반적으로 필요하지 않은 다양한 개인정보와 보안정보를 검색할 수 있습니다."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher">"실행 중인 모든 응용프로그램 모니터링 및 제어"</string>
-    <string name="permdesc_runSetActivityWatcher">"응용프로그램이 시스템에서 활동이 시작되는 방식을 모니터링하고 제어할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 시스템을 완전히 손상시킬 수 있습니다. 이 권한은 개발 과정에만 필요하며 일반 전화기 사용 시에는 필요하지 않습니다."</string>
+    <string name="permdesc_runSetActivityWatcher">"응용프로그램이 시스템에서 활동이 시작되는 방식을 모니터링하고 제어할 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 시스템을 완전히 손상시킬 수 있습니다. 이 권한은 개발 과정에만 필요하며 일반 휴대전화 사용 시에는 필요하지 않습니다."</string>
     <string name="permlab_broadcastPackageRemoved">"패키지 제거 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastPackageRemoved">"응용프로그램이 응용프로그램 패키지가 제거되었다는 알림을 브로드캐스트할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 실행 중인 다른 응용프로그램을 중지시킬 수 있습니다."</string>
+    <string name="permdesc_broadcastPackageRemoved">"응용프로그램이 응용프로그램 패키지가 삭제되었다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 실행 중인 다른 응용프로그램을 중지시킬 수 있습니다."</string>
     <string name="permlab_broadcastSmsReceived">"SMS 수신 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastSmsReceived">"응용프로그램이 SMS 메시지를 받았다는 알림을 브로드캐스트할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 들어오는 SMS 메시지처럼 위장할 수 있습니다."</string>
+    <string name="permdesc_broadcastSmsReceived">"응용프로그램이 SMS 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 들어오는 SMS 메시지처럼 위장할 수 있습니다."</string>
     <string name="permlab_broadcastWapPush">"WAP-PUSH-수신 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastWapPush">"응용프로그램이 WAP PUSH 메시지를 받았다는 알림을 브로드캐스트할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 MMS 메시지를 받은 것처럼 위장하거나 웹페이지의 콘텐츠를 악성 변종으로 바꿀 수 있습니다."</string>
+    <string name="permdesc_broadcastWapPush">"응용프로그램이 WAP PUSH 메시지를 받았다는 알림을 브로드캐스트할 수 있도록 합니다. 이 경우 악성 응용프로그램이 MMS 메시지를 받은 것처럼 위장하거나 웹페이지의 콘텐츠를 악성 변종으로 몰래 바꿀 수 있습니다."</string>
     <string name="permlab_setProcessLimit">"실행 중인 프로세스 수 제한"</string>
-    <string name="permdesc_setProcessLimit">"응용프로그램이 실행할 최대 프로세스 수를 제어할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_setProcessLimit">"응용프로그램이 실행할 최대 프로세스 수를 제어할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_setAlwaysFinish">"모든 백그라운드 응용프로그램이 닫히도록 하기"</string>
-    <string name="permdesc_setAlwaysFinish">"응용프로그램이 백그라운드로 이동한 활동을 항상 바로 마칠지 여부를 제어할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_setAlwaysFinish">"응용프로그램이 백그라운드로 이동한 활동을 항상 바로 종료할지 여부를 제어할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_batteryStats">"배터리 통계 수정"</string>
-    <string name="permdesc_batteryStats">"수집된 배터리 통계를 수정할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_batteryStats">"수집된 배터리 통계를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용할 수 없습니다."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
     <string name="permlab_internalSystemWindow">"인증되지 않은 창 표시"</string>
-    <string name="permdesc_internalSystemWindow">"내부 시스템 사용자 인터페이스에서 사용하는 창을 만들 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_internalSystemWindow">"내부 시스템 사용자 인터페이스에서 사용하는 창을 만들 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_systemAlertWindow">"시스템 수준 경고 표시"</string>
-    <string name="permdesc_systemAlertWindow">"응용프로그램이 시스템 경고 창을 표시할 수 있습니다. 악성 응용프로그램은 전화기 화면 전체를 차지할 수 있습니다."</string>
+    <string name="permdesc_systemAlertWindow">"응용프로그램이 시스템 경고 창을 표시할 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화 화면 전체를 차지할 수 있습니다."</string>
     <string name="permlab_setAnimationScale">"전체 애니메이션 속도 수정"</string>
-    <string name="permdesc_setAnimationScale">"응용프로그램이 언제든지 전체 애니메이션 속도를 빠르게 또는 느리게 변경할 수 있습니다."</string>
+    <string name="permdesc_setAnimationScale">"응용프로그램이 언제든지 전체 애니메이션 속도를 빠르게 또는 느리게 변경할 수 있도록 합니다."</string>
     <string name="permlab_manageAppTokens">"응용프로그램 토큰 관리"</string>
-    <string name="permdesc_manageAppTokens">"응용프로그램이 일반적인 Z-순서를 무시하여 자체 토큰을 만들고 관리할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_manageAppTokens">"응용프로그램이 일반적인 Z-순서를 무시하여 자체 토큰을 만들고 관리할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_injectEvents">"키 및 컨트롤 버튼 누르기"</string>
-    <string name="permdesc_injectEvents">"응용프로그램이 입력 이벤트(예: 키 누름)를 다른 응용프로그램에 전달할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 전화기를 완전히 제어할 수 있습니다."</string>
+    <string name="permdesc_injectEvents">"응용프로그램이 입력 이벤트(예: 키 누름)를 다른 응용프로그램에 전달할 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화를 완전히 제어할 수 있습니다."</string>
     <string name="permlab_readInputState">"사용자가 입력한 내용 및 수행한 작업 기록"</string>
-    <string name="permdesc_readInputState">"응용프로그램이 다른 응용프로그램과 상호작용할 때에도 사용자가 누르는 키(예: 비밀번호 입력)를 볼 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
-    <string name="permlab_bindInputMethod">"입력 방법에 고정"</string>
-    <string name="permdesc_bindInputMethod">"보유자가 입력 방법의 최상위 인터페이스에 고정할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_readInputState">"응용프로그램이 다른 응용프로그램과 상호작용할 때에도 사용자가 누르는 키(예: 비밀번호 입력)를 볼 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permlab_bindInputMethod">"입력 방법 고정"</string>
+    <string name="permdesc_bindInputMethod">"보유자가 입력 방법의 최상위 인터페이스만 사용하도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_setOrientation">"화면 방향 변경"</string>
-    <string name="permdesc_setOrientation">"응용프로그램이 언제든지 화면 회전을 변경할 수 있습니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
+    <string name="permdesc_setOrientation">"응용프로그램이 언제든지 화면 회전을 변경할 수 있도록 합니다. 일반 응용프로그램에는 필요하지 않습니다."</string>
     <string name="permlab_signalPersistentProcesses">"응용프로그램에 Linux 신호 보내기"</string>
-    <string name="permdesc_signalPersistentProcesses">"응용프로그램이 제공된 신호를 모든 영구 프로세스로 보내도록 요청할 수 있습니다."</string>
+    <string name="permdesc_signalPersistentProcesses">"응용프로그램이 제공된 신호를 모든 영구 프로세스로 보내도록 요청할 수 있도록 합니다."</string>
     <string name="permlab_persistentActivity">"응용프로그램이 항상 실행되도록 설정"</string>
-    <string name="permdesc_persistentActivity">"응용프로그램이 연결된 일부 구성요소를 지속하여 다른 응용프로그램에 사용할 수 없도록 합니다."</string>
+    <string name="permdesc_persistentActivity">"응용프로그램이 연결된 일부 구성 요소를 지속하여 다른 응용프로그램에 사용할 수 없도록 합니다."</string>
     <string name="permlab_deletePackages">"응용프로그램 삭제"</string>
-    <string name="permdesc_deletePackages">"응용프로그램이 Android 패키지를 삭제할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 중요한 응용프로그램을 삭제할 수 있습니다."</string>
+    <string name="permdesc_deletePackages">"응용프로그램이 Android 패키지를 삭제할 수 있도록 합니다. 이 경우 악성 응용프로그램이 중요한 응용프로그램을 삭제할 수 있습니다."</string>
     <string name="permlab_clearAppUserData">"다른 응용프로그램의 데이터 삭제"</string>
-    <string name="permdesc_clearAppUserData">"응용프로그램이 사용자 데이터를 지울 수 있습니다."</string>
+    <string name="permdesc_clearAppUserData">"응용프로그램이 사용자 데이터를 지울 수 있도록 합니다."</string>
     <string name="permlab_deleteCacheFiles">"다른 응용프로그램의 캐시 삭제"</string>
-    <string name="permdesc_deleteCacheFiles">"응용프로그램이 캐시 파일을 삭제할 수 있습니다."</string>
+    <string name="permdesc_deleteCacheFiles">"응용프로그램이 캐시 파일을 삭제할 수 있도록 합니다."</string>
     <string name="permlab_getPackageSize">"응용프로그램 저장공간 계산"</string>
-    <string name="permdesc_getPackageSize">"응용프로그램이 해당 코드, 데이터 및 캐시 크기를 검색할 수 있습니다."</string>
+    <string name="permdesc_getPackageSize">"응용프로그램이 해당 코드, 데이터 및 캐시 크기를 검색할 수 있도록 합니다."</string>
     <string name="permlab_installPackages">"응용프로그램 직접 설치"</string>
-    <string name="permdesc_installPackages">"응용프로그램이 새로운 또는 업데이트된 Android 패키지를 설치할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 임의의 강력한 권한으로 새 응용프로그램을 추가할 수 있습니다."</string>
+    <string name="permdesc_installPackages">"응용프로그램이 새로운 또는 업데이트된 Android 패키지를 설치할 수 있도록 합니다. 이 경우 악성 응용프로그램이 임의의 강력한 권한으로 새 응용프로그램을 추가할 수 있습니다."</string>
     <string name="permlab_clearAppCache">"모든 응용프로그램 캐시 데이터 삭제"</string>
-    <string name="permdesc_clearAppCache">"응용프로그램이 응용프로그램 캐시 디렉토리에 있는 파일을 삭제하여 전화기의 저장공간을 늘릴 수 있습니다. 액세스는 일반적으로 시스템 프로세스로 제한됩니다."</string>
+    <string name="permdesc_clearAppCache">"응용프로그램이 응용프로그램 캐시 디렉토리에 있는 파일을 삭제하여 휴대전화의 저장공간을 늘릴 수 있도록 합니다. 액세스는 일반적으로 시스템 프로세스로 제한됩니다."</string>
     <string name="permlab_readLogs">"시스템 로그 파일 읽기"</string>
-    <string name="permdesc_readLogs">"응용프로그램이 시스템의 다양한 로그 파일을 읽을 수 있습니다. 이 경우 응용프로그램은 사용자가 전화기로 수행하는 작업에 대한 일반적인 정보를 검색할 수 있지만 여기에 개인 정보는 포함되어서는 안 됩니다."</string>
+    <string name="permdesc_readLogs">"응용프로그램이 시스템의 다양한 로그 파일을 읽을 수 있도록 합니다. 이 경우 응용프로그램은 사용자가 휴대전화로 수행하는 작업에 대한 일반적인 정보를 검색할 수 있지만 여기에 개인정보는 포함되어서는 안 됩니다."</string>
     <string name="permlab_diagnostic">"진단 그룹 소유의 리소스 읽기/작성"</string>
-    <string name="permdesc_diagnostic">"응용프로그램이 진단 그룹 소유의 리소스(예: /dev에 있는 파일)를 읽고 쓸 수 있습니다. 이 기능은 시스템 안정성 및 보안에 영향을 미칠 수 있으므로, 제조업체 또는 사업자가 하드웨어 관련 진단을 수행하는 경우에만 사용해야 합니다."</string>
-    <string name="permlab_changeComponentState">"응용프로그램 구성요소 사용 또는 사용 안 함"</string>
-    <string name="permdesc_changeComponentState">"응용프로그램이 다른 응용프로그램 구성요소의 사용 여부를 변경할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 중요한 전화기 기능을 사용하지 않도록 설정할 수 있습니다. 응용프로그램 구성요소가 쓸모없게 되거나, 일관성이 없어지거나, 불안정해질 수 있으므로 이 권한을 설정할 때는 주의해야 합니다."</string>
+    <string name="permdesc_diagnostic">"응용프로그램이 진단 그룹 소유의 리소스(예: /dev에 있는 파일)를 읽고 쓸 수 있도록 합니다. 이 기능은 시스템 안정성 및 보안에 영향을 미칠 수 있으므로 제조업체 또는 사업자가 하드웨어 관련 진단을 수행하는 경우에만 사용해야 합니다."</string>
+    <string name="permlab_changeComponentState">"응용프로그램 구성 요소 사용 또는 사용 안함"</string>
+    <string name="permdesc_changeComponentState">"응용프로그램이 다른 응용프로그램 구성 요소 사용 여부를 변경할 수 있도록 합니다. 이 경우 악성 응용프로그램이 중요한 휴대전화 기능을 사용하지 않도록 설정할 수 있습니다. 이 권한을 설정할 경우 응용프로그램 구성 요소가 사용 불가능하게 되거나 일관성이 맞지 않거나 불안정해질 수 있으므로 주의해야 합니다."</string>
     <string name="permlab_setPreferredApplications">"기본 응용프로그램 설정"</string>
-    <string name="permdesc_setPreferredApplications">"응용프로그램이 기본 응용프로그램을 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 기존 응용프로그램이 사용자의 개인 데이터를 수집하도록 스푸핑하여 실행되는 응용프로그램을 변경할 수 있습니다."</string>
+    <string name="permdesc_setPreferredApplications">"응용프로그램이 기본 응용프로그램을 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 사용자의 개인 정보를 수집하기 위해 기존 응용프로그램을 스푸핑하여 실행되는 응용프로그램을 몰래 변경할 수 있습니다."</string>
     <string name="permlab_writeSettings">"전체 시스템 설정 수정"</string>
-    <string name="permdesc_writeSettings">"응용프로그램이 시스템의 설정 데이터를 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 시스템 구성을 손상시킬 수 있습니다."</string>
+    <string name="permdesc_writeSettings">"응용프로그램이 시스템의 설정 데이터를 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 시스템 구성을 손상시킬 수 있습니다."</string>
     <string name="permlab_writeSecureSettings">"보안 시스템 설정 수정"</string>
-    <string name="permdesc_writeSecureSettings">"응용프로그램이 시스템 보안 설정값 데이터를 수정할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_writeSecureSettings">"응용프로그램이 시스템 보안 설정값 데이터를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_writeGservices">"Google 서비스 지도 수정"</string>
-    <string name="permdesc_writeGservices">"응용프로그램이 Google 서비스 지도를 수정할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_writeGservices">"응용프로그램이 Google 서비스 지도를 수정할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_receiveBootCompleted">"부팅할 때 자동 시작"</string>
-    <string name="permdesc_receiveBootCompleted">"응용프로그램이 시스템 부팅이 끝난 후 바로 시작할 수 있습니다. 이 경우 전화기가 시작하는 데 시간이 오래 걸리고 응용프로그램이 항상 실행되어 전체 전화기 속도가 느려질 수 있습니다."</string>
+    <string name="permdesc_receiveBootCompleted">"응용프로그램이 시스템 부팅이 끝난 후 바로 시작할 수 있도록 합니다. 이 경우 휴대전화가 시작하는 데 시간이 오래 걸리고 응용프로그램이 항상 실행되어 전체 휴대전화 속도가 느려질 수 있습니다."</string>
     <string name="permlab_broadcastSticky">"남은 브로드캐스트 보내기"</string>
-    <string name="permdesc_broadcastSticky">"응용프로그램이 브로드캐스트가 끝난 후에 남은 브로드캐스트를 보낼 수 있습니다. 악성 응용프로그램은 전화기가 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
+    <string name="permdesc_broadcastSticky">"응용프로그램이 브로드캐스트가 끝난 후에 남은 브로드캐스트를 보낼 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화가 메모리를 너무 많이 사용하도록 하여 속도를 저하시키거나 불안정하게 만들 수 있습니다."</string>
     <string name="permlab_readContacts">"연락처 데이터 읽기"</string>
-    <string name="permdesc_readContacts">"응용프로그램이 전화기에 저장된 모든 연락처(주소) 데이터를 읽을 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 데이터를 다른 사람에게 보낼 수 있습니다."</string>
+    <string name="permdesc_readContacts">"응용프로그램이 휴대전화에 저장된 모든 연락처(주소) 데이터를 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 데이터를 다른 사람에게 보낼 수 있습니다."</string>
     <string name="permlab_writeContacts">"연락처 데이터 작성"</string>
-    <string name="permdesc_writeContacts">"응용프로그램이 전화기에 저장된 연락처(주소) 데이터를 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 연락처 데이터를 지우거나 수정할 수 있습니다."</string>
+    <string name="permdesc_writeContacts">"응용프로그램이 휴대전화에 저장된 연락처(주소) 데이터를 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 연락처 데이터를 지우거나 수정할 수 있습니다."</string>
     <string name="permlab_writeOwnerData">"소유자 데이터 작성"</string>
-    <string name="permdesc_writeOwnerData">"응용프로그램이 전화기에 저장된 전화기 소유자 데이터를 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 소유자 데이터를 지우거나 수정할 수 있습니다."</string>
+    <string name="permdesc_writeOwnerData">"응용프로그램이 휴대전화에 저장된 소유자 데이터를 수정할 수 있도록 합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 소유자 데이터를 지우거나 수정할 수 있습니다."</string>
     <string name="permlab_readOwnerData">"소유자 데이터 읽기"</string>
-    <string name="permdesc_readOwnerData">"응용프로그램이 전화기에 저장된 전화기 소유자 데이터를 읽을 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 전화기 소유자 데이터를 읽을 수 있습니다."</string>
+    <string name="permdesc_readOwnerData">"응용프로그램이 휴대전화에 저장된 휴대전화 소유자 데이터를 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 휴대전화 소유자 데이터를 읽을 수 있습니다."</string>
     <string name="permlab_readCalendar">"캘린더 데이터 읽기"</string>
-    <string name="permdesc_readCalendar">"응용프로그램이 전화기에 저장된 모든 캘린더 일정을 읽을 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 캘린더 일정을 다른 사람에게 보낼 수 있습니다."</string>
+    <string name="permdesc_readCalendar">"응용프로그램이 휴대전화에 저장된 모든 캘린더 일정을 읽을 수 있도록 합니다. 이 경우 악성 응용프로그램이 캘린더 일정을 다른 사람에게 보낼 수 있습니다."</string>
     <string name="permlab_writeCalendar">"캘린더 데이터 작성"</string>
-    <string name="permdesc_writeCalendar">"응용프로그램이 전화기에 저장된 캘린더 일정을 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 캘린더 데이터를 지우거나 수정할 수 있습니다."</string>
+    <string name="permdesc_writeCalendar">"응용프로그램이 휴대전화에 저장된 캘린더 일정을 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 캘린더 데이터를 지우거나 수정할 수 있습니다."</string>
     <string name="permlab_accessMockLocation">"테스트를 위해 위치 소스로 가장"</string>
-    <string name="permdesc_accessMockLocation">"테스트용 가짜 위치 소스를 만듭니다. 악성 응용프로그램은 이 기능을 이용하여 GPS, 네트워크 제공업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓸 수 있습니다."</string>
+    <string name="permdesc_accessMockLocation">"테스트용 가짜 위치 소스를 만듭니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS, 네트워크 제공업체 같은 실제 위치 소스에서 반환한 위치 및/또는 상태를 덮어쓸 수 있습니다."</string>
     <string name="permlab_accessLocationExtraCommands">"추가 위치 제공업체 명령 액세스"</string>
-    <string name="permdesc_accessLocationExtraCommands">"추가 위치 제공업체 명령에 액세스합니다. 악성 응용프로그램은 이 기능을 이용하여 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
+    <string name="permdesc_accessLocationExtraCommands">"추가 위치 제공업체 명령에 액세스합니다. 단, 악성 응용프로그램이 이 기능을 이용하여 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
     <string name="permlab_accessFineLocation">"자세한 (GPS) 위치"</string>
-    <string name="permdesc_accessFineLocation">"가능한 경우 전화기에서 GPS(범지구 위치 측정 시스템) 등의 자세한 위치 소스에 액세스합니다. 악성 응용프로그램은 이 기능을 이용하여 사용자의 위치를 측정하고 추가 배터리 전원을 소비할 수 있습니다."</string>
+    <string name="permdesc_accessFineLocation">"가능한 경우 휴대전화에서 GPS(범지구 위치 측정 시스템) 등의 자세한 위치 소스에 액세스합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 확인하고 추가 배터리 전원을 소비할 수 있습니다."</string>
     <string name="permlab_accessCoarseLocation">"광범위한 네트워크 기반 위치"</string>
-    <string name="permdesc_accessCoarseLocation">"전화기의 대략적인 위치를 측정하기 위해 셀룰러 네트워크 데이터베이스와 같은 광범위한 위치 소스에 액세스합니다. 악성 응용프로그램은 이 기능을 이용하여 사용자의 위치를 대략적으로 측정할 수 있습니다."</string>
+    <string name="permdesc_accessCoarseLocation">"휴대전화의 대략적인 위치를 측정하기 위해 셀룰러 네트워크 데이터베이스와 같은 광범위한 위치 소스에 액세스합니다. 이 경우 악성 응용프로그램이 사용자의 위치를 대략적으로 측정할 수 있습니다."</string>
     <string name="permlab_accessSurfaceFlinger">"SurfaceFlinger 액세스"</string>
-    <string name="permdesc_accessSurfaceFlinger">"응용프로그램이 SurfaceFlinger의 하위 수준 기능을 사용할 수 있습니다."</string>
+    <string name="permdesc_accessSurfaceFlinger">"응용프로그램이 SurfaceFlinger의 하위 수준 기능을 사용할 수 있도록 합니다."</string>
     <string name="permlab_readFrameBuffer">"프레임 버퍼 읽기"</string>
-    <string name="permdesc_readFrameBuffer">"응용프로그램이 프레임 버퍼의 콘텐츠를 읽을 수 있습니다."</string>
+    <string name="permdesc_readFrameBuffer">"응용프로그램이 프레임 버퍼의 콘텐츠를 읽을 수 있도록 합니다."</string>
     <string name="permlab_modifyAudioSettings">"오디오 설정 변경"</string>
-    <string name="permdesc_modifyAudioSettings">"응용프로그램이 볼륨 및 경로 지정 같은 전체 오디오 설정을 수정할 수 있습니다."</string>
+    <string name="permdesc_modifyAudioSettings">"응용프로그램이 볼륨 및 경로 지정 같은 전체 오디오 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_recordAudio">"오디오 녹음"</string>
-    <string name="permdesc_recordAudio">"응용프로그램이 오디오 레코드 경로에 액세스할 수 있습니다."</string>
+    <string name="permdesc_recordAudio">"응용프로그램이 오디오 레코드 경로에 액세스할 수 있도록 합니다."</string>
     <string name="permlab_camera">"사진 촬영"</string>
-    <string name="permdesc_camera">"응용프로그램이 카메라로 사진을 찍을 수 있습니다. 이 경우 응용프로그램은 카메라에 표시되는 이미지를 언제든지 수집할 수 있습니다."</string>
-    <string name="permlab_brick">"전화기를 영구적으로 비활성화"</string>
-    <string name="permdesc_brick">"응용프로그램이 전화기를 영구적으로 사용하지 않도록 설정할 수 있습니다. 이 기능은 매우 위험합니다."</string>
-    <string name="permlab_reboot">"전화기 강제로 다시 부팅"</string>
-    <string name="permdesc_reboot">"응용프로그램이 전화기를 강제로 다시 부팅할 수 있습니다."</string>
+    <string name="permdesc_camera">"응용프로그램이 카메라로 사진을 찍을 수 있도록 합니다. 이 경우 응용프로그램이 카메라에 표시되는 이미지를 언제든지 수집할 수 있습니다."</string>
+    <string name="permlab_brick">"휴대전화를 영구적으로 사용 중지"</string>
+    <string name="permdesc_brick">"응용프로그램이 휴대전화를 영구적으로 사용 중지할 수 있게 합니다. 이 기능은 매우 위험합니다."</string>
+    <string name="permlab_reboot">"휴대전화 강제로 다시 부팅"</string>
+    <string name="permdesc_reboot">"응용프로그램이 휴대전화를 강제로 다시 부팅할 수 있도록 합니다."</string>
     <string name="permlab_mount_unmount_filesystems">"파일시스템 마운트 및 마운트 해제"</string>
-    <string name="permdesc_mount_unmount_filesystems">"응용프로그램이 이동식 저장소의 파일시스템을 마운트하고 마운트 해제할 수 있습니다."</string>
+    <string name="permdesc_mount_unmount_filesystems">"응용프로그램이 이동식 저장소의 파일 시스템을 마운트하고 마운트 해제할 수 있도록 합니다."</string>
     <string name="permlab_mount_format_filesystems">"외부 저장소 포맷"</string>
     <string name="permdesc_mount_format_filesystems">"응용프로그램이 제거 가능한 저장소를 포맷하도록 합니다."</string>
     <string name="permlab_vibrate">"진동 제어"</string>
-    <string name="permdesc_vibrate">"응용프로그램이 진동을 제어할 수 있습니다."</string>
+    <string name="permdesc_vibrate">"응용프로그램이 진동을 제어할 수 있도록 합니다."</string>
     <string name="permlab_flashlight">"손전등 제어"</string>
-    <string name="permdesc_flashlight">"응용프로그램이 손전등을 제어할 수 있습니다."</string>
+    <string name="permdesc_flashlight">"응용프로그램이 손전등을 제어할 수 있도록 합니다."</string>
     <string name="permlab_hardware_test">"하드웨어 테스트"</string>
-    <string name="permdesc_hardware_test">"응용프로그램이 하드웨어를 테스트할 목적으로 다양한 주변장치를 제어할 수 있습니다."</string>
+    <string name="permdesc_hardware_test">"응용프로그램이 하드웨어를 테스트할 목적으로 다양한 주변장치를 제어할 수 있도록 합니다."</string>
     <string name="permlab_callPhone">"전화번호로 직접 전화걸기"</string>
-    <string name="permdesc_callPhone">"응용프로그램이 사용자의 조작 없이 전화번호로 전화를 걸 수 있습니다. 악성 응용프로그램은 전화요금 청구서에 예상치 못한 통화 요금이 부과되도록 할 수 있습니다. 이 권한으로 응용프로그램은 비상 전화를 걸 수 없습니다."</string>
+    <string name="permdesc_callPhone">"응용프로그램이 사용자의 조작 없이 전화번호로 전화를 걸 수 있도록 합니다. 이 경우 악성 응용프로그램으로 인해 예상치 못한 통화 요금이 부과될 수 있습니다. 이 권한으로 응용프로그램이 비상 전화를 걸게 할 수는 없습니다."</string>
     <string name="permlab_callPrivileged">"전화번호로 직접 전화걸기"</string>
-    <string name="permdesc_callPrivileged">"응용프로그램이 사용자의 조작 없이 비상 번호를 포함한 전화번호로 전화를 걸 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 응급 서비스를 불필요하거나 불법적으로 호출할 수 있습니다."</string>
+    <string name="permdesc_callPrivileged">"응용프로그램이 사용자의 조작 없이 비상 번호를 포함한 전화번호로 전화를 걸 수 있도록 합니다. 이 경우 악성 응용프로그램이 응급 서비스를 불필요하거나 불법적으로 호출할 수 있습니다."</string>
     <string name="permlab_locationUpdates">"위치 업데이트 알림 제어"</string>
-    <string name="permdesc_locationUpdates">"무선의 위치 업데이트 알림을 활성화하거나 비활성화할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_locationUpdates">"무선의 위치 업데이트 알림을 사용하거나 사용 중지할 수 있도록 합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
     <string name="permlab_checkinProperties">"체크인 속성 액세스"</string>
-    <string name="permdesc_checkinProperties">"체크인 서비스에서 업로드한 속성에 대한 읽기/쓰기 액세스를 허용합니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permdesc_checkinProperties">"체크인 서비스에서 업로드한 속성에 대한 읽기/쓰기 액세스를 허용합니다. 일반 응용프로그램에서는 사용할 수 없습니다."</string>
     <string name="permlab_bindGadget">"위젯 선택"</string>
-    <string name="permdesc_bindGadget">"응용프로그램이 응용프로그램에서 사용할 수 있는 위젯을 시스템에 알릴 수 있습니다. 이 권한을 갖는 응용프로그램은 개인 데이터에 대한 액세스 권한을 다른 응용프로그램에 부여할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
-    <string name="permlab_modifyPhoneState">"전화기 상태 수정"</string>
-    <string name="permdesc_modifyPhoneState">"응용프로그램이 장치의 전화 기능을 제어할 수 있습니다. 이 권한을 갖는 응용프로그램은 사용자에게 알리지 않고 네트워크를 전환하거나, 전화 무선 기능을 켜고 끌 수 있습니다."</string>
-    <string name="permlab_readPhoneState">"전화기 상태 읽기"</string>
-    <string name="permdesc_readPhoneState">"응용프로그램이 장치의 전화 기능에 액세스할 수 있습니다. 이 권한을 갖는 응용프로그램은 전화기의 전화번호, 통화가 활성인지 여부, 통화가 연결된 번호 등을 확인할 수 있습니다."</string>
-    <string name="permlab_wakeLock">"전화기가 절전 모드로 전환되지 않도록 설정"</string>
-    <string name="permdesc_wakeLock">"응용프로그램이 전화기가 절전 모드로 전환되지 않도록 할 수 있습니다."</string>
-    <string name="permlab_devicePower">"전화기 전원 켜고 끄기"</string>
-    <string name="permdesc_devicePower">"응용프로그램이 전화기를 켜거나 끌 수 있습니다."</string>
+    <string name="permdesc_bindGadget">"응용프로그램이 응용프로그램에서 사용할 수 있는 위젯을 시스템에 알릴 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 개인 정보에 대한 액세스 권한을 다른 응용프로그램에 부여할 수 있습니다. 일반 응용프로그램에서는 사용하지 않습니다."</string>
+    <string name="permlab_modifyPhoneState">"휴대전화 상태 수정"</string>
+    <string name="permdesc_modifyPhoneState">"응용프로그램이 장치의 휴대전화 기능을 제어할 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 사용자에게 알리지 않고 네트워크를 전환하거나 휴대전화 무선 기능을 켜고 끄는 등의 작업을 수행할 수 있습니다."</string>
+    <string name="permlab_readPhoneState">"휴대전화 상태 읽기"</string>
+    <string name="permdesc_readPhoneState">"응용프로그램이 장치의 휴대전화 기능에 액세스할 수 있도록 합니다. 이 권한을 갖는 응용프로그램은 휴대전화의 전화번호, 통화가 활성인지 여부, 해당 통화가 연결된 번호 등을 확인할 수 있습니다."</string>
+    <string name="permlab_wakeLock">"휴대전화가 절전 모드로 전환되지 않도록 설정"</string>
+    <string name="permdesc_wakeLock">"응용프로그램이 휴대전화가 절전 모드로 전환되지 않도록 합니다."</string>
+    <string name="permlab_devicePower">"휴대전화 전원 켜고 끄기"</string>
+    <string name="permdesc_devicePower">"응용프로그램이 휴대전화를 켜거나 끌 수 있도록 합니다."</string>
     <string name="permlab_factoryTest">"출고 테스트 모드로 실행"</string>
-    <string name="permdesc_factoryTest">"전화기 하드웨어에 대한 완전한 액세스를 허용하는 하위 수준의 제조업체 테스트로 실행됩니다. 전화기가 제조업체 테스트 모드로 실행 중일 때만 사용할 수 있습니다."</string>
+    <string name="permdesc_factoryTest">"휴대전화 하드웨어에 대한 완전한 액세스를 허용하는 하위 수준의 제조업체 테스트로 실행됩니다. 휴대전화가 제조업체 테스트 모드로 실행 중일 때만 사용할 수 있습니다."</string>
     <string name="permlab_setWallpaper">"배경화면 설정"</string>
-    <string name="permdesc_setWallpaper">"응용프로그램이 시스템 배경화면을 설정할 수 있습니다."</string>
+    <string name="permdesc_setWallpaper">"응용프로그램이 시스템 배경화면을 설정할 수 있도록 합니다."</string>
     <string name="permlab_setWallpaperHints">"배경화면 크기 힌트 설정"</string>
-    <string name="permdesc_setWallpaperHints">"응용프로그램이 시스템 배경화면 크기 힌트를 설정할 수 있습니다."</string>
-    <string name="permlab_masterClear">"시스템을 공장 기본값으로 재설정"</string>
-    <string name="permdesc_masterClear">"응용프로그램이 모든 데이터, 구성 및 설치된 응용프로그램을 지워서 시스템을 공장 기본값으로 완전히 재설정할 수 있습니다."</string>
+    <string name="permdesc_setWallpaperHints">"응용프로그램이 시스템 배경화면 크기 힌트를 설정할 수 있도록 합니다."</string>
+    <string name="permlab_masterClear">"시스템을 기본값으로 재설정"</string>
+    <string name="permdesc_masterClear">"응용프로그램이 모든 데이터, 구성 및 설치된 응용프로그램을 지워서 시스템을 완전히 초기화할 수 있도록 합니다."</string>
     <string name="permlab_setTimeZone">"표준시간대 설정"</string>
-    <string name="permdesc_setTimeZone">"응용프로그램이 전화기의 표준시간대를 변경할 수 있습니다."</string>
+    <string name="permdesc_setTimeZone">"응용프로그램이 휴대전화의 표준시간대를 변경할 수 있도록 합니다."</string>
     <string name="permlab_getAccounts">"알려진 계정 검색"</string>
-    <string name="permdesc_getAccounts">"응용프로그램이 전화기에 알려진 계정 목록을 가져올 수 있습니다."</string>
+    <string name="permdesc_getAccounts">"응용프로그램이 휴대전화에 알려진 계정 목록을 가져올 수 있도록 합니다."</string>
     <string name="permlab_accessNetworkState">"네트워크 상태 보기"</string>
-    <string name="permdesc_accessNetworkState">"응용프로그램이 모든 네트워크의 상태를 볼 수 있습니다."</string>
+    <string name="permdesc_accessNetworkState">"응용프로그램이 모든 네트워크의 상태를 볼 수 있도록 합니다."</string>
     <string name="permlab_createNetworkSockets">"인터넷에 완전히 액세스"</string>
-    <string name="permdesc_createNetworkSockets">"응용프로그램이 네트워크 소켓을 만들 수 있습니다."</string>
+    <string name="permdesc_createNetworkSockets">"응용프로그램이 네트워크 소켓을 만들 수 있도록 합니다."</string>
     <string name="permlab_writeApnSettings">"액세스포인트 이름 설정 쓰기"</string>
-    <string name="permdesc_writeApnSettings">"응용프로그램이 APN의 프록시 및 포트 같은 APN 설정을 수정할 수 있습니다."</string>
+    <string name="permdesc_writeApnSettings">"응용프로그램이 APN의 프록시 및 포트 같은 APN 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_changeNetworkState">"네트워크 연결 변경"</string>
-    <string name="permdesc_changeNetworkState">"응용프로그램이 네트워크 연결 상태를 변경할 수 있습니다."</string>
+    <string name="permdesc_changeNetworkState">"응용프로그램이 네트워크 연결 상태를 변경할 수 있도록 합니다."</string>
     <string name="permlab_changeBackgroundDataSetting">"백그라운드 데이터 사용 설정 변경"</string>
-    <string name="permdesc_changeBackgroundDataSetting">"백그라운드 데이터 사용 설정을 변경할 수 있는 권한을 응용프로그램에 부여합니다."</string>
+    <string name="permdesc_changeBackgroundDataSetting">"응용프로그램이 백그라운드 데이터 사용 설정을 변경할 수 있도록 합니다."</string>
     <string name="permlab_accessWifiState">"Wi-Fi 상태 보기"</string>
-    <string name="permdesc_accessWifiState">"응용프로그램이 Wi-Fi의 상태에 대한 정보를 볼 수 있습니다."</string>
+    <string name="permdesc_accessWifiState">"응용프로그램이 Wi-Fi의 상태에 대한 정보를 볼 수 있도록 합니다."</string>
     <string name="permlab_changeWifiState">"Wi-Fi 상태 변경"</string>
-    <string name="permdesc_changeWifiState">"응용프로그램이 Wi-Fi 액세스포인트에 연결하거나 연결을 끊고, 구성된 Wi-Fi 네트워크를 변경할 수 있습니다."</string>
+    <string name="permdesc_changeWifiState">"응용프로그램이 Wi-Fi 액세스포인트에 연결하거나 연결을 끊고, 구성된 Wi-Fi 네트워크를 변경할 수 있도록 합니다."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
     <string name="permlab_bluetoothAdmin">"Bluetooth 관리"</string>
-    <string name="permdesc_bluetoothAdmin">"응용프로그램이 로컬 Bluetooth 전화를 구성한 다음 원격 장치를 검색하여 페어링할 수 있습니다."</string>
+    <string name="permdesc_bluetoothAdmin">"응용프로그램이 로컬 Bluetooth 휴대전화를 구성한 다음 원격 장치를 검색하여 페어링할 수 있도록 합니다."</string>
     <string name="permlab_bluetooth">"Bluetooth 연결 만들기"</string>
-    <string name="permdesc_bluetooth">"응용프로그램이 로컬 Bluetooth 전화의 구성을 보고 페어링된 장치에 연결하거나 연결을 수락할 수 있습니다."</string>
-    <string name="permlab_disableKeyguard">"키 잠금 사용 안 함"</string>
-    <string name="permdesc_disableKeyguard">"응용프로그램이 키 잠금 및 연결된 비밀번호 보안을 비활성화할 수 있습니다. 예를 들어, 전화기가 수신전화를 받을 때 키 잠금을 비활성화했다가 통화가 끝나면 키 잠금을 다시 활성화할 수 있습니다."</string>
+    <string name="permdesc_bluetooth">"응용프로그램이 로컬 Bluetooth 전화의 구성을 보고 페어링된 장치에 연결하며 연결을 수락할 수 있도록 합니다."</string>
+    <string name="permlab_disableKeyguard">"키 잠금 사용 중지"</string>
+    <string name="permdesc_disableKeyguard">"응용프로그램이 키 잠금 및 관련 비밀번호 보안을 사용 중지할 수 있도록 합니다. 예를 들어, 휴대전화가 수신전화를 받을 때 키 잠금을 사용 중지했다가 통화가 끝나면 키 잠금을 다시 사용할 수 있습니다."</string>
     <string name="permlab_readSyncSettings">"동기화 설정 읽기"</string>
-    <string name="permdesc_readSyncSettings">"응용프로그램이 연락처에 대해 동기화를 활성화할지 여부 같은 동기화 설정을 읽을 수 있습니다."</string>
+    <string name="permdesc_readSyncSettings">"응용프로그램이 주소록에 동기화를 사용할지 여부와 같은 동기화 설정을 읽을 수 있도록 합니다."</string>
     <string name="permlab_writeSyncSettings">"동기화 설정 쓰기"</string>
-    <string name="permdesc_writeSyncSettings">"응용프로그램이 연락처에 대해 동기화를 활성화할지 여부 같은 동기화 설정을 수정할 수 있습니다."</string>
+    <string name="permdesc_writeSyncSettings">"응용프로그램이 주소록에 대해 동기화를 사용할지 여부 등의 동기화 설정을 수정할 수 있도록 합니다."</string>
     <string name="permlab_readSyncStats">"동기화 통계 읽기"</string>
-    <string name="permdesc_readSyncStats">"응용프로그램이 동기화 통계(예: 실행된 동기화 기록)을 읽을 수 있습니다."</string>
+    <string name="permdesc_readSyncStats">"응용프로그램이 동기화 통계(예: 실행된 동기화 기록)을 읽을 수 있도록 합니다."</string>
     <string name="permlab_subscribedFeedsRead">"가입된 피드 읽기"</string>
-    <string name="permdesc_subscribedFeedsRead">"응용프로그램이 현재 동기화된 피드에 대한 상세정보를 가져올 수 있습니다."</string>
+    <string name="permdesc_subscribedFeedsRead">"응용프로그램이 현재 동기화된 피드에 대한 세부정보를 가져올 수 있도록 합니다."</string>
     <string name="permlab_subscribedFeedsWrite">"가입 피드 작성"</string>
-    <string name="permdesc_subscribedFeedsWrite">"응용프로그램이 현재 동기화된 피드를 수정할 수 있습니다. 악성 응용프로그램은 이 기능을 이용하여 동기화된 피드를 변경할 수 있습니다."</string>
-    <string name="permlab_readDictionary">"상용자 정의 사전 읽기"</string>
-    <string name="permdesc_readDictionary">"응용프로그램이 사용자 사전에 보관되어 있을 수 있는 비공개 단어, 이름 및 구문을 읽도록 합니다."</string>
+    <string name="permdesc_subscribedFeedsWrite">"응용프로그램이 현재 동기화된 피드를 수정할 수 있도록 합니다. 이 경우 악성 응용프로그램이 동기화된 피드를 변경할 수 있습니다."</string>
+    <string name="permlab_readDictionary">"사용자 정의 사전 읽기"</string>
+    <string name="permdesc_readDictionary">"응용프로그램이 사용자 사전에 보관되어 있는 비공개 단어, 이름 및 구문을 읽도록 합니다."</string>
     <string name="permlab_writeDictionary">"상용자 정의 사전에 작성"</string>
-    <string name="permdesc_writeDictionary">"응용프로그램이 사용자 사전에 새 단어를 입력할 수 있습니다."</string>
+    <string name="permdesc_writeDictionary">"응용프로그램이 사용자 사전에 새 단어를 입력할 수 있도록 합니다."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
     <item>"집"</item>
-    <item>"휴대전화"</item>
+    <item>"모바일"</item>
     <item>"회사"</item>
     <item>"회사 팩스"</item>
     <item>"집(팩스)"</item>
     <item>"호출기"</item>
     <item>"기타"</item>
-    <item>"사용자설정"</item>
+    <item>"맞춤설정"</item>
   </string-array>
   <string-array name="emailAddressTypes">
     <item>"집"</item>
     <item>"회사"</item>
     <item>"기타"</item>
-    <item>"사용자설정"</item>
+    <item>"맞춤설정"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"모바일"</string>
   <string-array name="postalAddressTypes">
     <item>"집"</item>
     <item>"회사"</item>
     <item>"기타"</item>
-    <item>"사용자설정"</item>
+    <item>"맞춤설정"</item>
   </string-array>
   <string-array name="imAddressTypes">
     <item>"집"</item>
     <item>"회사"</item>
     <item>"기타"</item>
-    <item>"사용자설정"</item>
+    <item>"맞춤설정"</item>
   </string-array>
   <string-array name="organizationTypes">
     <item>"회사"</item>
     <item>"기타"</item>
-    <item>"사용자설정"</item>
+    <item>"맞춤설정"</item>
   </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
@@ -384,7 +461,7 @@
     <string name="keyguard_password_wrong_pin_code">"PIN 코드가 잘못되었습니다."</string>
     <string name="keyguard_label_text">"잠금해제하려면 메뉴를 누른 다음 0을 누릅니다."</string>
     <string name="emergency_call_dialog_number_for_display">"비상 전화번호"</string>
-    <string name="lockscreen_carrier_default">"(서비스 안 됨)"</string>
+    <string name="lockscreen_carrier_default">"(서비스 안됨)"</string>
     <string name="lockscreen_screen_locked">"화면 잠김"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"비상 전화를 걸거나 잠금해제하려면 메뉴를 누르세요."</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"잠금해제하려면 메뉴를 누르세요."</string>
@@ -393,18 +470,20 @@
     <string name="lockscreen_pattern_correct">"맞습니다."</string>
     <string name="lockscreen_pattern_wrong">"죄송합니다. 다시 시도하세요."</string>
     <string name="lockscreen_plugged_in">"충전 중(<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"충전기를 연결하세요."</string>
     <string name="lockscreen_missing_sim_message_short">"SIM 카드가 없습니다."</string>
-    <string name="lockscreen_missing_sim_message">"전화기에 SIM 카드가 없습니다."</string>
+    <string name="lockscreen_missing_sim_message">"휴대전화에 SIM 카드가 없습니다."</string>
     <string name="lockscreen_missing_sim_instructions">"SIM 카드를 삽입하세요."</string>
     <string name="lockscreen_network_locked_message">"네트워크 잠김"</string>
     <string name="lockscreen_sim_puk_locked_message">"SIM 카드의 PUK가 잠겨 있습니다."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"사용자 가이드를 참조하거나 고객지원팀에 문의하세요."</string>
     <string name="lockscreen_sim_locked_message">"SIM 카드가 잠겨 있습니다."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"SIM 카드 잠금해제 중..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 가져왔습니다. "\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도하세요."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 Google 로그인을 통해 전화기를 잠금해제하도록 요청됩니다."\n\n" <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도하세요."</string>
-    <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 입력하세요."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. "\n\n"<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도하세요."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 Google 로그인을 통해 휴대전화를 잠금해제하도록 요청됩니다. "\n\n" <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도하세요."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g>초 후에 다시 시도하세요."</string>
     <string name="lockscreen_forgot_pattern_button_text">"패턴을 잊으셨나요?"</string>
     <string name="lockscreen_glogin_too_many_attempts">"패턴을 너무 많이 시도했습니다."</string>
     <string name="lockscreen_glogin_instructions">"잠금해제하려면 Google 계정으로 로그인하세요."</string>
@@ -414,15 +493,18 @@
     <string name="lockscreen_glogin_invalid_input">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"알림 지우기"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"알림 없음"</string>
-    <string name="status_bar_ongoing_events_title">"사용 중"</string>
+    <string name="status_bar_ongoing_events_title">"진행 중"</string>
     <string name="status_bar_latest_events_title">"알림"</string>
     <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="battery_status_charging">"충전 중..."</string>
     <string name="battery_low_title">"충전기를 연결하세요."</string>
     <string name="battery_low_subtitle">"배터리 전원이 부족합니다."</string>
     <string name="battery_low_percent_format">"<xliff:g id="NUMBER">%d%%</xliff:g> 미만 남음"</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"출고 테스트 불합격"</string>
     <string name="factorytest_not_system">"FACTORY_TEST 작업은 /system/app 디렉토리에 설치된 패키지에 대해서만 지원됩니다."</string>
     <string name="factorytest_no_action">"FACTORY_TEST 작업을 제공하는 패키지가 없습니다."</string>
@@ -431,13 +513,21 @@
     <string name="js_dialog_title_default">"자바스크립트"</string>
     <string name="js_dialog_before_unload">"다른 페이지를 탐색하시겠습니까?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"계속하려면 \'확인\'을 선택하고 현재 페이지에 그대로 있으려면 \'취소\'를 선택하세요."</string>
     <string name="save_password_label">"확인"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
     <string name="save_password_message">"브라우저에 이 비밀번호를 저장하시겠습니까?"</string>
     <string name="save_password_notnow">"나중에"</string>
     <string name="save_password_remember">"저장"</string>
-    <string name="save_password_never">"저장 안 함"</string>
+    <string name="save_password_never">"안함"</string>
     <string name="open_permission_deny">"페이지를 열 수 있는 권한이 없습니다."</string>
     <string name="text_copied">"텍스트가 클립보드에 복사되었습니다."</string>
-    <string name="more_item_label">"자세히"</string>
+    <string name="more_item_label">"더보기"</string>
     <string name="prepend_shortcut_label">"Menu+"</string>
     <string name="menu_space_shortcut_label">"스페이스바"</string>
     <string name="menu_enter_shortcut_label">"입력"</string>
@@ -466,11 +556,11 @@
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>초 후"</item>
   </plurals>
   <plurals name="in_num_minutes">
-    <item quantity="one">"1분 내"</item>
+    <item quantity="one">"1분 후"</item>
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>분 후"</item>
   </plurals>
   <plurals name="in_num_hours">
-    <item quantity="one">"1시간 내"</item>
+    <item quantity="one">"1시간 후"</item>
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>시간 후"</item>
   </plurals>
   <plurals name="in_num_days">
@@ -479,7 +569,7 @@
   </plurals>
   <plurals name="abbrev_num_seconds_ago">
     <item quantity="one">"1초 전"</item>
-    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 초 전"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>초 전"</item>
   </plurals>
   <plurals name="abbrev_num_minutes_ago">
     <item quantity="one">"1분 전"</item>
@@ -495,7 +585,7 @@
   </plurals>
   <plurals name="abbrev_in_num_seconds">
     <item quantity="one">"1초 후"</item>
-    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 초 후"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g>초 후"</item>
   </plurals>
   <plurals name="abbrev_in_num_minutes">
     <item quantity="one">"1분 후"</item>
@@ -529,7 +619,7 @@
     <string name="weekly">"매주 <xliff:g id="DAY">%s</xliff:g>"</string>
     <string name="monthly">"매월"</string>
     <string name="yearly">"매년"</string>
-    <string name="VideoView_error_title">"동영상 재생 안 됨"</string>
+    <string name="VideoView_error_title">"동영상 재생 안됨"</string>
     <string name="VideoView_error_text_invalid_progressive_playback">"죄송합니다. 이 기기로의 스트리밍에 적합하지 않은 동영상입니다."</string>
     <string name="VideoView_error_text_unknown">"죄송합니다. 동영상을 재생할 수 없습니다."</string>
     <string name="VideoView_error_button">"확인"</string>
@@ -538,10 +628,6 @@
     <string name="Noon">"정오"</string>
     <string name="midnight">"자정"</string>
     <string name="Midnight">"자정"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"모두 선택"</string>
@@ -557,35 +643,37 @@
     <string name="addToDictionary">"사전에 \'%s\' 추가"</string>
     <string name="editTextMenuTitle">"텍스트 수정"</string>
     <string name="low_internal_storage_view_title">"저장공간 부족"</string>
-    <string name="low_internal_storage_view_text">"전화기 저장공간이 부족합니다."</string>
+    <string name="low_internal_storage_view_text">"휴대전화 저장공간이 부족합니다."</string>
     <string name="ok">"확인"</string>
     <string name="cancel">"취소"</string>
     <string name="yes">"확인"</string>
     <string name="no">"취소"</string>
     <string name="dialog_alert_title">"주의"</string>
-    <string name="capital_on">"켜짐"</string>
-    <string name="capital_off">"끄기"</string>
-    <string name="whichApplication">"작업을 수행할 때 사용하는 권한"</string>
+    <string name="capital_on">"사용"</string>
+    <string name="capital_off">"사용 안함"</string>
+    <string name="whichApplication">"작업을 수행할 때 사용하는 응용프로그램"</string>
     <string name="alwaysUse">"이 작업에 대해 기본값으로 사용"</string>
     <string name="clearDefaultHintMsg">"홈 설정 &gt; 응용프로그램 &gt; 응용프로그램 관리에서 기본값을 지웁니다."</string>
     <string name="chooseActivity">"작업 선택"</string>
     <string name="noApplications">"작업을 수행할 수 있는 응용프로그램이 없습니다."</string>
     <string name="aerr_title">"죄송합니다."</string>
-    <string name="aerr_application">"<xliff:g id="APPLICATION">%1$s</xliff:g> 응용프로그램(<xliff:g id="PROCESS">%2$s</xliff:g> 프로세스)이 예상치 않게 중지되었습니다. 다시 시도하세요."</string>
-    <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 프로세스가 예상치 않게 중지되었습니다. 다시 시도하세요."</string>
+    <string name="aerr_application">"<xliff:g id="APPLICATION">%1$s</xliff:g> 응용프로그램(<xliff:g id="PROCESS">%2$s</xliff:g> 프로세스)이 예상치 않게 중지되었습니다. 다시 시도해 주세요."</string>
+    <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 프로세스가 예상치 않게 중지되었습니다. 다시 시도해 주세요."</string>
     <string name="anr_title">"죄송합니다."</string>
-    <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g> 활동(<xliff:g id="APPLICATION">%2$s</xliff:g> 응용프로그램)이 응답하지 않습니다."</string>
+    <string name="anr_activity_application">"<xliff:g id="APPLICATION">%2$s</xliff:g> 활동(<xliff:g id="ACTIVITY">%1$s</xliff:g> 응용프로그램)이 응답하지 않습니다."</string>
     <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g> 활동(<xliff:g id="PROCESS">%2$s</xliff:g> 프로세스)이 응답하지 않습니다."</string>
     <string name="anr_application_process">"<xliff:g id="APPLICATION">%1$s</xliff:g> 응용프로그램(<xliff:g id="PROCESS">%2$s</xliff:g> 프로세스)이 응답하지 않습니다."</string>
     <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 프로세스가 응답하지 않습니다."</string>
-    <string name="force_close">"강제로 닫기"</string>
+    <string name="force_close">"닫기"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
     <string name="wait">"대기"</string>
-    <string name="debug">"디버깅"</string>
+    <string name="debug">"디버그"</string>
     <string name="sendText">"텍스트에 대한 작업 선택"</string>
     <string name="volume_ringtone">"벨소리 볼륨"</string>
     <string name="volume_music">"미디어 볼륨"</string>
     <string name="volume_music_hint_playing_through_bluetooth">"Bluetooth를 통해 재생"</string>
-    <string name="volume_call">"통화볼륨"</string>
+    <string name="volume_call">"통화 볼륨"</string>
     <string name="volume_bluetooth_call">"Bluetooth 통화 볼륨"</string>
     <string name="volume_alarm">"알람 볼륨"</string>
     <string name="volume_notification">"알림 볼륨"</string>
@@ -596,12 +684,12 @@
     <string name="ringtone_picker_title">"벨소리"</string>
     <string name="ringtone_unknown">"알 수 없는 벨소리"</string>
   <plurals name="wifi_available">
-    <item quantity="one">"Wi-Fi 네트워크 사용가능"</item>
-    <item quantity="other">"Wi-Fi 네트워크 사용가능"</item>
+    <item quantity="one">"Wi-Fi 네트워크 사용 가능"</item>
+    <item quantity="other">"Wi-Fi 네트워크 사용 가능"</item>
   </plurals>
   <plurals name="wifi_available_detailed">
-    <item quantity="one">"개방형 Wi-Fi 네트워크 사용가능"</item>
-    <item quantity="other">"개방형 Wi-Fi 네트워크 사용가능"</item>
+    <item quantity="one">"개방형 Wi-Fi 네트워크 사용 가능"</item>
+    <item quantity="other">"개방형 Wi-Fi 네트워크 사용 가능"</item>
   </plurals>
     <string name="select_character">"문자 삽입"</string>
     <string name="sms_control_default_app_name">"알 수 없는 응용프로그램"</string>
@@ -611,54 +699,67 @@
     <string name="sms_control_no">"취소"</string>
     <string name="date_time_set">"설정"</string>
     <string name="default_permission_group">"기본값"</string>
-    <string name="no_permissions">"권한이 필요하지 않음"</string>
+    <string name="no_permissions">"권한 필요 없음"</string>
     <string name="perms_hide"><b>"숨기기"</b></string>
     <string name="perms_show_all"><b>"모두 표시"</b></string>
     <string name="googlewebcontenthelper_loading">"로드 중..."</string>
     <string name="usb_storage_title">"USB 연결됨"</string>
-    <string name="usb_storage_message">"USB를 통해 전화기를 컴퓨터에 연결했습니다. 컴퓨터와 전화기 SD 카드 간에 파일을 복사하려면 \'마운트\'를 선택하세요."</string>
+    <string name="usb_storage_message">"USB를 통해 휴대전화를 컴퓨터에 연결했습니다. 컴퓨터와 휴대전화 SD 카드 간에 파일을 복사하려면 \'마운트\'를 선택하세요."</string>
     <string name="usb_storage_button_mount">"마운트"</string>
-    <string name="usb_storage_button_unmount">"마운트 안 함"</string>
-    <string name="usb_storage_error_message">"USB 저장소에 SD 카드를 사용하는 동안 문제가 발생했습니다."</string>
+    <string name="usb_storage_button_unmount">"마운트 안함"</string>
+    <string name="usb_storage_error_message">"USB 저장소로 SD 카드를 사용하는 동안 문제가 발생했습니다."</string>
     <string name="usb_storage_notification_title">"USB 연결됨"</string>
     <string name="usb_storage_notification_message">"컴퓨터에 파일을 복사하거나 컴퓨터의 파일을 복사하려면 선택합니다."</string>
     <string name="usb_storage_stop_notification_title">"USB 저장소 끄기"</string>
     <string name="usb_storage_stop_notification_message">"USB 저장소 끄기를 선택하세요."</string>
     <string name="usb_storage_stop_title">"USB 저장소 끄기"</string>
-    <string name="usb_storage_stop_message">"USB 저장소를 끄기 전에 반드시 USB 호스를 마운트 해제하세요. USB 저장소를 끄려면 \'끄기\'를 선택하세요."</string>
+    <string name="usb_storage_stop_message">"USB 저장소를 끄기 전에 반드시 USB 호스트에서 마운트 해제하세요. USB 저장소를 끄려면 \'끄기\'를 선택하세요."</string>
     <string name="usb_storage_stop_button_mount">"USB 저장소 끄기"</string>
     <string name="usb_storage_stop_button_unmount">"취소"</string>
     <string name="usb_storage_stop_error_message">"USB 저장소를 끄는 동안 Weve에 문제가 발행했습니다. USB 호스트를 마운트 해제했는지 확인한 후 다시 시도하세요."</string>
     <string name="extmedia_format_title">"SD 카드 포맷"</string>
     <string name="extmedia_format_message">"SD 카드를 포맷하시겠습니까? 포맷하면 카드의 모든 데이터를 잃게 됩니다."</string>
     <string name="extmedia_format_button_format">"포맷"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"입력 방법 선택"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"가능한 원인"</u></string>
     <string name="ext_media_checking_notification_title">"SD 카드 준비 중"</string>
-    <string name="ext_media_checking_notification_message">"오류 확인 중"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"빈 SD 카드"</string>
-    <string name="ext_media_nofs_notification_message">"SD 카드가 비어 있거나 지원되지 않는 파일시스템입니다."</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"손상된 SD 카드"</string>
-    <string name="ext_media_unmountable_notification_message">"SD 카드가 손상되었습니다. 카드를 다시 포맷하시기 바랍니다."</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"SD 카드가 예상치 않게 제거되었습니다."</string>
     <string name="ext_media_badremoval_notification_message">"데이터 손실을 피하려면 SD 카드를 제거하기 전에 마운트 해제합니다."</string>
     <string name="ext_media_safe_unmount_notification_title">"SD 카드를 안전하게 제거할 수 있습니다."</string>
-    <string name="ext_media_safe_unmount_notification_message">"이제 SD 카드를 안전하게 제거할 수 있습니다."</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
     <string name="ext_media_nomedia_notification_title">"SD 카드를 제거했습니다."</string>
-    <string name="ext_media_nomedia_notification_message">"SD가 제거되었습니다. 기기의 저장 용량을 늘리려면 새 SD 카드를 삽입하세요."</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"일치하는 활동이 없습니다."</string>
-    <string name="permlab_pkgUsageStats">"구성요소 사용 통계 업데이트"</string>
+    <string name="permlab_pkgUsageStats">"구성 요소 사용 통계 업데이트"</string>
     <string name="permdesc_pkgUsageStats">"수집된 구성요소 사용 통계를 수정할 수 있는 권한을 부여합니다. 일반 응용프로그램은 이 권한을 사용할 수 없습니다."</string>
     <string name="tutorial_double_tap_to_zoom_message_short">"확대/축소하려면 두 번 탭하세요."</string>
-    <string name="gadget_host_error_inflating">"위젯을 확장하는 오류가 발생했습니다."</string>
+    <string name="gadget_host_error_inflating">"위젯을 확장하는 동안 오류가 발생했습니다."</string>
     <string name="ime_action_go">"이동"</string>
     <string name="ime_action_search">"검색"</string>
     <string name="ime_action_send">"전송"</string>
     <string name="ime_action_next">"다음"</string>
     <string name="ime_action_done">"완료"</string>
     <string name="ime_action_default">"실행"</string>
-    <string name="dial_number_using">"다음 번호로 전화걸기"\n": <xliff:g id="NUMBER">%s</xliff:g>"</string>
-    <string name="create_contact_using">"다음 번호로 주소록 만들기"\n": <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="dial_number_using">"전화하기 "\n"<xliff:g id="NUMBER">%s</xliff:g>에 연결"</string>
+    <string name="create_contact_using">"전화번호부에"\n"<xliff:g id="NUMBER">%s</xliff:g> 추가"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-mcc204-da/strings.xml b/core/res/res/values-mcc204-da/strings.xml
new file mode 100644
index 0000000..7d96230
--- /dev/null
+++ b/core/res/res/values-mcc204-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-el/strings.xml b/core/res/res/values-mcc204-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc204-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-pt-rPT/strings.xml b/core/res/res/values-mcc204-pt-rPT/strings.xml
new file mode 100644
index 0000000..7d96230
--- /dev/null
+++ b/core/res/res/values-mcc204-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-sv/strings.xml b/core/res/res/values-mcc204-sv/strings.xml
new file mode 100644
index 0000000..7d96230
--- /dev/null
+++ b/core/res/res/values-mcc204-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc204-tr/strings.xml b/core/res/res/values-mcc204-tr/strings.xml
new file mode 100644
index 0000000..7d96230
--- /dev/null
+++ b/core/res/res/values-mcc204-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"nl_nl"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-da/strings.xml b/core/res/res/values-mcc230-da/strings.xml
new file mode 100644
index 0000000..d3ecdbb
--- /dev/null
+++ b/core/res/res/values-mcc230-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-el/strings.xml b/core/res/res/values-mcc230-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc230-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-pt-rPT/strings.xml b/core/res/res/values-mcc230-pt-rPT/strings.xml
new file mode 100644
index 0000000..d3ecdbb
--- /dev/null
+++ b/core/res/res/values-mcc230-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-sv/strings.xml b/core/res/res/values-mcc230-sv/strings.xml
new file mode 100644
index 0000000..d3ecdbb
--- /dev/null
+++ b/core/res/res/values-mcc230-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc230-tr/strings.xml b/core/res/res/values-mcc230-tr/strings.xml
new file mode 100644
index 0000000..d3ecdbb
--- /dev/null
+++ b/core/res/res/values-mcc230-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"cs_cz"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-da/strings.xml b/core/res/res/values-mcc232-da/strings.xml
new file mode 100644
index 0000000..4773838
--- /dev/null
+++ b/core/res/res/values-mcc232-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-el/strings.xml b/core/res/res/values-mcc232-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc232-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-pt-rPT/strings.xml b/core/res/res/values-mcc232-pt-rPT/strings.xml
new file mode 100644
index 0000000..4773838
--- /dev/null
+++ b/core/res/res/values-mcc232-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-sv/strings.xml b/core/res/res/values-mcc232-sv/strings.xml
new file mode 100644
index 0000000..4773838
--- /dev/null
+++ b/core/res/res/values-mcc232-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc232-tr/strings.xml b/core/res/res/values-mcc232-tr/strings.xml
new file mode 100644
index 0000000..4773838
--- /dev/null
+++ b/core/res/res/values-mcc232-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_at"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-da/strings.xml b/core/res/res/values-mcc234-da/strings.xml
new file mode 100644
index 0000000..2538b73
--- /dev/null
+++ b/core/res/res/values-mcc234-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-el/strings.xml b/core/res/res/values-mcc234-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc234-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-pt-rPT/strings.xml b/core/res/res/values-mcc234-pt-rPT/strings.xml
new file mode 100644
index 0000000..2538b73
--- /dev/null
+++ b/core/res/res/values-mcc234-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-sv/strings.xml b/core/res/res/values-mcc234-sv/strings.xml
new file mode 100644
index 0000000..2538b73
--- /dev/null
+++ b/core/res/res/values-mcc234-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc234-tr/strings.xml b/core/res/res/values-mcc234-tr/strings.xml
new file mode 100644
index 0000000..2538b73
--- /dev/null
+++ b/core/res/res/values-mcc234-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"en_gb"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-da/strings.xml b/core/res/res/values-mcc260-da/strings.xml
new file mode 100644
index 0000000..1161f9a
--- /dev/null
+++ b/core/res/res/values-mcc260-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-el/strings.xml b/core/res/res/values-mcc260-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc260-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-pt-rPT/strings.xml b/core/res/res/values-mcc260-pt-rPT/strings.xml
new file mode 100644
index 0000000..1161f9a
--- /dev/null
+++ b/core/res/res/values-mcc260-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-sv/strings.xml b/core/res/res/values-mcc260-sv/strings.xml
new file mode 100644
index 0000000..1161f9a
--- /dev/null
+++ b/core/res/res/values-mcc260-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc260-tr/strings.xml b/core/res/res/values-mcc260-tr/strings.xml
new file mode 100644
index 0000000..1161f9a
--- /dev/null
+++ b/core/res/res/values-mcc260-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"pl_pl"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-da/strings.xml b/core/res/res/values-mcc262-da/strings.xml
new file mode 100644
index 0000000..9505cf4
--- /dev/null
+++ b/core/res/res/values-mcc262-da/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-el/strings.xml b/core/res/res/values-mcc262-el/strings.xml
new file mode 100644
index 0000000..97bfe65
--- /dev/null
+++ b/core/res/res/values-mcc262-el/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"el_GR"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-pt-rPT/strings.xml b/core/res/res/values-mcc262-pt-rPT/strings.xml
new file mode 100644
index 0000000..9505cf4
--- /dev/null
+++ b/core/res/res/values-mcc262-pt-rPT/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-sv/strings.xml b/core/res/res/values-mcc262-sv/strings.xml
new file mode 100644
index 0000000..9505cf4
--- /dev/null
+++ b/core/res/res/values-mcc262-sv/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-mcc262-tr/strings.xml b/core/res/res/values-mcc262-tr/strings.xml
new file mode 100644
index 0000000..9505cf4
--- /dev/null
+++ b/core/res/res/values-mcc262-tr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="locale_replacement">"de_de"</string>
+</resources>
diff --git a/core/res/res/values-no-rNO/arrays.xml b/core/res/res/values-nb-rNO/arrays.xml
similarity index 100%
rename from core/res/res/values-no-rNO/arrays.xml
rename to core/res/res/values-nb-rNO/arrays.xml
diff --git a/core/res/res/values-nb-rNO/donottranslate-cldr.xml b/core/res/res/values-nb-rNO/donottranslate-cldr.xml
new file mode 100644
index 0000000..ecf0111
--- /dev/null
+++ b/core/res/res/values-nb-rNO/donottranslate-cldr.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="month_long_standalone_january">januar</string>
+    <string name="month_long_standalone_february">februar</string>
+    <string name="month_long_standalone_march">mars</string>
+    <string name="month_long_standalone_april">april</string>
+    <string name="month_long_standalone_may">mai</string>
+    <string name="month_long_standalone_june">juni</string>
+    <string name="month_long_standalone_july">juli</string>
+    <string name="month_long_standalone_august">august</string>
+    <string name="month_long_standalone_september">september</string>
+    <string name="month_long_standalone_october">oktober</string>
+    <string name="month_long_standalone_november">november</string>
+    <string name="month_long_standalone_december">desember</string>
+
+    <string name="month_long_january">januar</string>
+    <string name="month_long_february">februar</string>
+    <string name="month_long_march">mars</string>
+    <string name="month_long_april">april</string>
+    <string name="month_long_may">mai</string>
+    <string name="month_long_june">juni</string>
+    <string name="month_long_july">juli</string>
+    <string name="month_long_august">august</string>
+    <string name="month_long_september">september</string>
+    <string name="month_long_october">oktober</string>
+    <string name="month_long_november">november</string>
+    <string name="month_long_december">desember</string>
+
+    <string name="month_medium_january">jan.</string>
+    <string name="month_medium_february">feb.</string>
+    <string name="month_medium_march">mars</string>
+    <string name="month_medium_april">apr.</string>
+    <string name="month_medium_may">mai</string>
+    <string name="month_medium_june">juni</string>
+    <string name="month_medium_july">juli</string>
+    <string name="month_medium_august">aug.</string>
+    <string name="month_medium_september">sep.</string>
+    <string name="month_medium_october">okt.</string>
+    <string name="month_medium_november">nov.</string>
+    <string name="month_medium_december">des.</string>
+
+    <string name="month_shortest_january">J</string>
+    <string name="month_shortest_february">F</string>
+    <string name="month_shortest_march">M</string>
+    <string name="month_shortest_april">A</string>
+    <string name="month_shortest_may">M</string>
+    <string name="month_shortest_june">J</string>
+    <string name="month_shortest_july">J</string>
+    <string name="month_shortest_august">A</string>
+    <string name="month_shortest_september">S</string>
+    <string name="month_shortest_october">O</string>
+    <string name="month_shortest_november">N</string>
+    <string name="month_shortest_december">D</string>
+
+    <string name="day_of_week_long_sunday">søndag</string>
+    <string name="day_of_week_long_monday">mandag</string>
+    <string name="day_of_week_long_tuesday">tirsdag</string>
+    <string name="day_of_week_long_wednesday">onsdag</string>
+    <string name="day_of_week_long_thursday">torsdag</string>
+    <string name="day_of_week_long_friday">fredag</string>
+    <string name="day_of_week_long_saturday">lørdag</string>
+
+    <string name="day_of_week_medium_sunday">søn.</string>
+    <string name="day_of_week_medium_monday">man.</string>
+    <string name="day_of_week_medium_tuesday">tir.</string>
+    <string name="day_of_week_medium_wednesday">ons.</string>
+    <string name="day_of_week_medium_thursday">tor.</string>
+    <string name="day_of_week_medium_friday">fre.</string>
+    <string name="day_of_week_medium_saturday">lør.</string>
+
+    <string name="day_of_week_short_sunday">søn.</string>
+    <string name="day_of_week_short_monday">man.</string>
+    <string name="day_of_week_short_tuesday">tir.</string>
+    <string name="day_of_week_short_wednesday">ons.</string>
+    <string name="day_of_week_short_thursday">tor.</string>
+    <string name="day_of_week_short_friday">fre.</string>
+    <string name="day_of_week_short_saturday">lør.</string>
+
+    <string name="day_of_week_shortest_sunday">S</string>
+    <string name="day_of_week_shortest_monday">M</string>
+    <string name="day_of_week_shortest_tuesday">T</string>
+    <string name="day_of_week_shortest_wednesday">O</string>
+    <string name="day_of_week_shortest_thursday">T</string>
+    <string name="day_of_week_shortest_friday">F</string>
+    <string name="day_of_week_shortest_saturday">L</string>
+
+    <string name="am">AM</string>
+    <string name="pm">PM</string>
+    <string name="yesterday">i går</string>
+    <string name="today">i dag</string>
+    <string name="tomorrow">i morgen</string>
+
+    <string name="hour_minute_24">%H.%M</string>
+    <string name="hour_minute_ampm">%-l.%M %p</string>
+    <string name="hour_minute_cap_ampm">%-l.%M %^p</string>
+    <string name="twelve_hour_time_format">h.mm a</string>
+    <string name="twenty_four_hour_time_format">HH.mm</string>
+    <string name="numeric_date">%d.%m.%Y</string>
+    <string name="numeric_date_format">dd.MM.yyyy</string>
+    <string name="numeric_date_template">"%s.%s.%s"</string>
+    <string name="month_day_year">%-e. %B %Y</string>
+    <string name="time_of_day">%H.%M.%S</string>
+    <string name="date_and_time">%H.%M.%S %-e. %b %Y</string>
+    <string name="date_time">%2$s %1$s</string>
+    <string name="time_date">%1$s %3$s</string>
+    <string name="abbrev_month_day_year">%-e. %b %Y</string>
+    <string name="month_day">%-e. %B</string>
+    <string name="month">%-B</string>
+    <string name="month_year">%B %Y</string>
+    <string name="abbrev_month_day">%-e. %b</string>
+    <string name="abbrev_month">%-b</string>
+    <string name="abbrev_month_year">%b %Y</string>
+    <string name="time1_time2">%1$s–%2$s</string>
+    <string name="date1_date2">%2$s–%5$s</string>
+    <string name="numeric_md1_md2">%3$s.%2$s.–%8$s.%7$s.</string>
+    <string name="numeric_wday1_md1_wday2_md2">%1$s %3$s.%2$s.–%6$s %8$s.%7$s.</string>
+    <string name="numeric_mdy1_mdy2">%3$s.%2$s.%4$s–%8$s.%7$s.%9$s</string>
+    <string name="numeric_wday1_mdy1_wday2_mdy2">%1$s %3$s.%2$s.%4$s–%6$s %8$s.%7$s.%9$s</string>
+    <string name="numeric_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s.%2$s.%4$s–%10$s %6$s %8$s.%7$s.%9$s</string>
+    <string name="numeric_md1_time1_md2_time2">%5$s %3$s.%2$s.–%10$s %8$s.%7$s.</string>
+    <string name="numeric_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s.%2$s–%10$s %6$s %8$s.%7$s</string>
+    <string name="numeric_mdy1_time1_mdy2_time2">%5$s %3$s.%2$s.%4$s–%10$s %8$s.%7$s.%9$s</string>
+    <string name="wday1_date1_time1_wday2_date2_time2">%3$s %1$s %2$s–%6$s %4$s %5$s</string>
+    <string name="wday1_date1_wday2_date2">%1$s %2$s–%4$s %5$s</string>
+    <string name="date1_time1_date2_time2">%3$s %2$s–%6$s %5$s</string>
+    <string name="time_wday_date">%1$s %2$s %3$s</string>
+    <string name="wday_date">%2$s %3$s</string>
+    <string name="time_wday">%1$s %2$s</string>
+    <string name="same_year_md1_md2">%3$s. %2$s–%8$s. %7$s</string>
+    <string name="same_year_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string>
+    <string name="same_year_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string>
+    <string name="same_month_md1_time1_md2_time2">%5$s %3$s. %2$s–%10$s %8$s. %7$s</string>
+    <string name="same_year_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string>
+    <string name="same_month_wday1_md1_time1_wday2_md2_time2">%5$s %1$s %3$s. %2$s–%10$s %6$s %8$s. %7$s</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">%5$s %3$s. %2$s %4$s–%10$s %8$s. %7$s %9$s</string>
+    <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string>
+    <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%5$s %1$s %3$s. %2$s %4$s–%10$s %6$s %8$s. %7$s %9$s</string>
+    <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s %4$s–%6$s %8$s. %7$s %9$s</string>
+    <string name="same_month_md1_md2">%3$s.–%8$s. %2$s</string>
+    <string name="same_month_wday1_md1_wday2_md2">%1$s %3$s. %2$s–%6$s %8$s. %7$s</string>
+    <string name="same_year_mdy1_mdy2">%3$s. %2$s–%8$s. %7$s %9$s</string>
+    <string name="same_month_mdy1_mdy2">%3$s.–%8$s. %2$s %9$s</string>
+    <string name="same_year_wday1_mdy1_wday2_mdy2">%1$s %3$s. %2$s–%6$s %8$s. %7$s %9$s</string>
+    <string name="short_format_month">%b</string>
+</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 33d0159..875b4bc 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -21,6 +21,8 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;uten navn&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Mangler telefonnummer)"</string>
@@ -48,22 +50,29 @@
     <string name="BaMmi">"Samtaleblokkering"</string>
     <string name="PwdMmi">"Passordbytte"</string>
     <string name="PinMmi">"PIN-kode-bytte"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
     <string name="CLIRDefaultOnNextCallOn">"Nummervisning er begrenset som standard. Neste anrop: Begrenset"</string>
     <string name="CLIRDefaultOnNextCallOff">"Nummervisning er begrenset som standard. Neste anrop: Ikke begrenset"</string>
     <string name="CLIRDefaultOffNextCallOn">"Nummervisning er ikke begrenset som standard. Neste anrop: Begrenset"</string>
     <string name="CLIRDefaultOffNextCallOff">"Nummervisning er ikke begrenset som standard. Neste anrop: Ikke begrenset"</string>
     <string name="serviceNotProvisioned">"SIM-kortet er ikke tilrettelagt for tjenesten."</string>
     <string name="CLIRPermanent">"Kunne ikke endre innstilling for nummervisning."</string>
-    <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
-    <skip />
-    <!-- no translation found for RestrictedOnData (8653794784690065540) -->
-    <skip />
-    <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
-    <skip />
-    <!-- no translation found for RestrictedOnNormal (2045364908281990708) -->
-    <skip />
-    <!-- no translation found for RestrictedOnAll (4923139582141626159) -->
-    <skip />
+    <string name="RestrictedChangedTitle">"Endring i begrenset tilgang"</string>
+    <string name="RestrictedOnData">"Datatjenesten er blokkert."</string>
+    <string name="RestrictedOnEmergency">"Nødtjenesten er blokkert."</string>
+    <string name="RestrictedOnNormal">"Tale- og SMS-tjenesten er blokkert."</string>
+    <string name="RestrictedOnAll">"Alle tale- og SMS-tjenester er blokkert."</string>
     <string name="serviceClassVoice">"Tale"</string>
     <string name="serviceClassData">"Data"</string>
     <string name="serviceClassFAX">"Fax"</string>
@@ -72,11 +81,43 @@
     <string name="serviceClassDataSync">"Synkron"</string>
     <string name="serviceClassPacket">"Pakkedata"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderekoblet"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> etter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderekoblet"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Ikke viderekoblet"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"Nettsiden inneholder en feil."</string>
     <string name="httpErrorLookup">"Kunne ikke finne adressen."</string>
@@ -93,6 +134,8 @@
     <string name="httpErrorFile">"Kunne ikke åpne filen."</string>
     <string name="httpErrorFileNotFound">"Fant ikke den forespurte filen."</string>
     <string name="httpErrorTooManyRequests">"For mange forespørsler blir behandlet. Prøv igjen senere."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"Synkronisering"</string>
     <string name="contentServiceSyncNotificationTitle">"Synkronisering"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"For mange slettinger av <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -138,6 +181,10 @@
     <string name="permgroupdesc_systemTools">"Lavnivå tilgang og kontroll over systemet."</string>
     <string name="permgrouplab_developmentTools">"Utviklingsverktøy"</string>
     <string name="permgroupdesc_developmentTools">"Funksjonalitet kun utviklere trenger."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
     <string name="permlab_statusBar">"deaktivere eller endre statusfeltet"</string>
     <string name="permdesc_statusBar">"Lar applikasjonen deaktivere statusfeltet, samt legge til og fjerne systemikoner."</string>
     <string name="permlab_expandStatusBar">"utvide/slå sammen statusfeltet"</string>
@@ -170,6 +217,14 @@
     <string name="permdesc_forceBack">"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">"hente intern systemtilstand"</string>
     <string name="permdesc_dump">"Lar applikasjonen hente intern tilstand fra systemet. Onsdinnede applikasjoner kan hente et bredt spekter av privat og sikker informasjon som de vanligvis aldri burde ha behov for."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
     <string name="permlab_runSetActivityWatcher">"overvåke og kontrollere all applikasjonsoppstart"</string>
     <string name="permdesc_runSetActivityWatcher">"Lar applikasjonen overvåke og kontrollere hvordan systemet starter applikasjoner. Ondsinnede applikasjoner kan ta over systemet helt. Denne rettigheten behøves bare for utvikling, aldri for vanlig bruk av telefonen."</string>
     <string name="permlab_broadcastPackageRemoved">"kringkaste melding om fjernet pakke"</string>
@@ -184,6 +239,10 @@
     <string name="permdesc_setAlwaysFinish">"Lar applikasjonen kontrollere om aktiviteter alltid avsluttes når de sendes til bakgrunnen. Behøves aldri for vanlige applikasjoner."</string>
     <string name="permlab_batteryStats">"endre batteristatistikk"</string>
     <string name="permdesc_batteryStats">"Lar applikasjonen endre på innsamlet batteristatistikk. Ikke ment for vanlige applikasjoner."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
     <string name="permlab_internalSystemWindow">"vis uautoriserte vinduer"</string>
     <string name="permdesc_internalSystemWindow">"Tillater at det opprettes vinduer ment for bruk av systemets interne brukergrensesnitt. Ikke ment for vanlige applikasjoner."</string>
     <string name="permlab_systemAlertWindow">"vise advarsler på systemnivå"</string>
@@ -250,6 +309,10 @@
     <string name="permdesc_accessMockLocation">"Lage falske plassingskilder for testing. Ondsinnede applikasjoner kan bruke dette for å overstyre plasseringen og/eller statusen rapportert av ekte plasseringskilder slik som GPS eller nettverksoperatører."</string>
     <string name="permlab_accessLocationExtraCommands">"få tilgang til ekstra plasseringskommandoer"</string>
     <string name="permdesc_accessLocationExtraCommands">"Få tilgang til ekstra kommandoer for plasseringskilder. Ondsinnede applikasjoner kan bruke dette til å forstyrre GPS eller andre plasseringskilder."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
     <string name="permlab_accessFineLocation">"nøyaktig (GPS-) plassering"</string>
     <string name="permdesc_accessFineLocation">"Få tilgang til nøyaktige plasseringskilder som Global Positioning System (GPS) på telefonen, når det er tilgjengelig. Ondsinnede applikasjoner kan bruke dette for å finne ut hvor du er, og kan bruke mer batteri."</string>
     <string name="permlab_accessCoarseLocation">"grov (nettverksbasert) plassering"</string>
@@ -322,6 +385,10 @@
     <string name="permdesc_accessWifiState">"Lar applikasjonen få se informasjon om tilstanden til de trådløse nettene."</string>
     <string name="permlab_changeWifiState">"endre tilstand for trådløse nettverk"</string>
     <string name="permdesc_changeWifiState">"Lar applikasjonen koble til og fra trådløse aksesspunkt, og å gjøre endringer i konfigurerte trådløse nettverk."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
     <string name="permlab_bluetoothAdmin">"Bluetooth-administrasjon"</string>
     <string name="permdesc_bluetoothAdmin">"Lar applikasjonen konfigurere den lokale Bluetooth-telefonen, og å oppdage og pare med andre enheter."</string>
     <string name="permlab_bluetooth">"opprette Bluetooth-tilkoblinger"</string>
@@ -342,6 +409,10 @@
     <string name="permdesc_readDictionary">"Lar applikasjonen lese private ord, navn og uttrykk som brukeren har lagret i den brukerdefinerte ordlisten."</string>
     <string name="permlab_writeDictionary">"skrive til brukerdefinert ordliste"</string>
     <string name="permdesc_writeDictionary">"Lar applikasjonen skrive nye ord til den brukerdefinerte ordlisten."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
     <item>"Hjemme"</item>
     <item>"Mobil"</item>
@@ -358,6 +429,8 @@
     <item>"Annen"</item>
     <item>"Egendefinert…"</item>
   </string-array>
+    <!-- no translation found for mobileEmailTypeName (2858957283716687707) -->
+    <skip />
   <string-array name="postalAddressTypes">
     <item>"Hjemme"</item>
     <item>"Arbeid"</item>
@@ -398,29 +471,31 @@
     <string name="lockscreen_pattern_correct">"Riktig!"</string>
     <string name="lockscreen_pattern_wrong">"Beklager, prøv igjen:"</string>
     <string name="lockscreen_plugged_in">"Lader (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Koble til en batterilader."</string>
     <string name="lockscreen_missing_sim_message_short">"Mangler SIM-kort."</string>
     <string name="lockscreen_missing_sim_message">"Ikke noe SIM-kort i telefonen."</string>
     <string name="lockscreen_missing_sim_instructions">"Sett inn et SIM-kort."</string>
     <string name="lockscreen_network_locked_message">"Nettverk ikke tillatt"</string>
     <string name="lockscreen_sim_puk_locked_message">"SIM-kortet er PUK-låst."</string>
-    <!-- no translation found for lockscreen_sim_puk_locked_instructions (635967534992394321) -->
-    <skip />
+    <string name="lockscreen_sim_puk_locked_instructions">"Se manualen eller kontakt kundeservice."</string>
     <string name="lockscreen_sim_locked_message">"SIM-kortet er låst."</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"Låser opp SIM-kort…"</string>
     <string name="lockscreen_too_many_failed_attempts_dialog_message">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. "\n\n"Please try again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
     <string name="lockscreen_failed_attempts_almost_glogin">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using your Google sign-in."\n\n" Please try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"Prøv igjen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
     <string name="lockscreen_forgot_pattern_button_text">"Glemt mønsteret?"</string>
-    <string name="lockscreen_glogin_too_many_attempts">"Too many pattern attempts!"</string>
-    <string name="lockscreen_glogin_instructions">"To unlock,BREAKsign in with your Google account"</string>
-    <string name="lockscreen_glogin_username_hint">"Username (email)"</string>
-    <string name="lockscreen_glogin_password_hint">"Password"</string>
-    <string name="lockscreen_glogin_submit_button">"Sign in"</string>
-    <string name="lockscreen_glogin_invalid_input">"Invalid username or password."</string>
+    <string name="lockscreen_glogin_too_many_attempts">"For mange mønsterforsøk!"</string>
+    <string name="lockscreen_glogin_instructions">"For å låse opp, logg inn med Google-kontoen din"</string>
+    <string name="lockscreen_glogin_username_hint">"Brukernavn (e-post)"</string>
+    <string name="lockscreen_glogin_password_hint">"Passord"</string>
+    <string name="lockscreen_glogin_submit_button">"Logg inn"</string>
+    <string name="lockscreen_glogin_invalid_input">"Ugyldig brukernavn eller passord."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Fjern varslinger"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Ingen varslinger"</string>
     <string name="status_bar_ongoing_events_title">"Aktiviteter"</string>
     <string name="status_bar_latest_events_title">"Varslinger"</string>
@@ -429,6 +504,8 @@
     <string name="battery_low_title">"Koble til en lader"</string>
     <string name="battery_low_subtitle">"Batteriet er nesten tomt:"</string>
     <string name="battery_low_percent_format">"mindre enn <xliff:g id="NUMBER">%d%%</xliff:g> igjen."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"Factory test failed"</string>
     <string name="factorytest_not_system">"The FACTORY_TEST action is only supported for packages installed in /system/app."</string>
     <string name="factorytest_no_action">"No package was found that provides the FACTORY_TEST action."</string>
@@ -437,6 +514,14 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Naviger bort fra denne siden?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Velg OK for å fortsette, eller Avbryt for å forbli på denne siden."</string>
     <string name="save_password_label">"Bekreft"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
     <string name="save_password_message">"Ønsker du at nettleseren skal huske dette passordet?"</string>
     <string name="save_password_notnow">"Ikke nå"</string>
     <string name="save_password_remember">"Husk"</string>
@@ -544,14 +629,6 @@
     <string name="Noon">"Middag"</string>
     <string name="midnight">"midnatt"</string>
     <string name="Midnight">"Midnatt"</string>
-    <!-- no translation found for month_day (3693060561170538204) -->
-    <skip />
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month_day (3156047263406783231) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Merk alt"</string>
@@ -589,6 +666,8 @@
     <string name="anr_application_process">"Application <xliff:g id="APPLICATION">%1$s</xliff:g> (in process <xliff:g id="PROCESS">%2$s</xliff:g>) is not responding."</string>
     <string name="anr_process">"Process <xliff:g id="PROCESS">%1$s</xliff:g> is not responding."</string>
     <string name="force_close">"Force close"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
     <string name="wait">"Wait"</string>
     <string name="debug">"Debug"</string>
     <string name="sendText">"Select an action for text"</string>
@@ -642,22 +721,31 @@
     <string name="extmedia_format_title">"Formatere minnekort"</string>
     <string name="extmedia_format_message">"Er du sikker på at du ønsker å formatere minnekortet? Alle data på kortet vil gå tapt."</string>
     <string name="extmedia_format_button_format">"Format"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Velg inndatametode"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
     <string name="candidates_style">"TAG_FONT"<u>"kandidater"</u>"CLOSE_FONT"</string>
     <string name="ext_media_checking_notification_title">"Forbereder minnekort"</string>
-    <string name="ext_media_checking_notification_message">"Sjekker for feil"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"Tomt minnekort"</string>
-    <string name="ext_media_nofs_notification_message">"Minnekortet er tomt eller bruker et ustøttet filsystem."</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"Skadet minnekort"</string>
-    <string name="ext_media_unmountable_notification_message">"Minnekortet er skadet. Det kan være du må formatere kortet."</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"Minnekortet ble tatt ut uventet"</string>
     <string name="ext_media_badremoval_notification_message">"Avmonter minnekortet før det tas ut, for å unngå datatap."</string>
     <string name="ext_media_safe_unmount_notification_title">"Trygt å ta ut minnekort"</string>
-    <string name="ext_media_safe_unmount_notification_message">"Minnekortet kan nå trygt tas ut."</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
     <string name="ext_media_nomedia_notification_title">"Minnekortet ble tatt ut"</string>
-    <string name="ext_media_nomedia_notification_message">"Minnekortet ble tatt ut. Sett inn et nytt minnekort for å øke lagringsplassen."</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"Fant ingen tilsvarende aktiviteter"</string>
     <string name="permlab_pkgUsageStats">"oppdater statistikk over komponentbruk"</string>
     <string name="permdesc_pkgUsageStats">"Tillater endring av innsamlet data om bruk av komponenter. Ikke ment for vanlige applikasjoner."</string>
@@ -673,4 +761,8 @@
     <skip />
     <!-- no translation found for create_contact_using (4947405226788104538) -->
     <skip />
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index a418d72..cd1b460 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;zonder titel&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Geen telefoonnummer)"</string>
@@ -48,6 +49,12 @@
     <string name="BaMmi">"Oproep blokkeren"</string>
     <string name="PwdMmi">"Wachtwoordwijziging"</string>
     <string name="PinMmi">"PIN-wijziging"</string>
+    <string name="CnipMmi">"Nummer van beller beschikbaar"</string>
+    <string name="CnirMmi">"Nummer van beller beperkt"</string>
+    <string name="ThreeWCMmi">"Driewegs bellen"</string>
+    <string name="RuacMmi">"Ongewenste, vervelende oproepen weigeren"</string>
+    <string name="CndMmi">"Weergave van nummer van beller"</string>
+    <string name="DndMmi">"Niet storen"</string>
     <string name="CLIRDefaultOnNextCallOn">"Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: beperkt."</string>
     <string name="CLIRDefaultOnNextCallOff">"Beller-id standaard ingesteld op \'beperkt\'. Volgende oproep: onbeperkt."</string>
     <string name="CLIRDefaultOffNextCallOn">"Beller-id standaard ingesteld op \'onbeperkt\'. Volgende oproep: beperkt."</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Synchroniseren"</string>
     <string name="serviceClassPacket">"Pakket"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Roamingaanduiding aan"</string>
+    <string name="roamingText1">"Roamingaanduiding uit"</string>
+    <string name="roamingText2">"Roamingaanduiding knippert"</string>
+    <string name="roamingText3">"Uit de buurt"</string>
+    <string name="roamingText4">"Buiten het gebouw"</string>
+    <string name="roamingText5">"Roaming - Voorkeurssysteem"</string>
+    <string name="roamingText6">"Roaming - Beschikbaar systeem"</string>
+    <string name="roamingText7">"Roaming - Alliance-partner"</string>
+    <string name="roamingText8">"Roaming - Premium-partner"</string>
+    <string name="roamingText9">"Roaming - Volledige servicefunctionaliteit"</string>
+    <string name="roamingText10">"Roaming - Gedeeltelijke servicefunctionaliteit"</string>
+    <string name="roamingText11">"Roamingbanner aan"</string>
+    <string name="roamingText12">"Roamingbanner uit"</string>
+    <string name="roamingTextSearching">"Service zoeken"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> na <xliff:g id="TIME_DELAY">{2}</xliff:g> seconden"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: niet doorgeschakeld"</string>
+    <string name="fcComplete">"Functiecode voltooid."</string>
+    <string name="fcError">"Verbindingsprobleem of ongeldige functiecode."</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"De webpagina bevat een fout."</string>
     <string name="httpErrorLookup">"De URL kan niet worden gevonden."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"Het bestand kan niet worden geopend."</string>
     <string name="httpErrorFileNotFound">"Het opgevraagde bestand is niet gevonden."</string>
     <string name="httpErrorTooManyRequests">"Er worden te veel aanvragen verwerkt. Probeer het later opnieuw."</string>
+    <string name="certificateSaved">"Het certificaat is opgeslagen in de opslagruimte voor sleutels van het systeem."</string>
     <string name="contentServiceSync">"Synchroniseren"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchroniseren"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Te veel verwijderen voor <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Toegang tot en beheer van het systeem op lager niveau."</string>
     <string name="permgrouplab_developmentTools">"Ontwikkelingshulpprogramma\'s"</string>
     <string name="permgroupdesc_developmentTools">"Functies die alleen door toepassingsontwikkelaars worden gebruikt."</string>
+    <string name="permgrouplab_storage">"Opslagruimte"</string>
+    <string name="permgroupdesc_storage">"Toegang tot de SD-kaart."</string>
     <string name="permlab_statusBar">"statusbalk uitschakelen of wijzigen"</string>
     <string name="permdesc_statusBar">"Hiermee kan een toepassing de statusbalk uitschakelen of systeempictogrammen toevoegen en verwijderen."</string>
     <string name="permlab_expandStatusBar">"statusbalk uitvouwen/samenvouwen"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"interne systeemstatus ophalen"</string>
     <string name="permdesc_dump">"Hiermee kan een toepassing de interne status van het systeem ophalen. Schadelijke toepassingen kunnen privé- of veiligheidsgegevens ophalen die ze normaal niet nodig hebben."</string>
+    <string name="permlab_shutdown">"gedeeltelijke uitschakeling"</string>
+    <string name="permdesc_shutdown">"Hiermee wordt activiteitenbeheer uitgeschakeld. Er wordt geen volledige uitschakeling uitgevoerd."</string>
+    <string name="permlab_stopAppSwitches">"schakelen tussen toepassingen voorkomen"</string>
+    <string name="permdesc_stopAppSwitches">"Hiermee wordt voorkomen dat de gebruiker overschakelt naar een andere toepassing."</string>
     <string name="permlab_runSetActivityWatcher">"alle startende toepassingen bijhouden en beheren"</string>
     <string name="permdesc_runSetActivityWatcher">"Hiermee kan een toepassing de manier waarop het systeem activiteiten start, bijhouden en beheren. Schadelijke toepassingen kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal telefoongebruik."</string>
     <string name="permlab_broadcastPackageRemoved">"melding verzenden dat pakket is verwijderd"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Hiermee kan een toepassing bepalen of activiteiten altijd worden afgesloten zodra deze naar de achtergrond gaan. Nooit nodig voor normale toepassingen."</string>
     <string name="permlab_batteryStats">"accustatistieken aanpassen"</string>
     <string name="permdesc_batteryStats">"Hiermee kunnen verzamelde accustatistieken worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
+    <string name="permlab_backup">"systeemback-up en -herstel beheren"</string>
+    <string name="permdesc_backup">"Hiermee kan de toepassing het mechanisme voor systeemback-up en -herstel beheren. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_internalSystemWindow">"niet-geautoriseerde vensters weergeven"</string>
     <string name="permdesc_internalSystemWindow">"Hiermee kunnen vensters worden gemaakt die door de interne systeemgebruikersinterface worden gebruikt. Niet voor gebruik door normale toepassingen."</string>
     <string name="permlab_systemAlertWindow">"waarschuwingen op systeemniveau weergeven"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"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">"toegang opdrachten aanbieder extra locaties"</string>
     <string name="permdesc_accessLocationExtraCommands">"Toegang tot opdrachten aanbieder extra locaties. Schadelijke toepassingen kunnen hiervan gebruik maken om de werking van GPS of andere locatiebronnen te verstoren."</string>
+    <string name="permlab_installLocationProvider">"toestemming om een locatieprovider te installeren"</string>
+    <string name="permdesc_installLocationProvider">"Neplocatiebronnen voor testdoeleinden maken. Schadelijke toepassingen kunnen dit gebruiken om de locatie en/of status te overschrijven die door de echte locatiebronnen, zoals GPS of netwerkaanbieders, wordt aangegeven of om uw locatie bij te houden en te rapporteren aan externe bronnen."</string>
     <string name="permlab_accessFineLocation">"nauwkeurige (GPS) locatie"</string>
     <string name="permdesc_accessFineLocation">"Toegang tot exacte locatiebronnen, zoals het Global Positioning System op de telefoon, indien beschikbaar. Schadelijke toepassingen kunnen dit gebruiken om te bepalen waar u zich bevindt en mogelijk extra acculading verbruiken."</string>
     <string name="permlab_accessCoarseLocation">"globale (netwerkgebaseerde) locatie"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Hiermee kan een toepassing informatie over de Wi-Fi-status bekijken."</string>
     <string name="permlab_changeWifiState">"Wi-Fi-status wijzigen"</string>
     <string name="permdesc_changeWifiState">"Hiermee kan een toepassing zich koppelen aan en loskoppelen van Wi-Fi toegangspunten en wijzigingen aanbrengen in geconfigureerde Wi-Fi-netwerken."</string>
+    <string name="permlab_changeWifiMulticastState">"Wi-Fi Multicast-ontvangst toestaan"</string>
+    <string name="permdesc_changeWifiMulticastState">"Hiermee kan een toepassing pakketten ontvangen die niet rechtstreeks zijn geadresseerd aan uw apparaat. Dit kan handig zijn wanneer services in de buurt worden ontdekt. Dit verbruikt meer energie dan de niet-multicastmodus."</string>
     <string name="permlab_bluetoothAdmin">"bluetooth-beheer"</string>
     <string name="permdesc_bluetoothAdmin">"Hiermee kan een toepassing de lokale Bluetooth-telefoon configureren en externe apparaten zoeken en aansluiten."</string>
     <string name="permlab_bluetooth">"Bluetooth-verbindingen maken"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Hiermee kan een toepassing privéwoorden, namen en woordcombinaties lezen die de gebruiker heeft opgeslagen in het gebruikerswoordenboek."</string>
     <string name="permlab_writeDictionary">"schrijven naar door gebruiker gedefinieerd woordenboek"</string>
     <string name="permdesc_writeDictionary">"Hiermee kan een toepassing nieuwe woorden schrijven naar het gebruikerswoordenboek."</string>
+    <string name="permlab_sdcardWrite">"inhoud op de SD-kaart aanpassen/verwijderen"</string>
+    <string name="permdesc_sdcardWrite">"Hiermee kan een toepassing schrijven naar de SD-kaart."</string>
   <string-array name="phoneTypes">
     <item>"Thuis"</item>
     <item>"Mobiel"</item>
@@ -353,6 +391,7 @@
     <item>"Overig"</item>
     <item>"Aangepast"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Mobiel"</string>
   <string-array name="postalAddressTypes">
     <item>"Thuis"</item>
     <item>"Werk"</item>
@@ -393,6 +432,8 @@
     <string name="lockscreen_pattern_correct">"Juist!"</string>
     <string name="lockscreen_pattern_wrong">"Probeer het opnieuw"</string>
     <string name="lockscreen_plugged_in">"Opladen (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Sluit de oplader aan."</string>
     <string name="lockscreen_missing_sim_message_short">"Geen SIM-kaart."</string>
     <string name="lockscreen_missing_sim_message">"Geen SIM-kaart in telefoon."</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Gebruikersnaam of wachtwoord ongeldig."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Meldingen wissen"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Geen meldingen"</string>
     <string name="status_bar_ongoing_events_title">"Actief"</string>
     <string name="status_bar_latest_events_title">"Meldingen"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Sluit de oplader aan"</string>
     <string name="battery_low_subtitle">"De accu raakt op:"</string>
     <string name="battery_low_percent_format">"minder dan <xliff:g id="NUMBER">%d%%</xliff:g> resterend."</string>
+    <string name="battery_low_why">"Waarom?"</string>
     <string name="factorytest_failed">"Fabriekstest mislukt"</string>
     <string name="factorytest_not_system">"De actie FACTORY_TEST wordt alleen ondersteund voor pakketten die zijn geïnstalleerd in /system/app."</string>
     <string name="factorytest_no_action">"Er is geen pakket gevonden dat de actie FACTORY_TEST levert."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Wilt u deze pagina verlaten?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Kies OK om door te gaan of Annuleren om op de huidige pagina te blijven."</string>
     <string name="save_password_label">"Bevestigen"</string>
+    <string name="permlab_readHistoryBookmarks">"browsergeschiedenis en bladwijzers lezen"</string>
+    <string name="permdesc_readHistoryBookmarks">"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">"browsergeschiedenis en bladwijzers schrijven"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Wilt u dat de browser dit wachtwoord onthoudt?"</string>
     <string name="save_password_notnow">"Niet nu"</string>
     <string name="save_password_remember">"Onthouden"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Twaalf uur \'s middags"</string>
     <string name="midnight">"middernacht"</string>
     <string name="Midnight">"Middernacht"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Alles selecteren"</string>
@@ -579,6 +622,7 @@
     <string name="anr_application_process">"Toepassing <xliff:g id="APPLICATION">%1$s</xliff:g> (in proces <xliff:g id="PROCESS">%2$s</xliff:g>) reageert niet."</string>
     <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> reageert niet."</string>
     <string name="force_close">"Nu sluiten"</string>
+    <string name="report">"Rapport"</string>
     <string name="wait">"Wachten"</string>
     <string name="debug">"Foutopsporing"</string>
     <string name="sendText">"Selecteer een actie voor tekst"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"SD-kaart formatteren"</string>
     <string name="extmedia_format_message">"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">"Formatteren"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Invoermethode selecteren"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"kandidaten"</u></string>
     <string name="ext_media_checking_notification_title">"SD-kaart voorbereiden"</string>
-    <string name="ext_media_checking_notification_message">"Controleren op fouten"</string>
+    <string name="ext_media_checking_notification_message">"Controleren op fouten."</string>
     <string name="ext_media_nofs_notification_title">"Lege SD-kaart"</string>
-    <string name="ext_media_nofs_notification_message">"De SD-kaart is leeg of gebruikt een niet-ondersteund bestandssysteem."</string>
+    <string name="ext_media_nofs_notification_message">"SD-kaart is leeg of heeft een niet-ondersteund bestandssysteem."</string>
     <string name="ext_media_unmountable_notification_title">"Beschadigde SD-kaart"</string>
-    <string name="ext_media_unmountable_notification_message">"De SD-kaart is beschadigd. U moet de kaart mogelijk opnieuw formatteren."</string>
+    <string name="ext_media_unmountable_notification_message">"SD-kaart beschadigd. U moet de kaart mogelijk opnieuw formatteren."</string>
     <string name="ext_media_badremoval_notification_title">"SD-kaart onverwachts verwijderd"</string>
     <string name="ext_media_badremoval_notification_message">"Ontkoppel de SD-kaart voordat u deze verwijdert om gegevensverlies te voorkomen."</string>
     <string name="ext_media_safe_unmount_notification_title">"De SD-kaart kan veilig worden verwijderd"</string>
-    <string name="ext_media_safe_unmount_notification_message">"De SD-kaart kan nu veilig worden verwijderd."</string>
+    <string name="ext_media_safe_unmount_notification_message">"U kunt de SD-kaart veilig verwijderen."</string>
     <string name="ext_media_nomedia_notification_title">"SD-kaart is verwijderd"</string>
-    <string name="ext_media_nomedia_notification_message">"De SD-kaart is verwijderd. Plaats een nieuwe SD-kaart om de opslagcapaciteit van uw apparaat te vergroten."</string>
+    <string name="ext_media_nomedia_notification_message">"SD-kaart verwijderd. Plaats een nieuwe."</string>
     <string name="activity_list_empty">"Geen overeenkomende activiteiten gevonden"</string>
     <string name="permlab_pkgUsageStats">"gebruiksstatistieken van component bijwerken"</string>
     <string name="permdesc_pkgUsageStats">"Hiermee kunnen verzamelde gebruiksstatistieken van een component worden gewijzigd. Niet voor gebruik door normale toepassingen."</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Uitvoeren"</string>
     <string name="dial_number_using">"Nummer bellen"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Contact maken"\n"met <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="accessibility_compound_button_selected">"aangevinkt"</string>
+    <string name="accessibility_compound_button_unselected">"niet aangevinkt"</string>
 </resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index c6c9bd0..65f3ad1 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"&lt;bez nazwy&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Brak numeru telefonu)"</string>
@@ -41,19 +42,25 @@
     <string name="invalidPin">"Wpisz kod PIN o długości od 4 do 8 cyfr."</string>
     <string name="needPuk">"Karta SIM jest zablokowana kodem PUK. Wprowadź kod PUK, aby odblokować kartę."</string>
     <string name="needPuk2">"Wprowadź kod PUK2, aby odblokować kartę SIM."</string>
-    <string name="ClipMmi">"Identyfikator dzwoniącego przy połączeniach przychodzących"</string>
-    <string name="ClirMmi">"Identyfikator dzwoniącego przy połączeniach wychodzących"</string>
+    <string name="ClipMmi">"Identyfikator rozmówcy przy połączeniach przychodzących"</string>
+    <string name="ClirMmi">"Identyfikator rozmówcy przy połączeniach wychodzących"</string>
     <string name="CfMmi">"Przekierowania połączeń"</string>
     <string name="CwMmi">"Połączenia oczekujące"</string>
     <string name="BaMmi">"Blokada dzwonienia"</string>
     <string name="PwdMmi">"Zmiana hasła"</string>
     <string name="PinMmi">"Zmiana kodu PIN"</string>
-    <string name="CLIRDefaultOnNextCallOn">"Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: zastrzeżony"</string>
-    <string name="CLIRDefaultOnNextCallOff">"Identyfikator dzwoniącego ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
-    <string name="CLIRDefaultOffNextCallOn">"Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: zastrzeżony"</string>
-    <string name="CLIRDefaultOffNextCallOff">"Identyfikator dzwoniącego ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
+    <string name="CnipMmi">"Numer telefonu, z którego wykonywane jest połączenie, widoczny"</string>
+    <string name="CnirMmi">"Numer telefonujący zastrzeżony"</string>
+    <string name="ThreeWCMmi">"Połączenie dla trzech abonentów"</string>
+    <string name="RuacMmi">"Odrzucanie niepożądanych, irytujących połączeń"</string>
+    <string name="CndMmi">"Dostarczanie numeru telefonującego"</string>
+    <string name="DndMmi">"Nie przeszkadzać"</string>
+    <string name="CLIRDefaultOnNextCallOn">"Identyfikator rozmówcy ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: zastrzeżony"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Identyfikator rozmówcy ustawiony jest domyślnie na „zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Identyfikator rozmówcy ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: zastrzeżony"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Identyfikator rozmówcy ustawiony jest domyślnie na „nie zastrzeżony”. Następne połączenie: nie zastrzeżony"</string>
     <string name="serviceNotProvisioned">"Usługa nie jest świadczona."</string>
-    <string name="CLIRPermanent">"Nie można zmienić ustawienia identyfikatora dzwoniącego."</string>
+    <string name="CLIRPermanent">"Nie można zmienić ustawienia identyfikatora rozmówcy."</string>
     <string name="RestrictedChangedTitle">"Zmieniono ograniczenie dostępu"</string>
     <string name="RestrictedOnData">"Usługa transmisji danych jest zablokowana."</string>
     <string name="RestrictedOnEmergency">"Usługa połączeń alarmowych jest zablokowana."</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"Synchronizacja"</string>
     <string name="serviceClassPacket">"Pakiet"</string>
     <string name="serviceClassPAD">"PAD"</string>
+    <string name="roamingText0">"Wskaźnik roamingu włączony"</string>
+    <string name="roamingText1">"Wskaźnik roamingu wyłączony"</string>
+    <string name="roamingText2">"Migający wskaźnik roamingu"</string>
+    <string name="roamingText3">"W innej okolicy"</string>
+    <string name="roamingText4">"Poza biurem"</string>
+    <string name="roamingText5">"Roaming – preferowany system"</string>
+    <string name="roamingText6">"Roaming – dostępny system"</string>
+    <string name="roamingText7">"Roaming – partner stowarzyszony"</string>
+    <string name="roamingText8">"Roaming – partner Premium"</string>
+    <string name="roamingText9">"Roaming – pełna funkcjonalność usługi"</string>
+    <string name="roamingText10">"Roaming – częściowa funkcjonalność usługi"</string>
+    <string name="roamingText11">"Baner roamingu włączony"</string>
+    <string name="roamingText12">"Baner roamingu wyłączony"</string>
+    <string name="roamingTextSearching">"Wyszukiwanie usługi"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> po <xliff:g id="TIME_DELAY">{2}</xliff:g> sekundach"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: nieprzekierowane"</string>
+    <string name="fcComplete">"Wykonano kod funkcji."</string>
+    <string name="fcError">"Problem z połączeniem lub nieprawidłowy kod funkcji."</string>
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"Strona sieci Web zawiera błąd."</string>
     <string name="httpErrorLookup">"Nie można odszukać adresu URL."</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"Nie można uzyskać dostępu do pliku."</string>
     <string name="httpErrorFileNotFound">"Nie znaleziono żądanego pliku."</string>
     <string name="httpErrorTooManyRequests">"Zbyt wiele żądań jest przetwarzanych. Spróbuj ponownie później."</string>
+    <string name="certificateSaved">"Certyfikat jest zapisywany w magazynie kluczy systemu."</string>
     <string name="contentServiceSync">"Synchronizacja"</string>
     <string name="contentServiceSyncNotificationTitle">"Synchronizuj"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Zbyt wiele usuwanych <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -108,9 +132,9 @@
     <string name="global_action_toggle_silent_mode">"Tryb cichy"</string>
     <string name="global_action_silent_mode_on_status">"Dźwięk jest wyłączony"</string>
     <string name="global_action_silent_mode_off_status">"Dźwięk jest włączony"</string>
-    <string name="global_actions_toggle_airplane_mode">"Tryb lotniczy"</string>
-    <string name="global_actions_airplane_mode_on_status">"Tryb lotniczy jest włączony"</string>
-    <string name="global_actions_airplane_mode_off_status">"Tryb lotniczy jest wyłączony"</string>
+    <string name="global_actions_toggle_airplane_mode">"Tryb samolotowy"</string>
+    <string name="global_actions_airplane_mode_on_status">"Tryb samolotowy jest włączony"</string>
+    <string name="global_actions_airplane_mode_off_status">"Tryb samolotowy jest wyłączony"</string>
     <string name="safeMode">"Tryb awaryjny"</string>
     <string name="android_system_label">"System Android"</string>
     <string name="permgrouplab_costMoney">"Usługi płatne"</string>
@@ -119,8 +143,8 @@
     <string name="permgroupdesc_messages">"Czytanie i zapisywanie wiadomości SMS, e-mail i innych"</string>
     <string name="permgrouplab_personalInfo">"Informacje osobiste"</string>
     <string name="permgroupdesc_personalInfo">"Bezpośredni dostęp do kontaktów i kalendarza zapisanych w telefonie."</string>
-    <string name="permgrouplab_location">"Twoje położenie"</string>
-    <string name="permgroupdesc_location">"Monitorowanie fizycznego położenia"</string>
+    <string name="permgrouplab_location">"Twoja lokalizacja"</string>
+    <string name="permgroupdesc_location">"Monitorowanie fizycznej lokalizacji"</string>
     <string name="permgrouplab_network">"Połączenia sieciowe"</string>
     <string name="permgroupdesc_network">"Pozwól aplikacjom na dostęp do różnych funkcji sieci."</string>
     <string name="permgrouplab_accounts">"Twoje konta Google"</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"Dostęp i kontrola systemu niższego poziomu."</string>
     <string name="permgrouplab_developmentTools">"Narzędzia programistyczne"</string>
     <string name="permgroupdesc_developmentTools">"Funkcje potrzebne jedynie programistom"</string>
+    <string name="permgrouplab_storage">"Pamięć"</string>
+    <string name="permgroupdesc_storage">"Dostęp do karty SD."</string>
     <string name="permlab_statusBar">"wyłączanie lub zmienianie paska stanu"</string>
     <string name="permdesc_statusBar">"Pozwala aplikacjom na wyłączenie paska stanu lub dodawanie i usuwanie ikon systemowych."</string>
     <string name="permlab_expandStatusBar">"rozwijanie/zwijanie paska stanu"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"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">"pobieranie informacji o wewnętrznym stanie systemu"</string>
     <string name="permdesc_dump">"Pozwala aplikacjom na pobieranie informacji o wewnętrznym stanie systemu. Szkodliwe aplikacje mogą pobrać szeroką gamę osobistych i zabezpieczonych informacji, które normalnie nie powinny im być nigdy potrzebne."</string>
+    <string name="permlab_shutdown">"częściowe wyłączenie"</string>
+    <string name="permdesc_shutdown">"Przełącza menedżera aktywności w stan wyłączenia. Nie wykonuje pełnego wyłączenia."</string>
+    <string name="permlab_stopAppSwitches">"zapobieganie przełączaniu aplikacji"</string>
+    <string name="permdesc_stopAppSwitches">"Zapobiega przełączaniu aplikacji na inną przez użytkownika."</string>
     <string name="permlab_runSetActivityWatcher">"monitorowanie i kontrolowanie wszystkich uruchamianych aplikacji"</string>
     <string name="permdesc_runSetActivityWatcher">"Pozwala aplikacji na monitorowanie i kontrolowanie sposobu, w jaki w systemie uruchamiane są różne działania. Szkodliwe aplikacje mogą całkowicie przejąć system. Te uprawnienia potrzebne są tylko programistom, nigdy w przypadku normalnego wykorzystywania telefonu."</string>
     <string name="permlab_broadcastPackageRemoved">"wysyłanie transmisji informującej o usuniętym pakiecie"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"Pozwala aplikacji na kontrolowanie, czy czynności są zawsze kończone, kiedy zaczynają działać w tle. Nigdy nie jest potrzebne normalnym aplikacjom."</string>
     <string name="permlab_batteryStats">"zmienianie statystyk dotyczących baterii"</string>
     <string name="permdesc_batteryStats">"Pozwala na zmianę zebranych statystyk dotyczących baterii. Nie do wykorzystania przez normalne aplikacje."</string>
+    <string name="permlab_backup">"kontrolowanie tworzenia i przywracania kopii zapasowych systemu"</string>
+    <string name="permdesc_backup">"Umożliwia aplikacji kontrolowanie mechanizmu tworzenia i przywracania kopii zapasowych systemu. Nie jest przeznaczone do użytku dla zwykłych aplikacji."</string>
     <string name="permlab_internalSystemWindow">"wyświetlanie nieuwierzytelnionych okien"</string>
     <string name="permdesc_internalSystemWindow">"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">"wyświetlanie ostrzeżeń systemowych"</string>
@@ -243,12 +275,14 @@
     <string name="permdesc_writeCalendar">"Pozwala aplikacji na zmianę wydarzeń z kalendarza zapisanych w telefonie. Szkodliwe aplikacje mogą to wykorzystać, aby usunąć lub zmienić dane w kalendarzu."</string>
     <string name="permlab_accessMockLocation">"udawanie źródeł położenia dla testów"</string>
     <string name="permdesc_accessMockLocation">"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">"dostęp do dodatkowych poleceń dostawcy informacji o położeniu"</string>
-    <string name="permdesc_accessLocationExtraCommands">"Dostęp do dodatkowych poleceń dostawcy informacji o położeniu. Szkodliwe aplikacje mogą go wykorzystać, aby wpływać na działanie urządzenia GPS lub innych źródeł ustalania położenia."</string>
-    <string name="permlab_accessFineLocation">"dokładne położenie (GPS)"</string>
+    <string name="permlab_accessLocationExtraCommands">"dostęp do dodatkowych poleceń dostawcy informacji o lokalizacji"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Dostęp do dodatkowych poleceń dostawcy informacji o lokalizacji. Szkodliwe aplikacje mogą go wykorzystać, aby wpływać na działanie urządzenia GPS lub innych źródeł ustalania lokalizacji."</string>
+    <string name="permlab_installLocationProvider">"uprawnienia do instalowania dostawcy danych o lokalizacji"</string>
+    <string name="permdesc_installLocationProvider">"Utwórz sztuczne źródła danych o lokalizacji na potrzeby testowania. Złośliwe aplikacje mogą korzystać z tej opcji w celu zastępowania danych o lokalizacji i/lub stanie zwracanych przez prawdziwe źródła danych o lokalizacji, takie jak odbiornik GPS lub dostawcy sieciowi, bądź monitorowania i zgłaszania lokalizacji do źródeł zewnętrznych."</string>
+    <string name="permlab_accessFineLocation">"dokładna lokalizacja (GPS)"</string>
     <string name="permdesc_accessFineLocation">"Uzyskiwanie dostępu do dokładnych źródeł ustalania położenia w telefonie, takich jak system GPS, tam, gdzie są one dostępne. Szkodliwe aplikacje mogą to wykorzystać do określenia położenia użytkownika oraz mogą zużywać więcej energii baterii."</string>
-    <string name="permlab_accessCoarseLocation">"przybliżone ustalanie położenia (oparte o sieć)"</string>
-    <string name="permdesc_accessCoarseLocation">"Dostęp do źródeł, takich jak bazy danych sieci komórkowych, jeśli są dostępne, które pozwalają określić przybliżone położenie telefonu. Szkodliwe aplikacje mogą go wykorzystać do określenia, gdzie w przybliżeniu znajduje się użytkownik."</string>
+    <string name="permlab_accessCoarseLocation">"przybliżone ustalanie lokalizacji (oparte o sieć)"</string>
+    <string name="permdesc_accessCoarseLocation">"Dostęp do źródeł, takich jak bazy danych sieci komórkowych, jeśli są dostępne, które pozwalają określić przybliżoną lokalizację telefonu. Szkodliwe aplikacje mogą go wykorzystać do określenia, gdzie w przybliżeniu znajduje się użytkownik."</string>
     <string name="permlab_accessSurfaceFlinger">"dostęp do usługi SurfaceFlinger"</string>
     <string name="permdesc_accessSurfaceFlinger">"Pozwala aplikacji na wykorzystanie funkcji niskiego poziomu usługi SurfaceFlinger."</string>
     <string name="permlab_readFrameBuffer">"czytanie bufora ramki"</string>
@@ -277,14 +311,14 @@
     <string name="permdesc_callPhone">"Pozwala aplikacjom na dzwonienie pod numery telefonów bez interwencji użytkownika. Szkodliwe aplikacje mogą powodować występowanie niespodziewanych połączeń na rachunku telefonicznym. Należy zauważyć, że aplikacje nie mogą dzwonić na numery alarmowe."</string>
     <string name="permlab_callPrivileged">"bezpośrednie wybieranie dowolnych numerów telefonu"</string>
     <string name="permdesc_callPrivileged">"Pozwala aplikacji dzwonić na dowolny numer telefonu, włącznie z numerami alarmowymi, bez interwencji użytkownika. Szkodliwe aplikacje mogą wykonywać niepotrzebne i nielegalne połączenia z usługami alarmowymi."</string>
-    <string name="permlab_locationUpdates">"kontrolowanie powiadomień o aktualizacji położenia"</string>
-    <string name="permdesc_locationUpdates">"Pozwala włączyć/wyłączyć powiadomienia o aktualizacji położenia przez radio. Nie wykorzystywane przez normalne aplikacje."</string>
+    <string name="permlab_locationUpdates">"kontrolowanie powiadomień o aktualizacjach lokalizacji"</string>
+    <string name="permdesc_locationUpdates">"Pozwala włączyć/wyłączyć powiadomienia o aktualizacjach lokalizacji przez sieć bezprzewodową. Nie wykorzystywane przez normalne aplikacje."</string>
     <string name="permlab_checkinProperties">"dostęp do właściwości usługi rezerwacji"</string>
     <string name="permdesc_checkinProperties">"Pozwala na dostęp z uprawnieniami do odczytu/zapisu do właściwości przesłanych przez usługę rezerwacji. Nie wykorzystywane przez normalne aplikacje."</string>
     <string name="permlab_bindGadget">"wybieranie widżetów"</string>
     <string name="permdesc_bindGadget">"Zezwala aplikacjom na wskazywanie systemowi, które widżety mogą być używane przez inne aplikacje. Z użyciem tego pozwolenia aplikacje mogą udzielać dostępu do danych osobistych innym aplikacjom. Nie jest ono przeznaczone dla zwykłych aplikacji."</string>
     <string name="permlab_modifyPhoneState">"zmiana stanu telefonu"</string>
-    <string name="permdesc_modifyPhoneState">"Pozwala aplikacji na kontrolowanie funkcji telefonu w urządzeniu. Aplikacja z tymi uprawnieniami może przełączać sieci, włączać i wyłączać radio itp. bez informowania użytkownika."</string>
+    <string name="permdesc_modifyPhoneState">"Pozwala aplikacji na kontrolowanie funkcji telefonu w urządzeniu. Aplikacja z tymi uprawnieniami może zmieniać, włączać i wyłączać sieci bezprzewodowe itp. bez informowania użytkownika."</string>
     <string name="permlab_readPhoneState">"czytanie stanu telefonu"</string>
     <string name="permdesc_readPhoneState">"Pozwala aplikacji na dostęp do funkcji telefonu w urządzeniu. Aplikacja z takim uprawnieniem może określić numer tego telefonu, czy jest nawiązane połączenie, numer, z którym jest ono nawiązane, itp."</string>
     <string name="permlab_wakeLock">"zapobieganie przejściu telefonu w stan uśpienia"</string>
@@ -305,7 +339,7 @@
     <string name="permdesc_getAccounts">"Pozwala aplikacji na pobranie listy kont zapisanych w telefonie."</string>
     <string name="permlab_accessNetworkState">"wyświetlanie stanu sieci"</string>
     <string name="permdesc_accessNetworkState">"Pozwala aplikacji na wyświetlanie stanu wszystkich sieci."</string>
-    <string name="permlab_createNetworkSockets">"pełen dostęp do Internetu"</string>
+    <string name="permlab_createNetworkSockets">"pełen dostęp do internetu"</string>
     <string name="permdesc_createNetworkSockets">"Pozwala aplikacji na tworzenie gniazd sieciowych."</string>
     <string name="permlab_writeApnSettings">"zapisywanie ustawień nazwy punktu dostępowego (APN, Access Point Name)"</string>
     <string name="permdesc_writeApnSettings">"Pozwala aplikacji na zmianę ustawień APN, takich jak serwer proxy oraz port dowolnego APN."</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"Pozwala aplikacji na wyświetlanie informacji o stanie Wi-Fi."</string>
     <string name="permlab_changeWifiState">"zmiana stanu Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Pozwala aplikacji na łączenie i rozłączanie z punktami dostępowymi Wi-Fi oraz na dokonywanie zmian skonfigurowanych sieci Wi-Fi."</string>
+    <string name="permlab_changeWifiMulticastState">"zezwolenie na odbiór grupowych połączeń Wi-Fi"</string>
+    <string name="permdesc_changeWifiMulticastState">"Umożliwia aplikacji odbieranie pakietów nieskierowanych bezpośrednio do Twojego urządzenia. Może to być przydatne przy wykrywaniu usług oferowanych w okolicy. Powoduje większe zapotrzebowanie na energię niż w trybie innym niż grupowy."</string>
     <string name="permlab_bluetoothAdmin">"administrowanie Bluetooth"</string>
     <string name="permdesc_bluetoothAdmin">"Pozwala aplikacji na konfigurowanie lokalnego telefonu Bluetooth, wyszukiwanie urządzeń zdalnych i łączenie się z nimi."</string>
     <string name="permlab_bluetooth">"tworzenie połączeń Bluetooth"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"Zezwala aplikacji na odczytywanie wszelkich prywatnych słów, nazw i wyrażeń zapisanych przez użytkownika w swoim słowniku."</string>
     <string name="permlab_writeDictionary">"zapisywanie w słowniku zdefiniowanym przez użytkownika"</string>
     <string name="permdesc_writeDictionary">"Zezwala aplikacjom na zapisywanie nowych słów w słowniku użytkownika."</string>
+    <string name="permlab_sdcardWrite">"modyfikowanie/usuwanie zawartości karty SD"</string>
+    <string name="permdesc_sdcardWrite">"Umożliwia aplikacji zapis na karcie SD."</string>
   <string-array name="phoneTypes">
     <item>"Dom"</item>
     <item>"Komórka"</item>
@@ -353,6 +391,7 @@
     <item>"Inne"</item>
     <item>"Niestandardowy"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Komórka"</string>
   <string-array name="postalAddressTypes">
     <item>"Dom"</item>
     <item>"Praca"</item>
@@ -393,6 +432,8 @@
     <string name="lockscreen_pattern_correct">"Poprawnie!"</string>
     <string name="lockscreen_pattern_wrong">"Niestety, spróbuj ponownie"</string>
     <string name="lockscreen_plugged_in">"Ładowanie (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Podłącz ładowarkę."</string>
     <string name="lockscreen_missing_sim_message_short">"Brak karty SIM."</string>
     <string name="lockscreen_missing_sim_message">"Brak karty SIM w telefonie."</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"Błędna nazwa użytkownika lub hasło."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Wyczyść powiadomienia"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Brak powiadomień"</string>
     <string name="status_bar_ongoing_events_title">"Bieżące"</string>
     <string name="status_bar_latest_events_title">"Powiadomienia"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"Podłącz ładowarkę"</string>
     <string name="battery_low_subtitle">"Bateria się rozładowuje:"</string>
     <string name="battery_low_percent_format">"pozostało mniej niż <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <string name="battery_low_why">"Dlaczego?"</string>
     <string name="factorytest_failed">"Nieudany test fabryczny"</string>
     <string name="factorytest_not_system">"Czynność FACTORY_TEST jest obsługiwana tylko dla pakietów zainstalowanych w katalogu /system/app."</string>
     <string name="factorytest_no_action">"Nie znaleziono żadnego pakietu, który zapewnia działanie FACTORY_TEST."</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Czy opuścić tę stronę?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Wybierz opcję OK, aby kontynuować, lub opcję Anuluj, aby pozostać na tej stronie."</string>
     <string name="save_password_label">"Potwierdź"</string>
+    <string name="permlab_readHistoryBookmarks">"odczyt historii i zakładek przeglądarki"</string>
+    <string name="permdesc_readHistoryBookmarks">"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">"zapis historii i zakładek przeglądarki"</string>
+    <string name="permdesc_writeHistoryBookmarks">"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="save_password_message">"Czy chcesz, aby zapamiętać to hasło w przeglądarce?"</string>
     <string name="save_password_notnow">"Nie teraz"</string>
     <string name="save_password_remember">"Zapamiętaj"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"Południe"</string>
     <string name="midnight">"północ"</string>
     <string name="Midnight">"Północ"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Zaznacz wszystko"</string>
@@ -579,9 +622,10 @@
     <string name="anr_application_process">"Aplikacja <xliff:g id="APPLICATION">%1$s</xliff:g> (w procesie <xliff:g id="PROCESS">%2$s</xliff:g>) nie odpowiada."</string>
     <string name="anr_process">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> nie odpowiada."</string>
     <string name="force_close">"Wymuś zamknięcie"</string>
+    <string name="report">"Zgłoś"</string>
     <string name="wait">"Czekaj"</string>
     <string name="debug">"Debuguj"</string>
-    <string name="sendText">"Wybierz czynność dla wpisanego tekstu"</string>
+    <string name="sendText">"Jak wysłać tekst?"</string>
     <string name="volume_ringtone">"Głośność dzwonka"</string>
     <string name="volume_music">"Głośność multimediów"</string>
     <string name="volume_music_hint_playing_through_bluetooth">"Odtwarzanie przez Bluetooth"</string>
@@ -590,8 +634,8 @@
     <string name="volume_alarm">"Głośność alarmu"</string>
     <string name="volume_notification">"Głośność powiadomienia"</string>
     <string name="volume_unknown">"Głośność"</string>
-    <string name="ringtone_default">"Domyślny dzwonek"</string>
-    <string name="ringtone_default_with_actual">"Domyślny dzwonek (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_default">"Dzwonek domyślny"</string>
+    <string name="ringtone_default_with_actual">"Dzwonek domyślny (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"Cichy"</string>
     <string name="ringtone_picker_title">"Dzwonki"</string>
     <string name="ringtone_unknown">"Nieznany dzwonek"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"Formatuj kartę SD"</string>
     <string name="extmedia_format_message">"Czy na pewno sformatować kartę SD? Wszystkie dane na karcie zostaną utracone."</string>
     <string name="extmedia_format_button_format">"Formatuj"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"Sposób wprowadzania tekstu"</string>
     <string name="fast_scroll_alphabet">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"kandydaci"</u></string>
     <string name="ext_media_checking_notification_title">"Przygotowywanie karty SD"</string>
-    <string name="ext_media_checking_notification_message">"Sprawdzanie w poszukiwaniu błędów"</string>
+    <string name="ext_media_checking_notification_message">"Sprawdzanie w poszukiwaniu błędów."</string>
     <string name="ext_media_nofs_notification_title">"Pusta karta SD"</string>
-    <string name="ext_media_nofs_notification_message">"Karta SD jest pusta lub używa nieobsługiwanego systemu plików."</string>
+    <string name="ext_media_nofs_notification_message">"Karta SD jest pusta lub zawiera nieobsługiwany system plików."</string>
     <string name="ext_media_unmountable_notification_title">"Uszkodzona karta SD"</string>
-    <string name="ext_media_unmountable_notification_message">"Karta SD jest uszkodzona. Konieczne może być przeformatowanie karty."</string>
+    <string name="ext_media_unmountable_notification_message">"Karta SD jest uszkodzona. Konieczne może być ponowne sformatowanie."</string>
     <string name="ext_media_badremoval_notification_title">"Karta SD została nieoczekiwanie wyjęta"</string>
     <string name="ext_media_badremoval_notification_message">"Odłącz kartę SD przed jej wyjęciem, aby uniknąć utraty danych."</string>
     <string name="ext_media_safe_unmount_notification_title">"Można bezpiecznie usunąć kartę SD"</string>
-    <string name="ext_media_safe_unmount_notification_message">"Można teraz bezpiecznie usunąć kartę SD."</string>
+    <string name="ext_media_safe_unmount_notification_message">"Możesz bezpiecznie wyjąć kartę SD."</string>
     <string name="ext_media_nomedia_notification_title">"Usunięta karta SD"</string>
-    <string name="ext_media_nomedia_notification_message">"Karta SD została usunięta. Włóż nową kartę SD, aby zwiększyć pamięć urządzenia."</string>
+    <string name="ext_media_nomedia_notification_message">"Karta SD została wyjęta. Włóż nową kartę."</string>
     <string name="activity_list_empty">"Nie znaleziono pasujących działań"</string>
     <string name="permlab_pkgUsageStats">"aktualizowanie statystyk użycia komponentu"</string>
     <string name="permdesc_pkgUsageStats">"Zezwala na modyfikacje zebranych statystyk użycia komponentu. Nieprzeznaczone dla zwykłych aplikacji."</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"Wykonaj"</string>
     <string name="dial_number_using">"Połącz"\n"z numerem <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Utwórz kontakt"\n"dla numeru <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="accessibility_compound_button_selected">"zaznaczone"</string>
+    <string name="accessibility_compound_button_unselected">"niezaznaczone"</string>
 </resources>
diff --git a/core/res/res/values-pt-rBR/donottranslate-cldr.xml b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
index 4729055..1111658 100644
--- a/core/res/res/values-pt-rBR/donottranslate-cldr.xml
+++ b/core/res/res/values-pt-rBR/donottranslate-cldr.xml
@@ -95,7 +95,7 @@
     <string name="hour_minute_ampm">%-l:%M %p</string>
     <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
     <string name="twelve_hour_time_format">h:mm a</string>
-    <string name="twenty_four_hour_time_format">H'h'mm</string>
+    <string name="twenty_four_hour_time_format">H\'h\'mm</string>
     <string name="numeric_date">%d/%m/%Y</string>
     <string name="numeric_date_format">dd/MM/yyyy</string>
     <string name="numeric_date_template">"%s/%s/%s"</string>
diff --git a/core/res/res/values-pt-rPT/donottranslate-cldr.xml b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
index f38a2d0..197cb6e 100644
--- a/core/res/res/values-pt-rPT/donottranslate-cldr.xml
+++ b/core/res/res/values-pt-rPT/donottranslate-cldr.xml
@@ -95,7 +95,7 @@
     <string name="hour_minute_ampm">%-l:%M %p</string>
     <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
     <string name="twelve_hour_time_format">h:mm a</string>
-    <string name="twenty_four_hour_time_format">H'h'mm</string>
+    <string name="twenty_four_hour_time_format">H\'h\'mm</string>
     <string name="numeric_date">%d/%m/%Y</string>
     <string name="numeric_date_format">dd/MM/yyyy</string>
     <string name="numeric_date_template">"%s/%s/%s"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..d4623f9
--- /dev/null
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -0,0 +1,765 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
+    <string name="untitled">"&lt;sem título&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Nenhum número de telefone)"</string>
+    <string name="unknownName">"(Desconhecido)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Correio de voz"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Problema de ligação ou código MMI inválido."</string>
+    <string name="serviceEnabled">"O serviço foi activado."</string>
+    <string name="serviceEnabledFor">"O serviço foi activado para:"</string>
+    <string name="serviceDisabled">"O serviço foi desactivado."</string>
+    <string name="serviceRegistered">"O registo foi bem sucedido."</string>
+    <string name="serviceErased">"A eliminação foi bem sucedida."</string>
+    <string name="passwordIncorrect">"Palavra-passe incorrecta."</string>
+    <string name="mmiComplete">"MMI concluído."</string>
+    <string name="badPin">"O PIN antigo que introduziu não está correcto."</string>
+    <string name="badPuk">"O PUK que introduziu não está correcto."</string>
+    <string name="mismatchPin">"Os PINs que introduziu não coincidem."</string>
+    <string name="invalidPin">"Introduza um PIN entre 4 e 8 números."</string>
+    <string name="needPuk">"O seu cartão SIM está bloqueado com PUK. Introduza o código PUK para desbloqueá-lo."</string>
+    <string name="needPuk2">"Introduza o PUK2 para desbloquear o cartão SIM."</string>
+    <string name="ClipMmi">"ID do Autor da Chamada"</string>
+    <string name="ClirMmi">"ID do autor da chamada efectuada"</string>
+    <string name="CfMmi">"Encaminhamento de chamadas"</string>
+    <string name="CwMmi">"Chamada em espera"</string>
+    <string name="BaMmi">"Barramento de chamadas"</string>
+    <string name="PwdMmi">"Alteração de palavra-passe"</string>
+    <string name="PinMmi">"Alteração de PIN"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"ID do autor da chamada é predefinido como restrito. Chamada seguinte: Restrita"</string>
+    <string name="CLIRDefaultOnNextCallOff">"ID do autor da chamada é predefinido como restrito. Chamada seguinte: Não restrita"</string>
+    <string name="CLIRDefaultOffNextCallOn">"ID do autor da chamada é predefinido como não restrito. Chamada seguinte: Restrita"</string>
+    <string name="CLIRDefaultOffNextCallOff">"ID do autor da chamada é predefinido com não restrito. Chamada seguinte: Não restrita"</string>
+    <string name="serviceNotProvisioned">"Serviço não fornecido."</string>
+    <string name="CLIRPermanent">"Não é possível mudar o ID do autor da chamada."</string>
+    <string name="RestrictedChangedTitle">"Acesso restrito modificado"</string>
+    <string name="RestrictedOnData">"O serviço de dados está bloqueado."</string>
+    <string name="RestrictedOnEmergency">"O serviço de emergência está bloqueado."</string>
+    <string name="RestrictedOnNormal">"O serviço de voz/SMS está bloqueado."</string>
+    <string name="RestrictedOnAll">"Todos os serviços de voz/SMS estão bloqueados."</string>
+    <string name="serviceClassVoice">"Voz"</string>
+    <string name="serviceClassData">"Dados"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Assíncronos"</string>
+    <string name="serviceClassDataSync">"Sincronização"</string>
+    <string name="serviceClassPacket">"Pacote"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não reencaminhado"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> após <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não reencaminhado"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não reencaminhado"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"A página Web contém um erro."</string>
+    <string name="httpErrorLookup">"Não foi possível localizar o URL."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"O esquema de autenticação do site não é suportado."</string>
+    <string name="httpErrorAuth">"A autenticação falhou."</string>
+    <string name="httpErrorProxyAuth">"A·autenticação·através·do·servidor·proxy·falhou."</string>
+    <string name="httpErrorConnect">"Não foi possível estabelecer a ligação ao servidor."</string>
+    <string name="httpErrorIO">"O servidor falhou ao comunicar. Tente novamente mais tarde."</string>
+    <string name="httpErrorTimeout">"Esgotou o tempo limite da ligação ao servidor."</string>
+    <string name="httpErrorRedirectLoop">"A página contém demasiados redireccionamentos do servidor."</string>
+    <string name="httpErrorUnsupportedScheme">"O protocolo não é suportado."</string>
+    <string name="httpErrorFailedSslHandshake">"Não foi possível estabelecer uma ligação segura."</string>
+    <string name="httpErrorBadUrl">"Não foi possível abrir a página porque o URL é inválido."</string>
+    <string name="httpErrorFile">"Não foi possível aceder ao ficheiro."</string>
+    <string name="httpErrorFileNotFound">"Não foi possível localizar o ficheiro pedido."</string>
+    <string name="httpErrorTooManyRequests">"Existem demasiados pedidos em processamento. Tente novamente mais tarde."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Sincronização"</string>
+    <string name="contentServiceSyncNotificationTitle">"Sincronização"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Demasiadas eliminações de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="low_memory">"O armazenamento do telefone está cheio! Elimine alguns ficheiros para libertar espaço."</string>
+    <string name="me">"Eu"</string>
+    <string name="power_dialog">"Opções do telefone"</string>
+    <string name="silent_mode">"Modo silencioso"</string>
+    <string name="turn_on_radio">"Activar sem fios"</string>
+    <string name="turn_off_radio">"Desactivar sem fios"</string>
+    <string name="screen_lock">"Bloqueio de ecrã"</string>
+    <string name="power_off">"Desligar"</string>
+    <string name="shutdown_progress">"A encerrar..."</string>
+    <string name="shutdown_confirm">"O seu telefone irá encerrar."</string>
+    <string name="no_recent_tasks">"Nenhuma aplicação recente."</string>
+    <string name="global_actions">"Opções do telefone"</string>
+    <string name="global_action_lock">"Bloqueio de ecrã"</string>
+    <string name="global_action_power_off">"Desligar"</string>
+    <string name="global_action_toggle_silent_mode">"Modo silencioso"</string>
+    <string name="global_action_silent_mode_on_status">"Som desactivado"</string>
+    <string name="global_action_silent_mode_off_status">"O som está activado"</string>
+    <string name="global_actions_toggle_airplane_mode">"Modo de avião"</string>
+    <string name="global_actions_airplane_mode_on_status">"O modo de voo está activado"</string>
+    <string name="global_actions_airplane_mode_off_status">"O modo de voo está desactivado"</string>
+    <string name="safeMode">"Modo seguro"</string>
+    <string name="android_system_label">"Sistema Android"</string>
+    <string name="permgrouplab_costMoney">"Serviços que implicam pagamento"</string>
+    <string name="permgroupdesc_costMoney">"Permite às aplicações efectuar acções que implicam pagamento."</string>
+    <string name="permgrouplab_messages">"As suas mensagens"</string>
+    <string name="permgroupdesc_messages">"Leia e escreva a sua SMS, o seu e-mail e outras mensagens."</string>
+    <string name="permgrouplab_personalInfo">"Os seus dados pessoais"</string>
+    <string name="permgroupdesc_personalInfo">"Acesso directo aos seus contactos e calendário armazenados no telefone."</string>
+    <string name="permgrouplab_location">"A sua localização"</string>
+    <string name="permgroupdesc_location">"Monitorizar a sua localização física"</string>
+    <string name="permgrouplab_network">"Comunicação de rede"</string>
+    <string name="permgroupdesc_network">"Permite o acesso de aplicações a várias funcionalidades de rede."</string>
+    <string name="permgrouplab_accounts">"As suas Contas Google"</string>
+    <string name="permgroupdesc_accounts">"Aceda às Contas Google disponíveis."</string>
+    <string name="permgrouplab_hardwareControls">"Controlos de hardware"</string>
+    <string name="permgroupdesc_hardwareControls">"Aceda directamente ao hardware no telefone."</string>
+    <string name="permgrouplab_phoneCalls">"Chamadas"</string>
+    <string name="permgroupdesc_phoneCalls">"Monitorize, grave e processe chamadas telefónicas."</string>
+    <string name="permgrouplab_systemTools">"Ferramentas do sistema"</string>
+    <string name="permgroupdesc_systemTools">"Acesso e controlo de nível inferior do sistema."</string>
+    <string name="permgrouplab_developmentTools">"Ferramentas de desenvolvimento"</string>
+    <string name="permgroupdesc_developmentTools">"Funcionalidades apenas necessárias para programadores de aplicações."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"desactivar ou modificar barra de estado"</string>
+    <string name="permdesc_statusBar">"Permite à aplicação desactivar a barra de estado ou adicionar e remover ícones do sistema."</string>
+    <string name="permlab_expandStatusBar">"expandir/fechar barra de estado"</string>
+    <string name="permdesc_expandStatusBar">"Permite à aplicação expandir ou fechar a barra de estado."</string>
+    <string name="permlab_processOutgoingCalls">"interceptar chamadas efectuadas"</string>
+    <string name="permdesc_processOutgoingCalls">"Permite à aplicação processar chamadas efectuadas e mudar o número a marcar. Algumas aplicações maliciosas podem monitorizar, redireccionar ou impedir chamadas efectuadas."</string>
+    <string name="permlab_receiveSms">"receber SMS"</string>
+    <string name="permdesc_receiveSms">"Permite à aplicação receber e processar mensagens SMS. Algumas aplicações maliciosas podem monitorizar as suas mensagens e eliminá-las sem mostrá-las a si."</string>
+    <string name="permlab_receiveMms">"receber MMS"</string>
+    <string name="permdesc_receiveMms">"Permite à aplicação receber e processar mensagens MMS. Algumas aplicações maliciosas podem monitorizar as mensagens ou eliminá-las sem mostrá-las ao utilizador."</string>
+    <string name="permlab_sendSms">"enviar mensagens SMS"</string>
+    <string name="permdesc_sendSms">"Permite à aplicação enviar mensagens SMS. Algumas aplicações maliciosas podem fazer com que incorra em custos, enviando mensagens sem a sua confirmação."</string>
+    <string name="permlab_readSms">"ler SMS ou MMS"</string>
+    <string name="permdesc_readSms">"Permite à aplicação ler mensagens SMS armazenadas no seu telefone ou cartão SIM. Algumas aplicações maliciosas podem ler as suas mensagens confidenciais."</string>
+    <string name="permlab_writeSms">"editar SMS ou MMS"</string>
+    <string name="permdesc_writeSms">"Permite a aplicações escrever mensagens SMS armazenadas no seu telefone ou cartão SIM. Algumas aplicações maliciosas podem eliminar as suas mensagens."</string>
+    <string name="permlab_receiveWapPush">"receber WAP"</string>
+    <string name="permdesc_receiveWapPush">"Permite à aplicação receber e processar mensagens WAP. Algumas aplicações maliciosas podem monitorizar ou eliminá-las sem mostrá-las ao utilizador."</string>
+    <string name="permlab_getTasks">"obter aplicações em execução"</string>
+    <string name="permdesc_getTasks">"Permite à aplicação obter informações sobre tarefas actualmente em execução e recentemente executadas. Pode permitir que aplicações maliciosas descubram informações privadas sobre outras aplicações."</string>
+    <string name="permlab_reorderTasks">"reordenar aplicações em execução"</string>
+    <string name="permdesc_reorderTasks">"Permite a uma aplicação mover tarefas do primeiro e do segundo planos.  Algumas aplicações maliciosas podem impor-se no primeiro plano sem o controlo do utilizador."</string>
+    <string name="permlab_setDebugApp">"activar depuração da aplicação"</string>
+    <string name="permdesc_setDebugApp">"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">"mudar definições da IU"</string>
+    <string name="permdesc_changeConfiguration">"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>
+    <string name="permlab_restartPackages">"reiniciar outras aplicações"</string>
+    <string name="permdesc_restartPackages">"Permite a uma aplicação efectuar o reinício forçado de outras aplicações."</string>
+    <string name="permlab_forceBack">"forçar fecho da aplicação"</string>
+    <string name="permdesc_forceBack">"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">"obter estado interno do sistema"</string>
+    <string name="permdesc_dump">"Permite à aplicação obter o estado interno do sistema. Algumas aplicações maliciosas podem obter uma ampla variedade de dados privados e seguros de que, normalmente, nunca devem necessitar."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"monitorizar a controlar a iniciação de todas as aplicações"</string>
+    <string name="permdesc_runSetActivityWatcher">"Permite a uma aplicação monitorizar e controlar a forma como o sistema inicia actividades. Algumas aplicações maliciosas podem comprometer totalmente o sistema. Esta autorização apenas é necessária para desenvolvimento, nunca para a utilização normal do telefone."</string>
+    <string name="permlab_broadcastPackageRemoved">"enviar difusão de pacote removido"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Permite a uma aplicação difundir uma notificação de que foi removido um pacote de aplicações. Algumas aplicações maliciosas podem utilizar este item para eliminar qualquer outra aplicação em execução."</string>
+    <string name="permlab_broadcastSmsReceived">"enviar difusão recebida por SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Permite a uma aplicação difundir uma notificação de que foi recebida uma mensagem SMS. Algumas aplicações maliciosas podem utilizar este item para falsificar mensagens SMS a receber."</string>
+    <string name="permlab_broadcastWapPush">"enviar difusão recebida através de PUSH WAP"</string>
+    <string name="permdesc_broadcastWapPush">"Permite a uma aplicação difundir uma notificação de que foi recebida uma mensagens PUSH WAP. Algumas aplicações maliciosas podem utilizar este item para falsificar um recibo de mensagem MMS ou substituir, de forma silenciosa, o conteúdo de qualquer página Web por variantes maliciosas."</string>
+    <string name="permlab_setProcessLimit">"número limite de processos em execução"</string>
+    <string name="permdesc_setProcessLimit">"Permite a um aplicação controlar o número máximo de processos que será executado. Nunca é necessário para aplicações normais."</string>
+    <string name="permlab_setAlwaysFinish">"fazer com que todas as aplicações de fundo fechem"</string>
+    <string name="permdesc_setAlwaysFinish">"Permite a uma aplicação controlar se as actividades são sempre terminadas assim que passam para o fundo. Nunca é necessário para aplicações normais."</string>
+    <string name="permlab_batteryStats">"modificar estatísticas da bateria"</string>
+    <string name="permdesc_batteryStats">"Permite a modificação das estatísticas recolhidas sobre a bateria. Não se destina a utilização por aplicações normais."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"apresentar janelas não autorizadas"</string>
+    <string name="permdesc_internalSystemWindow">"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">"apresentar alertas ao nível do sistema"</string>
+    <string name="permdesc_systemAlertWindow">"Permite a um aplicação mostrar janelas de alerta do sistema. Algumas aplicações maliciosas podem ocupar todo o ecrã do telefone."</string>
+    <string name="permlab_setAnimationScale">"modificar velocidade global da animação"</string>
+    <string name="permdesc_setAnimationScale">"Permite a uma aplicação mudar a velocidade global da animação (animações mais rápidas ou mais lentas) em qualquer altura."</string>
+    <string name="permlab_manageAppTokens">"gerir tokens de aplicações"</string>
+    <string name="permdesc_manageAppTokens">"Permite a aplicações criar e gerir os seus próprios tokens, ignorando a ordenação normal dos mesmos pelo eixo dos Z. Nunca deve ser necessário para aplicações normais."</string>
+    <string name="permlab_injectEvents">"premir teclas e botões de controlo"</string>
+    <string name="permdesc_injectEvents">"Permite a uma aplicação fornecer os seus próprios eventos de entrada (toques em teclas, etc.) a outras aplicações. Algumas aplicações maliciosas podem utilizar este item para controlar o telefone."</string>
+    <string name="permlab_readInputState">"gravar o que utilizador escreve e as acções que efectua"</string>
+    <string name="permdesc_readInputState">"Permite às aplicações verificar as teclas que o utilizador prime, mesmo ao interagir com outras aplicações (como, por exemplo, ao introduzir uma palavra-passe). Nunca deve ser necessário para aplicações normais."</string>
+    <string name="permlab_bindInputMethod">"vincular a um método de entrada"</string>
+    <string name="permdesc_bindInputMethod">"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_setOrientation">"mudar orientação do ecrã"</string>
+    <string name="permdesc_setOrientation">"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">"enviar sinais Linux para aplicações"</string>
+    <string name="permdesc_signalPersistentProcesses">"Permite à aplicação pedir que o sinal fornecido seja enviado a todos os processos persistentes."</string>
+    <string name="permlab_persistentActivity">"fazer com que a aplicação seja sempre executada"</string>
+    <string name="permdesc_persistentActivity">"Permite a uma aplicação tornar persistentes partes da mesma, para que o sistema não possa utilizá-la para outras aplicações."</string>
+    <string name="permlab_deletePackages">"eliminar aplicações"</string>
+    <string name="permdesc_deletePackages">"Permite a uma aplicação eliminar pacotes do Android. Algumas aplicações maliciosas podem utilizar este item para eliminar aplicações importantes."</string>
+    <string name="permlab_clearAppUserData">"eliminar dados de outras aplicações"</string>
+    <string name="permdesc_clearAppUserData">"Permite a uma aplicação limpar dados do proprietário."</string>
+    <string name="permlab_deleteCacheFiles">"eliminar caches de outras aplicações"</string>
+    <string name="permdesc_deleteCacheFiles">"Permite a uma aplicação eliminar ficheiros em cache."</string>
+    <string name="permlab_getPackageSize">"medir espaço de armazenamento da aplicação"</string>
+    <string name="permdesc_getPackageSize">"Permite a uma aplicação obter os respectivos código, dados e tamanhos de cache"</string>
+    <string name="permlab_installPackages">"instalar aplicações directamente"</string>
+    <string name="permdesc_installPackages">"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">"eliminar todos os dados da aplicações"</string>
+    <string name="permdesc_clearAppCache">"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>
+    <string name="permlab_readLogs">"ler ficheiros de registo do sistema"</string>
+    <string name="permdesc_readLogs">"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">"ler/escrever em recursos propriedade de diag"</string>
+    <string name="permdesc_diagnostic">"Permite a uma aplicação ler e escrever em qualquer recurso que seja propriedade do grupo diag. Por exemplo, ficheiros em /dev. Isto pode afectar potencialmente a estabilidade e a segurança do sistema e deve ser utilizado APENAS para diagnósticos específicos do hardware pelo fabricante ou pelo operador."</string>
+    <string name="permlab_changeComponentState">"activar ou desactivar componentes da aplicação"</string>
+    <string name="permdesc_changeComponentState">"Permite a uma aplicação mudar a opção de activar ou não um componente de outra aplicação. Algumas aplicações maliciosas podem utilizar este item para desactivar funcionalidades importantes do telefone. É necessário ter cuidado com a autorização, uma vez que é possível tornar alguns componentes de aplicações num estado inutilizável, inconsistente ou instável."</string>
+    <string name="permlab_setPreferredApplications">"definir aplicações preferidas"</string>
+    <string name="permdesc_setPreferredApplications">"Permite a uma aplicação modificar as suas aplicações preferidas. Isto pode permitir que algumas aplicações maliciosas mudem, de forma silenciosa, as aplicações executadas, falsificando as aplicações existentes para recolher os seus dados privados."</string>
+    <string name="permlab_writeSettings">"modificar definições globais do sistema"</string>
+    <string name="permdesc_writeSettings">"Permite a uma aplicação modificar os dados das definições do sistema. Algumas aplicações maliciosas podem danificar as configurações do sistema."</string>
+    <string name="permlab_writeSecureSettings">"modificar definições seguras do sistema"</string>
+    <string name="permdesc_writeSecureSettings">"Permite a uma aplicação modificar os dados de definições seguras dos sistemas. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_writeGservices">"modificar o mapa de serviços do Google"</string>
+    <string name="permdesc_writeGservices">"Permite a uma aplicação modificar o mapa de serviços do Google. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_receiveBootCompleted">"iniciar automaticamente no arranque"</string>
+    <string name="permdesc_receiveBootCompleted">"Permite que uma aplicação se inicie automaticamente assim que tiver terminado o arranque do sistema. Isto pode demorar o início do telefone e permitir à aplicação abrandar todo o funcionamento do telefone, uma vez que está em constante execução."</string>
+    <string name="permlab_broadcastSticky">"enviar difusão fixa"</string>
+    <string name="permdesc_broadcastSticky">"Permite a uma aplicação enviar difusões fixas, que permanecem após o fim da difusão. Algumas aplicações maliciosas podem tornar o telefone lento ou instável, fazendo com que utilize demasiada memória."</string>
+    <string name="permlab_readContacts">"ler dados de contacto"</string>
+    <string name="permdesc_readContacts">"Permite a uma aplicação ler todos os dados de contactos (endereços) armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar este item para enviar os seus dados a outras pessoas."</string>
+    <string name="permlab_writeContacts">"escrever dados de contacto"</string>
+    <string name="permdesc_writeContacts">"Permite a uma aplicação modificar os dados de contacto (endereço) armazenados no seu telefone. Algumas aplicações maliciosas podem utilizar estes dados para apagar ou modificar os dados dos seus contactos."</string>
+    <string name="permlab_writeOwnerData">"escrever dados do proprietário"</string>
+    <string name="permdesc_writeOwnerData">"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">"ler dados do proprietário"</string>
+    <string name="permdesc_readOwnerData">"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">"ler dados do calendário"</string>
+    <string name="permdesc_readCalendar">"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">"escrever dados do calendário"</string>
+    <string name="permdesc_writeCalendar">"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>
+    <string name="permlab_accessMockLocation">"fontes de localização fictícias para teste"</string>
+    <string name="permdesc_accessMockLocation">"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">"aceder a comandos adicionais do fornecedor de localização"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Aceda a comandos adicionais do fornecedor de localização. Algumas aplicações maliciosas podem utilizar este item para interferir com o funcionamento do GPS ou de outras fontes de localização."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"localização exacta (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Aceder a fontes de localização específicas, tais como o Sistema de Posicionamento Global (GPS), no telefone, se disponível. Algumas aplicações maliciosas podem utilizar este item para determinar a localização do utilizador e podem consumir energia adicional da bateria."</string>
+    <string name="permlab_accessCoarseLocation">"localização aproximada (baseada na rede)"</string>
+    <string name="permdesc_accessCoarseLocation">"Aceda a fontes de localização aproximadas, tais como a base de dados da rede celular, para determinar uma localização aproximada do telefone, se disponível. Algumas aplicações maliciosas podem utilizar este item para determinar aproximadamente onde o utilizador se encontra."</string>
+    <string name="permlab_accessSurfaceFlinger">"aceder a SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Permite às aplicações utilizar funcionalidades de SurfaceFlinger de nível inferior."</string>
+    <string name="permlab_readFrameBuffer">"ler memória intermédia de fotogramas"</string>
+    <string name="permdesc_readFrameBuffer">"Permite·à·aplicação·ler·o·conteúdo·da·memória·intermédia·de·fotogramas."</string>
+    <string name="permlab_modifyAudioSettings">"mudar as suas definições de áudio"</string>
+    <string name="permdesc_modifyAudioSettings">"Permite à aplicação modificar as definições de áudio globais, tais como o volume e o encaminhamento."</string>
+    <string name="permlab_recordAudio">"gravar áudio"</string>
+    <string name="permdesc_recordAudio">"Permite à aplicação aceder ao caminho de gravação de áudio."</string>
+    <string name="permlab_camera">"tirar fotografias"</string>
+    <string name="permdesc_camera">"Permite à aplicação tirar fotografias com a câmara. Isto permite que a aplicação recolha imagens captadas pela câmara em qualquer momento."</string>
+    <string name="permlab_brick">"desactivar telefone de forma permanente"</string>
+    <string name="permdesc_brick">"Permite à aplicação desactivar permanentemente todo o telefone. Esta acção é muito perigosa."</string>
+    <string name="permlab_reboot">"forçar reinício do telefone"</string>
+    <string name="permdesc_reboot">"Permite à aplicação forçar o reinício do telefone."</string>
+    <string name="permlab_mount_unmount_filesystems">"montar e desmontar sistemas de ficheiros"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Permite à aplicação montar e desmontar sistemas de ficheiros para armazenamento removível."</string>
+    <string name="permlab_mount_format_filesystems">"formatar armazenamento externo"</string>
+    <string name="permdesc_mount_format_filesystems">"Permite a uma aplicação formatar o armazenamento removível."</string>
+    <string name="permlab_vibrate">"controlar vibrador"</string>
+    <string name="permdesc_vibrate">"Permite à aplicação controlar o vibrador."</string>
+    <string name="permlab_flashlight">"controlar lanterna"</string>
+    <string name="permdesc_flashlight">"Permite à aplicação controlar a lanterna."</string>
+    <string name="permlab_hardware_test">"testar hardware"</string>
+    <string name="permdesc_hardware_test">"Permite à aplicação controlar vários periféricos para fins de teste de hardware."</string>
+    <string name="permlab_callPhone">"marcar números de telefone directamente"</string>
+    <string name="permdesc_callPhone">"Permite à aplicação marcar números de telefone sem a intervenção do utilizador. Algumas aplicações maliciosas podem provocar o aparecimento de chamadas inesperadas na sua conta telefónica. Tenha em atenção que isto não permite à aplicação marcar números de emergência."</string>
+    <string name="permlab_callPrivileged">"marcar directamente quaisquer números de telefone"</string>
+    <string name="permdesc_callPrivileged">"Permite à aplicação marcar qualquer número de telefone, incluindo números de emergência, sem a intervenção do utilizador. Algumas aplicações maliciosas podem efectuar chamadas desnecessárias e ilegais para serviços de emergência."</string>
+    <string name="permlab_locationUpdates">"controlar notificações de actualização de localização"</string>
+    <string name="permdesc_locationUpdates">"Permite a activação/desactivação de notificações de actualização de localização a partir do rádio. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_checkinProperties">"aceder a propriedades de verificação"</string>
+    <string name="permdesc_checkinProperties">"Permite acesso de leitura/escrita a propriedades carregadas pelo serviço de verificação. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_bindGadget">"escolher miniaplicações"</string>
+    <string name="permdesc_bindGadget">"Permite à aplicação informar o sistema acerca das miniaplicações que podem ser utilizadas com cada aplicação. Com esta autorização, algumas aplicações podem conceder acesso a dados pessoais a outras aplicações. Não se destina a utilização por aplicações normais."</string>
+    <string name="permlab_modifyPhoneState">"modificar estado do telefone"</string>
+    <string name="permdesc_modifyPhoneState">"Permite à aplicação controlar as funcionalidades do telefone do dispositivo. Uma aplicação com esta autorização pode alternar entre redes, ligar e desligar o rádio do telefone, etc., sem nunca notificar o utilizador."</string>
+    <string name="permlab_readPhoneState">"ler estado do telefone"</string>
+    <string name="permdesc_readPhoneState">"Permite à aplicação aceder às funcionalidades do dispositivo. Uma aplicação com esta autorização pode determinar o número deste telefone, se existe uma chamada activa, o número a que a essa chamada está ligada, entre outras."</string>
+    <string name="permlab_wakeLock">"impedir que o telefone entre em inactividade"</string>
+    <string name="permdesc_wakeLock">"Permite a uma aplicação impedir o telefone de entrar em inactividade."</string>
+    <string name="permlab_devicePower">"ligar ou desligar o telefone"</string>
+    <string name="permdesc_devicePower">"Permite a uma aplicação ligar ou desligar o telefone."</string>
+    <string name="permlab_factoryTest">"executar em modo de teste de fábrica"</string>
+    <string name="permdesc_factoryTest">"Executar como um teste de nível inferior do fabricante, permitindo o acesso total ao hardware do telefone. Apenas disponível quando um telefone está em execução em modo de teste do fabricante."</string>
+    <string name="permlab_setWallpaper">"definir imagem de fundo"</string>
+    <string name="permdesc_setWallpaper">"Permite à aplicação definir a imagem de fundo do sistema."</string>
+    <string name="permlab_setWallpaperHints">"definir sugestões de tamanho da imagem de fundo"</string>
+    <string name="permdesc_setWallpaperHints">"Permitir que a aplicação defina as sugestões de tamanho da imagem de fundo do sistema."</string>
+    <string name="permlab_masterClear">"repor definições de fábrica do sistemas"</string>
+    <string name="permdesc_masterClear">"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_setTimeZone">"definir fuso horário"</string>
+    <string name="permdesc_setTimeZone">"Permite a uma aplicação mudar o fuso horário do telefone."</string>
+    <string name="permlab_getAccounts">"descobrir contas reconhecidas"</string>
+    <string name="permdesc_getAccounts">"Permite a uma aplicação obter a lista de contas reconhecidas pelo telefone."</string>
+    <string name="permlab_accessNetworkState">"ver estado da rede"</string>
+    <string name="permdesc_accessNetworkState">"Permite a uma aplicação ver o estado de todas as redes."</string>
+    <string name="permlab_createNetworkSockets">"acesso total à Internet"</string>
+    <string name="permdesc_createNetworkSockets">"Permite a uma aplicação criar sockets de rede."</string>
+    <string name="permlab_writeApnSettings">"escrever definições de Nome do ponto de acesso"</string>
+    <string name="permdesc_writeApnSettings">"Permite a uma aplicaçaõ modificar as definições de APN, tais como Proxy e Porta de qualquer APN."</string>
+    <string name="permlab_changeNetworkState">"mudar conectividade de rede"</string>
+    <string name="permdesc_changeNetworkState">"Permite a uma aplicação mudar o estado da conectividade de rede."</string>
+    <string name="permlab_changeBackgroundDataSetting">"mudar definição de utilização de dados de segundo plano"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Permite a uma aplicação mudar a definição de utilização de dados de segundo plano."</string>
+    <string name="permlab_accessWifiState">"ver estado de Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Permite a uma aplicação ver as informações acerca do estado do Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"mudar estado de Wi-Fi"</string>
+    <string name="permdesc_changeWifiState">"Permite a uma aplicação ligar e desligar de pontos de acesso de Wi-Fi, bem como efectuar alterações a redes Wi-Fi configuradas."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"administração de bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Permite a uma aplicação configurar o telefone Bluetooth local, bem como descobrir e emparelhar com dispositivos remotos."</string>
+    <string name="permlab_bluetooth">"criar ligações Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Permite a uma aplicação ver a configuração do telefone Bluetooth local, bem como efectuar e aceitar ligações com dispositivos emparelhados."</string>
+    <string name="permlab_disableKeyguard">"desactivar bloqueio de teclas"</string>
+    <string name="permdesc_disableKeyguard">"Permite a uma aplicação desactivar o bloqueio de teclas e qualquer segurança por palavra-passe associada. Um exemplo legítimo é a desactivação do bloqueio de teclas pelo telefone ao receber uma chamada, reactivando, em seguida, o bloqueio de teclas ao terminar a chamada."</string>
+    <string name="permlab_readSyncSettings">"ler definições de sincronização"</string>
+    <string name="permdesc_readSyncSettings">"Permite a uma aplicação ler as definições de sincronização como, por exemplo, se a sincronização está activada para Contactos."</string>
+    <string name="permlab_writeSyncSettings">"definições de sincronização de escrita"</string>
+    <string name="permdesc_writeSyncSettings">"Permite a uma aplicação modificar as definições de sincronização como, por exemplo, se a sincronização está activada para Contactos."</string>
+    <string name="permlab_readSyncStats">"ler estatísticas de sincronização"</string>
+    <string name="permdesc_readSyncStats">"Permite a uma aplicação ler as estatísticas de sincronização, por exemplo, o histórico de sincronizações ocorridas."</string>
+    <string name="permlab_subscribedFeedsRead">"ler feeds subscritos"</string>
+    <string name="permdesc_subscribedFeedsRead">"Permite a uma aplicação obter detalhes acerca dos feeds actualmente sincronizados."</string>
+    <string name="permlab_subscribedFeedsWrite">"escrever feeds subscritos"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Permite a uma aplicação modificar os seus feeds actualmente sincronizados. Isto pode permitir a uma aplicação maliciosa alterar os seus feeds sincronizados."</string>
+    <string name="permlab_readDictionary">"ler dicionário definido pelo utilizador"</string>
+    <string name="permdesc_readDictionary">"Permite a uma aplicação ler quaisquer palavras, nomes e expressões privadas que o utilizador possa ter armazenado no dicionário do utilizador."</string>
+    <string name="permlab_writeDictionary">"escrever no dicionário definido pelo utilizador"</string>
+    <string name="permdesc_writeDictionary">"Permite a uma aplicação escrever novas palavras no dicionário do utilizador."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
+  <string-array name="phoneTypes">
+    <item>"Residência"</item>
+    <item>"Móvel"</item>
+    <item>"Emprego"</item>
+    <item>"Fax do emprego"</item>
+    <item>"Fax da residência"</item>
+    <item>"Pager"</item>
+    <item>"Outro"</item>
+    <item>"Personalizado"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Residência"</item>
+    <item>"Emprego"</item>
+    <item>"Outro"</item>
+    <item>"Personalizado"</item>
+  </string-array>
+    <string name="mobileEmailTypeName">"Móvel"</string>
+  <string-array name="postalAddressTypes">
+    <item>"Residência"</item>
+    <item>"Emprego"</item>
+    <item>"Outro"</item>
+    <item>"Personalizado"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Residência"</item>
+    <item>"Emprego"</item>
+    <item>"Outro"</item>
+    <item>"Personalizado"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Emprego"</item>
+    <item>"Outro"</item>
+    <item>"Personalizado"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Introduzir código PIN"</string>
+    <string name="keyguard_password_wrong_pin_code">"Código PIN incorrecto!"</string>
+    <string name="keyguard_label_text">"Para desbloquear, prima Menu e, em seguida, 0."</string>
+    <string name="emergency_call_dialog_number_for_display">"Número de emergência"</string>
+    <string name="lockscreen_carrier_default">"(Nenhum serviço)"</string>
+    <string name="lockscreen_screen_locked">"Ecrã bloqueado."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Prima Menu para desbloquear ou efectuar uma chamada de emergência."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Prima Menu para desbloquear."</string>
+    <string name="lockscreen_pattern_instructions">"Desenhar padrão para desbloquear"</string>
+    <string name="lockscreen_emergency_call">"Chamada de emergência"</string>
+    <string name="lockscreen_pattern_correct">"Correcto!"</string>
+    <string name="lockscreen_pattern_wrong">"Lamentamos, tente novamente"</string>
+    <string name="lockscreen_plugged_in">"A carregar (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
+    <string name="lockscreen_low_battery">"Ligue o carregador."</string>
+    <string name="lockscreen_missing_sim_message_short">"Nenhum cartão SIM."</string>
+    <string name="lockscreen_missing_sim_message">"Nenhum cartão SIM no telefone."</string>
+    <string name="lockscreen_missing_sim_instructions">"Introduza um cartão SIM."</string>
+    <string name="lockscreen_network_locked_message">"Rede bloqueada"</string>
+    <string name="lockscreen_sim_puk_locked_message">"O cartão SIM está bloqueado por PUK"</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Consulte o Manual de utilizador ou contacte a Assistência a clientes."</string>
+    <string name="lockscreen_sim_locked_message">"O cartão SIM está bloqueado."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"A desbloquear cartão SIM..."</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Efectuou incorrectamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Efectuou incorrectamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telefone utilizando o seu início de sessão no Google."\n\n" Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Tente novamente dentro de <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Esqueceu-se do padrão?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Demasiadas tentativas de efectuar o padrão!"</string>
+    <string name="lockscreen_glogin_instructions">"Para desbloquear, inicie sessão com a sua Conta Google"</string>
+    <string name="lockscreen_glogin_username_hint">"Nome de utilizador (e-mail)"</string>
+    <string name="lockscreen_glogin_password_hint">"Palavra-passe"</string>
+    <string name="lockscreen_glogin_submit_button">"Iniciar sessão"</string>
+    <string name="lockscreen_glogin_invalid_input">"Nome de utilizador ou palavra-passe inválidos."</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
+    <string name="status_bar_no_notifications_title">"Sem notificações"</string>
+    <string name="status_bar_ongoing_events_title">"Em curso"</string>
+    <string name="status_bar_latest_events_title">"Notificações"</string>
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="battery_status_charging">"A carregar..."</string>
+    <string name="battery_low_title">"Ligue o carregador"</string>
+    <string name="battery_low_subtitle">"A bateria está a ficar fraca:"</string>
+    <string name="battery_low_percent_format">"resta menos de <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"O teste de fábrica falhou"</string>
+    <string name="factorytest_not_system">"A acção FACTORY_TEST apenas é suportada para pacotes instalados em /system/app."</string>
+    <string name="factorytest_no_action">"Não foi localizado qualquer pacote que forneça a acção FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Reiniciar"</string>
+    <string name="js_dialog_title">"A página em \"<xliff:g id="TITLE">%s</xliff:g>\" indica:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Navegar para outra página?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Seleccione OK para continuar ou Cancelar para permanecer na página actual."</string>
+    <string name="save_password_label">"Confirmar"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Quer que o browser memorize esta palavra-passe?"</string>
+    <string name="save_password_notnow">"Agora não"</string>
+    <string name="save_password_remember">"Lembrar"</string>
+    <string name="save_password_never">"Nunca"</string>
+    <string name="open_permission_deny">"Não tem autorização para abrir esta página."</string>
+    <string name="text_copied">"Texto copiado para a área de transferência."</string>
+    <string name="more_item_label">"Mais"</string>
+    <string name="prepend_shortcut_label">"Menu+"</string>
+    <string name="menu_space_shortcut_label">"espaço"</string>
+    <string name="menu_enter_shortcut_label">"introduzir"</string>
+    <string name="menu_delete_shortcut_label">"eliminar"</string>
+    <string name="search_go">"Pesquisar"</string>
+    <string name="oneMonthDurationPast">"Há 1 mês"</string>
+    <string name="beforeOneMonthDurationPast">"Há·mais·de·1·mês"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"Há 1 segundo"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"Há 1 minuto"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"Há 1 hora"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"ontem"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"daqui a 1 segundo"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"daqui a 1 minuto"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"daqui a 1 hora"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"amanhã"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"Há 1 seg"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> seg"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"há 1 min"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> min"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"Há 1 hora"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"ontem"</item>
+    <item quantity="other">"Há <xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"daqui a 1 seg"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> seg"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"daqui a 1 min"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> min"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"daqui a 1 hora"</item>
+    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"amanhã"</item>
+    <item quantity="other">"daqui a <xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
+    <string name="preposition_for_date">"a %s"</string>
+    <string name="preposition_for_time">"às %s"</string>
+    <string name="preposition_for_year">"em %s"</string>
+    <string name="day">"dia"</string>
+    <string name="days">"dias"</string>
+    <string name="hour">"hora"</string>
+    <string name="hours">"horas"</string>
+    <string name="minute">"minutos"</string>
+    <string name="minutes">"min"</string>
+    <string name="second">"seg"</string>
+    <string name="seconds">"seg"</string>
+    <string name="week">"semana"</string>
+    <string name="weeks">"semanas"</string>
+    <string name="year">"ano"</string>
+    <string name="years">"anos"</string>
+    <string name="every_weekday">"Todos os dias úteis (Seg-Sex)"</string>
+    <string name="daily">"Diariamente"</string>
+    <string name="weekly">"Semanalmente à/ao <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Mensalmente"</string>
+    <string name="yearly">"Anualmente"</string>
+    <string name="VideoView_error_title">"Impossível reproduzir vídeo"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Lamentamos, este vídeo não é válido para transmissão em sequência neste dispositivo."</string>
+    <string name="VideoView_error_text_unknown">"Lamentamos, não é possível reproduzir este vídeo."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon">"meio-dia"</string>
+    <string name="Noon">"Meio-dia"</string>
+    <string name="midnight">"meia-noite"</string>
+    <string name="Midnight">"Meia-noite"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Seleccionar tudo"</string>
+    <string name="selectText">"Seleccionar texto"</string>
+    <string name="stopSelectingText">"Parar selecção de texto"</string>
+    <string name="cut">"Cortar"</string>
+    <string name="cutAll">"Cortar tudo"</string>
+    <string name="copy">"Copiar"</string>
+    <string name="copyAll">"Copiar tudo"</string>
+    <string name="paste">"Colar"</string>
+    <string name="copyUrl">"Copiar URL"</string>
+    <string name="inputMethod">"Método de entrada"</string>
+    <string name="addToDictionary">"Adicionar \"%s\" ao dicionário"</string>
+    <string name="editTextMenuTitle">"Editar texto"</string>
+    <string name="low_internal_storage_view_title">"Pouco espaço livre"</string>
+    <string name="low_internal_storage_view_text">"O espaço de armazenamento do telefone está a ficar reduzido."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Cancelar"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Cancelar"</string>
+    <string name="dialog_alert_title">"Atenção"</string>
+    <string name="capital_on">"Activado"</string>
+    <string name="capital_off">"Desactivar"</string>
+    <string name="whichApplication">"Concluir acção utilizando"</string>
+    <string name="alwaysUse">"Utilizar por predefinição para esta acção."</string>
+    <string name="clearDefaultHintMsg">"Limpar predefinição em Definições iniciais &gt; Aplicações &gt; Gerir aplicações."</string>
+    <string name="chooseActivity">"Seleccionar uma acção"</string>
+    <string name="noApplications">"Nenhuma aplicação pode efectuar esta acção."</string>
+    <string name="aerr_title">"Lamentamos."</string>
+    <string name="aerr_application">"A aplicação <xliff:g id="APPLICATION">%1$s</xliff:g> (processo <xliff:g id="PROCESS">%2$s</xliff:g>) parou de forma inesperada. Tente novamente."</string>
+    <string name="aerr_process">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou de forma inesperada. Tente novamente."</string>
+    <string name="anr_title">"Lamentamos!"</string>
+    <string name="anr_activity_application">"A actividade <xliff:g id="ACTIVITY">%1$s</xliff:g> (na aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>) não está a responder."</string>
+    <string name="anr_activity_process">"A actividade <xliff:g id="ACTIVITY">%1$s</xliff:g> (no processo <xliff:g id="PROCESS">%2$s</xliff:g>) não está a responder."</string>
+    <string name="anr_application_process">"A aplicação <xliff:g id="APPLICATION">%1$s</xliff:g> (no processo <xliff:g id="PROCESS">%2$s</xliff:g>) não está a responder."</string>
+    <string name="anr_process">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> não está a responder."</string>
+    <string name="force_close">"Forçar fecho"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Esperar"</string>
+    <string name="debug">"Depuração"</string>
+    <string name="sendText">"Seleccionar uma acção para texto"</string>
+    <string name="volume_ringtone">"Volume da campainha"</string>
+    <string name="volume_music">"Volume de multimédia"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"A reproduzir através de Bluetooth"</string>
+    <string name="volume_call">"Volume da chamada recebida"</string>
+    <string name="volume_bluetooth_call">"Volume de chamada recebida em Bluetooth"</string>
+    <string name="volume_alarm">"Volume do alarme"</string>
+    <string name="volume_notification">"Volume de notificações"</string>
+    <string name="volume_unknown">"Volume"</string>
+    <string name="ringtone_default">"Toque predefinido"</string>
+    <string name="ringtone_default_with_actual">"Toque predefinido (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Silencioso"</string>
+    <string name="ringtone_picker_title">"Toques"</string>
+    <string name="ringtone_unknown">"Toque desconhecido"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Rede Wi-Fi disponível"</item>
+    <item quantity="other">"Redes Wi-Fi disponíveis"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Rede Wi-Fi aberta disponível"</item>
+    <item quantity="other">"Abrir redes Wi-Fi disponíveis"</item>
+  </plurals>
+    <string name="select_character">"Introduzir carácter"</string>
+    <string name="sms_control_default_app_name">"Aplicação desconhecida"</string>
+    <string name="sms_control_title">"A enviar mensagens SMS"</string>
+    <string name="sms_control_message">"Está a ser enviado um grande número de mensagens SMS. Seleccione \"OK\" para continuar ou \"Cancelar\" para parar o envio."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Cancelar"</string>
+    <string name="date_time_set">"Definir"</string>
+    <string name="default_permission_group">"Predefinido"</string>
+    <string name="no_permissions">"Não são necessárias permissões"</string>
+    <string name="perms_hide"><b>"Ocultar"</b></string>
+    <string name="perms_show_all"><b>"Mostrar tudo"</b></string>
+    <string name="googlewebcontenthelper_loading">"A carregar..."</string>
+    <string name="usb_storage_title">"Ligado através de USB"</string>
+    <string name="usb_storage_message">"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">"Montar"</string>
+    <string name="usb_storage_button_unmount">"Não montar"</string>
+    <string name="usb_storage_error_message">"Existe um problema ao utilizar o cartão SD para armazenamento USB."</string>
+    <string name="usb_storage_notification_title">"Ligado através de USB"</string>
+    <string name="usb_storage_notification_message">"Seleccione para copiar ficheiro para/do seu computador."</string>
+    <string name="usb_storage_stop_notification_title">"Desactivar armazenamento USB"</string>
+    <string name="usb_storage_stop_notification_message">"Opte por desactivar o armazenamento USB."</string>
+    <string name="usb_storage_stop_title">"Desactivar armazenamento USB"</string>
+    <string name="usb_storage_stop_message">"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">"Desactivar"</string>
+    <string name="usb_storage_stop_button_unmount">"Cancelar"</string>
+    <string name="usb_storage_stop_error_message">"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="extmedia_format_title">"Formatar cartão SD"</string>
+    <string name="extmedia_format_message">"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">"Formatar"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Seleccionar método de entrada"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"candidatos"</u></string>
+    <string name="ext_media_checking_notification_title">"A preparar cartão SD"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
+    <string name="ext_media_nofs_notification_title">"Cartão SD vazio"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
+    <string name="ext_media_unmountable_notification_title">"Cartão SD danificado"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
+    <string name="ext_media_badremoval_notification_title">"Cartão SD removido de forma inesperada"</string>
+    <string name="ext_media_badremoval_notification_message">"Desmonte o cartão SD antes de retirá-lo para evitar a perda de dados."</string>
+    <string name="ext_media_safe_unmount_notification_title">"É seguro retirar o cartão SD"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"Cartão SD removido"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
+    <string name="activity_list_empty">"Nenhuma actividade correspondente encontrada"</string>
+    <string name="permlab_pkgUsageStats">"actualizar estatísticas de utilização de componentes"</string>
+    <string name="permdesc_pkgUsageStats">"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="tutorial_double_tap_to_zoom_message_short">"Tocar duas vezes para controlar o zoom"</string>
+    <string name="gadget_host_error_inflating">"Erro ao inchar miniaplicação"</string>
+    <string name="ime_action_go">"Ir"</string>
+    <string name="ime_action_search">"Pesquisar"</string>
+    <string name="ime_action_send">"Enviar"</string>
+    <string name="ime_action_next">"Seguinte"</string>
+    <string name="ime_action_done">"Concluído"</string>
+    <string name="ime_action_default">"Executar"</string>
+    <string name="dial_number_using">"Marcar número"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Criar contacto"\n"utilizando <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
+</resources>
diff --git a/core/res/res/values-pt/donottranslate-cldr.xml b/core/res/res/values-pt/donottranslate-cldr.xml
index 4729055..1111658 100644
--- a/core/res/res/values-pt/donottranslate-cldr.xml
+++ b/core/res/res/values-pt/donottranslate-cldr.xml
@@ -95,7 +95,7 @@
     <string name="hour_minute_ampm">%-l:%M %p</string>
     <string name="hour_minute_cap_ampm">%-l:%M %^p</string>
     <string name="twelve_hour_time_format">h:mm a</string>
-    <string name="twenty_four_hour_time_format">H'h'mm</string>
+    <string name="twenty_four_hour_time_format">H\'h\'mm</string>
     <string name="numeric_date">%d/%m/%Y</string>
     <string name="numeric_date_format">dd/MM/yyyy</string>
     <string name="numeric_date_template">"%s/%s/%s"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c5c5bbb..97d7596 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -16,11 +16,13 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="byteShort">"B"</string>
-    <string name="kilobyteShort">"KB"</string>
+    <string name="kilobyteShort">"Kb"</string>
     <string name="megabyteShort">"MB"</string>
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;sem título&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Nenhum número de telefone)"</string>
@@ -31,23 +33,23 @@
     <string name="serviceEnabled">"O serviço foi ativado."</string>
     <string name="serviceEnabledFor">"O serviço foi ativado para:"</string>
     <string name="serviceDisabled">"O serviço foi desativado."</string>
-    <string name="serviceRegistered">"O registro foi bem-sucedido."</string>
+    <string name="serviceRegistered">"Registro bem-sucedido."</string>
     <string name="serviceErased">"Exclusão bem-sucedida."</string>
-    <string name="passwordIncorrect">"Senha incorreta"</string>
-    <string name="mmiComplete">"MMI completo."</string>
+    <string name="passwordIncorrect">"Senha incorreta."</string>
+    <string name="mmiComplete">"MMI concluído."</string>
     <string name="badPin">"O PIN antigo digitado não está correto."</string>
     <string name="badPuk">"O PUK digitado não está correto."</string>
     <string name="mismatchPin">"Os PINs digitados não correspondem."</string>
     <string name="invalidPin">"Digite um PIN com 4 a 8 números."</string>
-    <string name="needPuk">"Seu cartão SIM está bloqueado pelo código PUK. Digite o PUK para desbloqueá-lo."</string>
-    <string name="needPuk2">"Digite PUK2 para desbloquear cartão SIM."</string>
-    <string name="ClipMmi">"ID do chamador"</string>
-    <string name="ClirMmi">"ID de quem realiza a chamada"</string>
-    <string name="CfMmi">"Transferência de chamada"</string>
+    <string name="needPuk">"O seu cartão SIM está bloqueado por um PUK. Digite o código PUK para desbloqueá-lo."</string>
+    <string name="needPuk2">"Digite o PUK2 para desbloquear o cartão SIM."</string>
+    <string name="ClipMmi">"ID do chamador de entrada"</string>
+    <string name="ClirMmi">"ID do chamador de saída"</string>
+    <string name="CfMmi">"Encaminhamento de chamada"</string>
     <string name="CwMmi">"Chamada em espera"</string>
-    <string name="BaMmi">"Bloqueio de chamada"</string>
+    <string name="BaMmi">"Bloqueio de chamadas"</string>
     <string name="PwdMmi">"Alteração da senha"</string>
-    <string name="PinMmi">"Alteração de PIN"</string>
+    <string name="PinMmi">"Alteração do PIN"</string>
     <!-- no translation found for CnipMmi (3110534680557857162) -->
     <skip />
     <!-- no translation found for CnirMmi (3062102121430548731) -->
@@ -60,22 +62,17 @@
     <skip />
     <!-- no translation found for DndMmi (1265478932418334331) -->
     <skip />
-    <string name="CLIRDefaultOnNextCallOn">"ID do chamador assume o padrão de restrito. Próxima chamada: restrita"</string>
-    <string name="CLIRDefaultOnNextCallOff">"ID do chamador assume o padrão de restrito. Próxima chamada: não restrita"</string>
-    <string name="CLIRDefaultOffNextCallOn">"ID do chamador assume o padrão de não restrito. Próxima chamada: restrita"</string>
-    <string name="CLIRDefaultOffNextCallOff">"ID do chamador assume o padrão de não restrito. Próxima chamada: não restrita"</string>
-    <string name="serviceNotProvisioned">"Serviço não fornecido"</string>
-    <string name="CLIRPermanent">"A configuração da ID do chamador não pode ser alterada."</string>
-    <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
-    <skip />
-    <!-- no translation found for RestrictedOnData (8653794784690065540) -->
-    <skip />
-    <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
-    <skip />
-    <!-- no translation found for RestrictedOnNormal (2045364908281990708) -->
-    <skip />
-    <!-- no translation found for RestrictedOnAll (4923139582141626159) -->
-    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"O ID do chamador assume o padrão de restrito. Próxima chamada: Restrita"</string>
+    <string name="CLIRDefaultOnNextCallOff">"O ID do chamador assume o padrão de restrito. Próxima chamada: Não restrita"</string>
+    <string name="CLIRDefaultOffNextCallOn">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Restrita"</string>
+    <string name="CLIRDefaultOffNextCallOff">"O ID do chamador assume o padrão de não restrito. Próxima chamada: Não restrita"</string>
+    <string name="serviceNotProvisioned">"O serviço não foi habilitado."</string>
+    <string name="CLIRPermanent">"A configuração do ID do chamador não pode ser alterada."</string>
+    <string name="RestrictedChangedTitle">"Acesso restrito alterado"</string>
+    <string name="RestrictedOnData">"O serviço de dados está bloqueado."</string>
+    <string name="RestrictedOnEmergency">"O serviço de emergência está bloqueado."</string>
+    <string name="RestrictedOnNormal">"O serviço de voz/SMS está bloqueado."</string>
+    <string name="RestrictedOnAll">"Todos os serviços de voz/SMS estão bloqueados."</string>
     <string name="serviceClassVoice">"Voz"</string>
     <string name="serviceClassData">"Dados"</string>
     <string name="serviceClassFAX">"FAX"</string>
@@ -112,11 +109,11 @@
     <skip />
     <!-- no translation found for roamingTextSearching (8360141885972279963) -->
     <skip />
-    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não transferido"</string>
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> após <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string>
-    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não transferido"</string>
-    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não transferido"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Não encaminhado"</string>
     <!-- no translation found for fcComplete (3118848230966886575) -->
     <skip />
     <!-- no translation found for fcError (3327560126588500777) -->
@@ -124,104 +121,102 @@
     <string name="httpErrorOk">"OK"</string>
     <string name="httpError">"A página da web contém um erro."</string>
     <string name="httpErrorLookup">"Não foi possível encontrar o URL."</string>
-    <string name="httpErrorUnsupportedAuthScheme">"O esquema de autenticação não é suportado."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"O esquema de autenticação do site não é suportado."</string>
     <string name="httpErrorAuth">"Falha na autenticação."</string>
-    <string name="httpErrorProxyAuth">"Falha na autenticação pelo servidor proxy."</string>
+    <string name="httpErrorProxyAuth">"Falha na autenticação por meio do servidor proxy."</string>
     <string name="httpErrorConnect">"Falha na conexão com o servidor."</string>
-    <string name="httpErrorIO">"Falha de comunicação com o servidor. Tente novamente mais tarde."</string>
-    <string name="httpErrorTimeout">"Tempo limite da conexão com o servidor esgotado."</string>
+    <string name="httpErrorIO">"Falha de comunicação do servidor. Tente novamente mais tarde."</string>
+    <string name="httpErrorTimeout">"O tempo limite de conexão com o servidor esgotou."</string>
     <string name="httpErrorRedirectLoop">"A página contém muitos redirecionamentos do servidor."</string>
     <string name="httpErrorUnsupportedScheme">"O protocolo não é suportado."</string>
     <string name="httpErrorFailedSslHandshake">"Não foi possível estabelecer uma conexão segura."</string>
-    <string name="httpErrorBadUrl">"A página não pode ser aberta, pois o URL é inválido."</string>
+    <string name="httpErrorBadUrl">"Não foi possível abrir a página porque o URL é inválido."</string>
     <string name="httpErrorFile">"Não foi possível acessar o arquivo."</string>
     <string name="httpErrorFileNotFound">"O arquivo solicitado não foi encontrado."</string>
-    <string name="httpErrorTooManyRequests">"Muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
+    <string name="httpErrorTooManyRequests">"Há muitas solicitações sendo processadas. Tente novamente mais tarde."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"Sincronizar"</string>
     <string name="contentServiceSyncNotificationTitle">"Sincronizar"</string>
-    <string name="contentServiceTooManyDeletesNotificationDesc">"Muitas exclusões do <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Muitas exclusões de <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
     <string name="low_memory">"O armazenamento do telefone está cheio! Exclua alguns arquivos para liberar espaço."</string>
     <string name="me">"Eu"</string>
     <string name="power_dialog">"Opções do telefone"</string>
     <string name="silent_mode">"Modo silencioso"</string>
-    <string name="turn_on_radio">"Ativar rede sem fio"</string>
+    <string name="turn_on_radio">"Ativar sem fio"</string>
     <string name="turn_off_radio">"Desativar a rede sem fio"</string>
-    <string name="screen_lock">"Bloqueio de tela"</string>
+    <string name="screen_lock">"Bloquear tela"</string>
     <string name="power_off">"Desligar"</string>
-    <string name="shutdown_progress">"Desligando…"</string>
-    <string name="shutdown_confirm">"Seu telefone desligará"</string>
+    <string name="shutdown_progress">"Encerrando…"</string>
+    <string name="shutdown_confirm">"O seu telefone será desligado."</string>
     <string name="no_recent_tasks">"Nenhum aplicativo recente."</string>
     <string name="global_actions">"Opções do telefone"</string>
-    <string name="global_action_lock">"Bloqueio de tela"</string>
+    <string name="global_action_lock">"Bloquear tela"</string>
     <string name="global_action_power_off">"Desligar"</string>
     <string name="global_action_toggle_silent_mode">"Modo silencioso"</string>
-    <string name="global_action_silent_mode_on_status">"O som está DESLIGADO"</string>
+    <string name="global_action_silent_mode_on_status">"Som DESATIVADO"</string>
     <string name="global_action_silent_mode_off_status">"O som está ATIVADO"</string>
-    <!-- no translation found for global_actions_toggle_airplane_mode (5884330306926307456) -->
-    <skip />
-    <!-- no translation found for global_actions_airplane_mode_on_status (2719557982608919750) -->
-    <skip />
-    <!-- no translation found for global_actions_airplane_mode_off_status (5075070442854490296) -->
-    <skip />
+    <string name="global_actions_toggle_airplane_mode">"Modo de avião"</string>
+    <string name="global_actions_airplane_mode_on_status">"Modo de avião ATIVADO"</string>
+    <string name="global_actions_airplane_mode_off_status">"Modo de avião DESATIVADO"</string>
     <string name="safeMode">"Modo de segurança"</string>
-    <!-- no translation found for android_system_label (6577375335728551336) -->
-    <skip />
-    <string name="permgrouplab_costMoney">"Serviços que custam dinheiro"</string>
-    <string name="permgroupdesc_costMoney">"Permite que os aplicativos façam coisas que podem custar dinheiro."</string>
+    <string name="android_system_label">"Sistema Android"</string>
+    <string name="permgrouplab_costMoney">"Serviços que geram gastos"</string>
+    <string name="permgroupdesc_costMoney">"Permite que os aplicativos façam coisas que possam gerar gastos."</string>
     <string name="permgrouplab_messages">"Suas mensagens"</string>
-    <string name="permgroupdesc_messages">"Ler e gravar suas mensagens SMS, e-mail e outras mensagens."</string>
+    <string name="permgroupdesc_messages">"Lê e grava o seu SMS, e-mail e outras mensagens."</string>
     <string name="permgrouplab_personalInfo">"Suas informações pessoais"</string>
-    <string name="permgroupdesc_personalInfo">"Acesso direto aos seus contatos e calendário armazenados no telefone."</string>
-    <string name="permgrouplab_location">"Sua localização"</string>
-    <string name="permgroupdesc_location">"Monitore seu local físico"</string>
-    <string name="permgrouplab_network">"Comunicação de rede"</string>
+    <string name="permgroupdesc_personalInfo">"Acessa diretamente os seus contatos e agenda armazenados no telefone."</string>
+    <string name="permgrouplab_location">"Seu local"</string>
+    <string name="permgroupdesc_location">"Monitora o seu local físico."</string>
+    <string name="permgrouplab_network">"Comunicação da rede"</string>
     <string name="permgroupdesc_network">"Permite que os aplicativos acessem diversos recursos de rede."</string>
-    <string name="permgrouplab_accounts">"Suas contas do Google"</string>
-    <string name="permgroupdesc_accounts">"Acesse as contas do Google disponíveis."</string>
+    <string name="permgrouplab_accounts">"Suas Contas do Google"</string>
+    <string name="permgroupdesc_accounts">"Acessar as Contas do Google disponíveis."</string>
     <string name="permgrouplab_hardwareControls">"Controles de hardware"</string>
-    <string name="permgroupdesc_hardwareControls">"Acesso direto ao hardware no handset."</string>
+    <string name="permgroupdesc_hardwareControls">"Acessa o hardware diretamente no aparelho."</string>
     <string name="permgrouplab_phoneCalls">"Chamadas telefônicas"</string>
-    <string name="permgroupdesc_phoneCalls">"Monitorar, registrar e processar chamadas telefônicas."</string>
+    <string name="permgroupdesc_phoneCalls">"Monitora, registra e processa chamadas telefônicas."</string>
     <string name="permgrouplab_systemTools">"Ferramentas do sistema"</string>
     <string name="permgroupdesc_systemTools">"Acesso de nível inferior e controle do sistema."</string>
     <string name="permgrouplab_developmentTools">"Ferramentas de desenvolvimento"</string>
-    <string name="permgroupdesc_developmentTools">"Recursos necessários apenas aos desenvolvedores de aplicativo."</string>
+    <string name="permgroupdesc_developmentTools">"Recursos necessários apenas para desenvolvedores de aplicativo."</string>
     <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
     <skip />
     <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
     <skip />
     <string name="permlab_statusBar">"desativar ou modificar a barra de status"</string>
-    <string name="permdesc_statusBar">"Permite que os aplicativos desativem a barra de status ou adicionem e removam ícones do sistema."</string>
+    <string name="permdesc_statusBar">"Permite que o aplicativo desative a barra de status ou adicione e remova ícones do sistema."</string>
     <string name="permlab_expandStatusBar">"expandir/recolher barra de status"</string>
-    <string name="permdesc_expandStatusBar">"Permite que um aplicativo expanda ou recolha a barra de status."</string>
-    <string name="permlab_processOutgoingCalls">"Interceptar chamadas realizadas"</string>
-    <string name="permdesc_processOutgoingCalls">"Permite que aplicativos processem chamadas realizadas e alterem o número a ser discado. Aplicativos maliciosos podem monitorar, redirecionar ou impedir chamadas realizadas."</string>
+    <string name="permdesc_expandStatusBar">"Permite que o aplicativo expanda ou recolha a barra de status."</string>
+    <string name="permlab_processOutgoingCalls">"interceptar chamadas enviadas"</string>
+    <string name="permdesc_processOutgoingCalls">"Permite que o aplicativo processe chamadas enviadas e altere o número a ser discado. Aplicativos maliciosos podem monitorar, redirecionar ou impedir a realização de chamadas."</string>
     <string name="permlab_receiveSms">"receber SMS"</string>
-    <string name="permdesc_receiveSms">"Permite que o aplicativo receba e processe mensagens SMS. Aplicativos maliciosos podem monitorar suas mensagens ou excluí-las sem mostrá-las a você."</string>
+    <string name="permdesc_receiveSms">"Permite que o aplicativo receba e processe mensagens SMS. Aplicativos maliciosos podem monitorar as suas mensagens ou excluí-las sem mostrá-las a você."</string>
     <string name="permlab_receiveMms">"receber MMS"</string>
-    <string name="permdesc_receiveMms">"Permite que o aplicativo receba e processe mensagens MMS. Aplicativos maliciosos podem monitorar suas mensagens ou excluí-las sem mostrá-las a você."</string>
+    <string name="permdesc_receiveMms">"Permite que o aplicativo receba e processe mensagens MMS. Aplicativos maliciosos podem monitorar as suas mensagens ou excluí-las sem mostrá-las a você."</string>
     <string name="permlab_sendSms">"enviar mensagens SMS"</string>
-    <string name="permdesc_sendSms">"Permite que os aplicativos enviem mensagens SMS. Os aplicativos maliciosos podem causar prejuízo financeiro a você ao enviar mensagens sem a sua confirmação."</string>
+    <string name="permdesc_sendSms">"Permite que o aplicativo envie mensagens SMS. Aplicativos maliciosos podem gerar gastos enviando mensagens sem a sua confirmação."</string>
     <string name="permlab_readSms">"ler SMS ou MMS"</string>
-    <string name="permdesc_readSms">"Permite que um aplicativo leia mensagens SMS armazenadas no seu telefone ou cartão SIM. Aplicativos maliciosos podem ler suas mensagens confidenciais."</string>
+    <string name="permdesc_readSms">"Permite que o aplicativo leia mensagens SMS armazenadas no seu telefone ou cartão SIM. Aplicativos maliciosos podem ler as suas mensagens confidenciais."</string>
     <string name="permlab_writeSms">"editar SMS ou MMS"</string>
-    <string name="permdesc_writeSms">"Permite que um aplicativo grave mensagens SMS armazenadas no seu telefone ou cartão SIM. Aplicativos maliciosos podem excluir suas mensagens."</string>
+    <string name="permdesc_writeSms">"Permite que o aplicativo grave mensagens SMS armazenadas no seu telefone ou cartão SIM. Aplicativos maliciosos podem excluir suas mensagens."</string>
     <string name="permlab_receiveWapPush">"receber WAP"</string>
-    <string name="permdesc_receiveWapPush">"Permite que o aplicativo receba e processe mensagens WAP. Aplicativos maliciosos podem monitorar suas mensagens ou excluí-las sem mostrá-las a você."</string>
+    <string name="permdesc_receiveWapPush">"Permite que o aplicativo receba e processe mensagens WAP. Aplicativos maliciosos podem monitorar as suas mensagens ou excluí-las sem mostrá-las a você."</string>
     <string name="permlab_getTasks">"recuperar aplicativos em execução"</string>
-    <string name="permdesc_getTasks">"Permite que os aplicativos recuperem informações sobre as tarefas em execução no momento ou recentemente. Pode permitir que aplicativos maliciosos descubram informações particulares sobre outros aplicativos."</string>
-    <string name="permlab_reorderTasks">"reorganizar os aplicativos em execução"</string>
-    <string name="permdesc_reorderTasks">"Permite que um aplicativo mova as tarefas para o primeiro ou segundo plano. Os aplicativos maliciosos podem forçar sua permanência no primeiro plano sem o seu controle."</string>
+    <string name="permdesc_getTasks">"Permite que o aplicativo recupere as informações sobre tarefas em execução no momento ou recentemente. Pode permitir que aplicativos maliciosos descubram informações particulares sobre outros aplicativos."</string>
+    <string name="permlab_reorderTasks">"reorganizar aplicativos em execução"</string>
+    <string name="permdesc_reorderTasks">"Permite que um aplicativo mova as tarefas para o primeiro e para o segundo planos. Aplicativos maliciosos podem se forçar à frente sem o seu controle."</string>
     <string name="permlab_setDebugApp">"ativar depuração do aplicativo"</string>
     <string name="permdesc_setDebugApp">"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">"alterar as configurações da sua IU"</string>
-    <string name="permdesc_changeConfiguration">"Permite que um aplicativo mude a configuração atual, como a localidade ou o tamanho geral de fonte."</string>
+    <string name="permlab_changeConfiguration">"alterar as suas configurações de UI"</string>
+    <string name="permdesc_changeConfiguration">"Permite que um aplicativo altere a configuração atual, como a localidade ou tamanho geral da fonte."</string>
     <string name="permlab_restartPackages">"reiniciar outros aplicativos"</string>
-    <string name="permdesc_restartPackages">"Permite que um aplicativo reinicie outros aplicativos forçosamente."</string>
+    <string name="permdesc_restartPackages">"Permite que um aplicativo reinicie forçosamente outros aplicativos."</string>
     <string name="permlab_forceBack">"forçar fechamento do aplicativo"</string>
-    <string name="permdesc_forceBack">"Permite que um aplicativo force qualquer atividade que esteja em primeiro plano a fechar e voltar. Normalmente não é necessário para aplicativos normais."</string>
-    <string name="permlab_dump">"recuperar estado interno do sistema"</string>
-    <string name="permdesc_dump">"Permite que um aplicativo recupere o estado interno do sistema. Aplicativos maliciosos podem recuperar um ampla variedade de informações privadas e seguras, as quais não deveriam precisar normalmente."</string>
+    <string name="permdesc_forceBack">"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">"recuperar o estado interno do sistema"</string>
+    <string name="permdesc_dump">"Permite que um aplicativo recupere o estado interno do sistema. Aplicativos maliciosos podem recuperar uma grande variedade de informações privadas e de segurança que normalmente não precisariam."</string>
     <!-- no translation found for permlab_shutdown (7185747824038909016) -->
     <skip />
     <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
@@ -230,238 +225,227 @@
     <skip />
     <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
     <skip />
-    <string name="permlab_runSetActivityWatcher">"monitorar e controle toda inicialização de aplicativo"</string>
-    <string name="permdesc_runSetActivityWatcher">"Permite que um aplicativo monitore e controle como o sistema inicia as atividades. Os aplicativos maliciosos podem comprometer completamente o sistema. Esta permissão é necessária apenas para desenvolvimento, nunca para uso normal do telefone."</string>
-    <string name="permlab_broadcastPackageRemoved">"enviar transmissão de pacote removido"</string>
-    <string name="permdesc_broadcastPackageRemoved">"Permite que um aplicativo transmita uma notificação de que o pacote de um aplicativo foi removido. Aplicativos maliciosos podem usar isso para encerrar outro aplicativo em execução."</string>
-    <string name="permlab_broadcastSmsReceived">"enviar transmissão de SMS recebido"</string>
+    <string name="permlab_runSetActivityWatcher">"monitorar e controlar toda inicialização de aplicativo"</string>
+    <string name="permdesc_runSetActivityWatcher">"Permite que um aplicativo monitore e controle a maneira como o sistema inicia as atividades. Aplicativos maliciosos podem comprometer todo o sistema. Essa permissão é necessária apenas para desenvolvimento, nunca para uso normal do telefone."</string>
+    <string name="permlab_broadcastPackageRemoved">"enviar transmissão removida do pacote"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Permite que um aplicativo transmita uma notificação informando que um pacote de aplicativo foi removido. Aplicativos maliciosos podem usar isso para encerrar qualquer outro aplicativo em execução."</string>
+    <string name="permlab_broadcastSmsReceived">"enviar transmissão SMS recebida"</string>
     <string name="permdesc_broadcastSmsReceived">"Permite que um aplicativo transmita uma notificação de que uma mensagem SMS foi recebida. Aplicativos maliciosos podem usar isso para forjar o recebimento de mensagens SMS."</string>
-    <string name="permlab_broadcastWapPush">"enviar transmissão de WAP-PUSH recebido"</string>
-    <string name="permdesc_broadcastWapPush">"Permite que um aplicativo transmita uma notificação de que uma mensagem WAP PUSH foi recebida. Aplicativos maliciosos podem usar isso para forjar o recebimento de uma mensagem MMS ou substituir silenciosamente o conteúdo de qualquer página da web por variantes maliciosas."</string>
-    <string name="permlab_setProcessLimit">"limitar o número de processos em execução"</string>
-    <string name="permdesc_setProcessLimit">"Permite que um aplicativo controle o número máximo de processos que serão executados. Nunca é necessário para aplicativos normais."</string>
-    <string name="permlab_setAlwaysFinish">"fazer todos os aplicativos em segundo plano fechar"</string>
-    <string name="permdesc_setAlwaysFinish">"Permite que um aplicativo controle se as atividades são sempre concluídas assim que vão para o segundo plano. Nunca é necessário para aplicativos normais."</string>
-    <string name="permlab_batteryStats">"Modificar as estatísticas da bateria"</string>
-    <string name="permdesc_batteryStats">"Permite a modificação das estatísticas coletadas sobre a bateria. Não deve ser usado em aplicativos normais."</string>
+    <string name="permlab_broadcastWapPush">"enviar transmissão WAP-PUSH recebida"</string>
+    <string name="permdesc_broadcastWapPush">"Permite que um aplicativo transmita uma notificação de que uma mensagem WAP PUSH foi recebida. Aplicativos maliciosos podem usar isso para forjar o recebimento de mensagem MMS ou substituir silenciosamente o conteúdo de qualquer página da web por variantes maliciosas."</string>
+    <string name="permlab_setProcessLimit">"limitar número de processos em execução"</string>
+    <string name="permdesc_setProcessLimit">"Permite que um aplicativo controle o número máximo de processos que serão executados. Aplicativos normais não precisam disso em momento algum."</string>
+    <string name="permlab_setAlwaysFinish">"fechar todos os aplicativos em segundo plano"</string>
+    <string name="permdesc_setAlwaysFinish">"Permite que um aplicativo controle se as atividades são sempre concluídas assim que vão para o segundo plano. Aplicativos normais não precisam disso em momento algum."</string>
+    <string name="permlab_batteryStats">"modificar estatísticas da bateria"</string>
+    <string name="permdesc_batteryStats">"Permite a modificação das estatísticas de bateria coletadas. Não deve ser usado por aplicativos normais."</string>
     <!-- no translation found for permlab_backup (470013022865453920) -->
     <skip />
     <!-- no translation found for permdesc_backup (2305432853944929371) -->
     <skip />
     <string name="permlab_internalSystemWindow">"exibir janelas não autorizadas"</string>
-    <string name="permdesc_internalSystemWindow">"Permite a criação de janelas que devem ser usadas pela interface de usuário do sistema interno. Normalmente não é necessário para aplicativos normais."</string>
-    <string name="permlab_systemAlertWindow">"exibir alertas do nível do sistema"</string>
+    <string name="permdesc_internalSystemWindow">"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">"exibir alertas de nível do sistema"</string>
     <string name="permdesc_systemAlertWindow">"Permite que um aplicativo mostre janelas de alerta do sistema. Aplicativos maliciosos podem assumir o controle de toda a tela do telefone."</string>
-    <string name="permlab_setAnimationScale">"modificar a velocidade de animação global"</string>
-    <string name="permdesc_setAnimationScale">"Permite que um aplicativo altere a velocidade de animação global (animações mais rápidas ou mais lentas) a qualquer momento."</string>
-    <string name="permlab_manageAppTokens">"gerenciar os símbolos do aplicativo"</string>
-    <string name="permdesc_manageAppTokens">"Permite que um aplicativo crie e gerencie seus próprio símbolos, ignorando a ordem-Z (Z-ordering). Normalmente não é necessário para aplicativos normais."</string>
+    <string name="permlab_setAnimationScale">"modificar velocidade de animação global"</string>
+    <string name="permdesc_setAnimationScale">"Permite que um aplicativo altere a velocidade de animação global (animação mais rápida ou mais lenta) a qualquer momento."</string>
+    <string name="permlab_manageAppTokens">"gerenciar tokens do aplicativo"</string>
+    <string name="permdesc_manageAppTokens">"Permite que os aplicativos criem e gerenciem seus próprios tokens, ignorando a ordem Z normal. Aplicativos normais não devem precisar disso em momento algum."</string>
     <string name="permlab_injectEvents">"pressionar as teclas e os botões de controle"</string>
-    <string name="permdesc_injectEvents">"Permite que um aplicativo proporcione seus próprios eventos de entrada (pressionamentos de tecla etc.) a outros aplicativos. Aplicativos maliciosos podem usar isso para assumir o controle do telefone."</string>
-    <string name="permlab_readInputState">"registrar o que você digita e as ações que executa"</string>
-    <string name="permdesc_readInputState">"Permite que os aplicativos observem as teclas que você pressiona ao interagir com outro aplicativo (como ao digitar uma senha). Normalmente não é necessário para aplicativos normais."</string>
-    <string name="permlab_bindInputMethod">"aderir a um método de entrada"</string>
-    <string name="permdesc_bindInputMethod">"Permite que o portador se vincule à interface de nível superior de um método de entrada. Normalmente não é necessário em aplicativos normais."</string>
+    <string name="permdesc_injectEvents">"Permite que um aplicativo use seus próprios eventos de entrada (pressionamentos de teclas etc.) em outros aplicativos. Aplicativos maliciosos podem usar isso para assumir o controle do telefone."</string>
+    <string name="permlab_readInputState">"registrar o que você digita e as ações que realiza"</string>
+    <string name="permdesc_readInputState">"Permite que os aplicativos vejam as teclas que você pressiona, mesmo quando estiver interagindo com outro aplicativo (como ao digitar uma senha). Aplicativos normais não devem precisar disso em momento algum."</string>
+    <string name="permlab_bindInputMethod">"vincular a um método de entrada"</string>
+    <string name="permdesc_bindInputMethod">"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_setOrientation">"alterar orientação da tela"</string>
-    <string name="permdesc_setOrientation">"Permite que um aplicativo altere a rotação da tela a qualquer momento. Normalmente não é necessário para aplicativos normais."</string>
-    <string name="permlab_signalPersistentProcesses">"enviar sinais de Linux aos aplicativos"</string>
+    <string name="permdesc_setOrientation">"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">"enviar sinais de Linux para os aplicativos"</string>
     <string name="permdesc_signalPersistentProcesses">"Permite que o aplicativo solicite que o sinal fornecido seja enviado a todos os processos persistentes."</string>
-    <string name="permlab_persistentActivity">"fazer com que o aplicativo execute sempre"</string>
-    <string name="permdesc_persistentActivity">"Permite que um aplicativo torne partes dele mesmo persistentes, para que o sistema não possa usá-lo para outros aplicativos."</string>
+    <string name="permlab_persistentActivity">"executar sempre o aplicativo"</string>
+    <string name="permdesc_persistentActivity">"Permite que um aplicativo torne partes de si mesmo persistentes, de modo que o sistema não possa usar essas partes para outros aplicativos."</string>
     <string name="permlab_deletePackages">"excluir aplicativos"</string>
     <string name="permdesc_deletePackages">"Permite que um aplicativo exclua pacotes do Android. Aplicativos maliciosos podem usar isso para excluir aplicativos importantes."</string>
-    <string name="permlab_clearAppUserData">"excluir os dados de outros aplicativos"</string>
+    <string name="permlab_clearAppUserData">"excluir dados de outros aplicativos"</string>
     <string name="permdesc_clearAppUserData">"Permite que um aplicativo limpe os dados do usuário."</string>
-    <string name="permlab_deleteCacheFiles">"excluir o cache de outros aplicativos"</string>
-    <string name="permdesc_deleteCacheFiles">"Permite que um aplicativo exclua arquivos armazenados em cache."</string>
-    <string name="permlab_getPackageSize">"medir o espaço de armazenamento do aplicativo"</string>
-    <string name="permdesc_getPackageSize">"Permite que um aplicativo recupere seu código, dados e tamanho de cache"</string>
-    <string name="permlab_installPackages">"instalar os aplicativos diretamente"</string>
-    <string name="permdesc_installPackages">"Permite que um aplicativo instale pacotes novos ou atualizados do Android. Aplicativos maliciosos podem usar isso para adicionar novos aplicativos com permissões aleatórias avançadas."</string>
-    <string name="permlab_clearAppCache">"excluir todos os dados do cache do aplicativo"</string>
-    <string name="permdesc_clearAppCache">"Permite que um aplicativo libere espaço de armazenamento do telefone excluindo arquivos no diretório de cache do aplicativo. O acesso é normalmente restrito ao processo do sistema."</string>
-    <string name="permlab_readLogs">"ler arquivos do registro do sistema"</string>
-    <string name="permdesc_readLogs">"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, mas esses arquivos não devem conter informações pessoais ou privadas."</string>
-    <string name="permlab_diagnostic">"ler/gravar em recursos que pertencem ao diagnóstico"</string>
-    <string name="permdesc_diagnostic">"Permite que um aplicativo leia e grave em qualquer recurso que pertença ao grupo diag; por exemplo, arquivos em /dev. Isso poderia afetar a estabilidade e a segurança do sistema. Por isso, SÓ deve ser usado para diagnósticos específicos do hardware pelo fabricante ou operador."</string>
-    <string name="permlab_changeComponentState">"ativar ou desativar componentes do aplicativo"</string>
-    <string name="permdesc_changeComponentState">"Permite que um aplicativo altere a ativação ou desativação de um componente de outro aplicativo. Aplicativos maliciosos podem usar isso para desativar recursos importantes do telefone. É preciso ter permissão e cuidado no uso, pois é possível deixar os componentes do aplicativo em um estado inutilizável, inconsistente ou instável."</string>
-    <string name="permlab_setPreferredApplications">"definir aplicativos preferidos"</string>
-    <string name="permdesc_setPreferredApplications">"Permite que um aplicativo modifique seus aplicativos preferidos. Isso pode permitir que aplicativos maliciosos alterem silenciosamente os aplicativos em execução, falsificando seus aplicativos existentes para coletar seus dados privados."</string>
+    <string name="permlab_deleteCacheFiles">"excluir os caches de outros aplicativos"</string>
+    <string name="permdesc_deleteCacheFiles">"Permite que um aplicativo exclua os arquivos do cache."</string>
+    <string name="permlab_getPackageSize">"medir espaço de armazenamento do aplicativo"</string>
+    <string name="permdesc_getPackageSize">"Permite que um aplicativo recupere seu código, seus dados e os tamanhos do cache."</string>
+    <string name="permlab_installPackages">"instalar diretamente os aplicativos"</string>
+    <string name="permdesc_installPackages">"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">"excluir todos os dados de cache do aplicativo"</string>
+    <string name="permdesc_clearAppCache">"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>
+    <string name="permlab_readLogs">"ler arquivos de registro do sistema"</string>
+    <string name="permdesc_readLogs">"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">"ler/gravar em recursos pertencentes ao diag"</string>
+    <string name="permdesc_diagnostic">"Permite que um aplicativo leia e grave em qualquer recurso que pertença ao grupo de diagnósticos; por exemplo, arquivos em /dev. Isso possivelmente pode afetar a estabilidade e a segurança do sistema. Isso deve ser usado APENAS para diagnósticos específicos do hardware realizados pelo fabricante ou pelo operador."</string>
+    <string name="permlab_changeComponentState">"ativar ou desativar os componentes do aplicativo"</string>
+    <string name="permdesc_changeComponentState">"Permite que um aplicativo altere se um componente de outro aplicativo está ativado ou não. Aplicativos maliciosos podem usar isso para desativar recursos de telefone importantes. É preciso ter cuidado com a permissão, pois é possível deixar os componentes do aplicativo em um estado inutilizável, inconsistente ou instável."</string>
+    <string name="permlab_setPreferredApplications">"definir os aplicativos preferidos"</string>
+    <string name="permdesc_setPreferredApplications">"Permite que um aplicativo modifique os seus aplicativos preferidos. Isso pode permitir que aplicativos maliciosos alterem silenciosamente os aplicativos em execução, falsificando os seus aplicativos existentes para coletar os seus dados particulares."</string>
     <string name="permlab_writeSettings">"modificar configurações globais do sistema"</string>
-    <string name="permdesc_writeSettings">"Permite que um aplicativo modifique os dados da configuração do sistema. Aplicativos maliciosos podem corromper a configuração do sistema."</string>
-    <string name="permlab_writeSecureSettings">"modificar configurações de segurança do sistema"</string>
-    <string name="permdesc_writeSecureSettings">"Permite que um aplicativo modifique os dados das configurações de segurança dos sistemas. Não deve ser usado em aplicativos normais."</string>
+    <string name="permdesc_writeSettings">"Permite que um aplicativo modifique os dados de configuração do sistema. Aplicativos maliciosos podem corromper a configuração do seu sistema."</string>
+    <string name="permlab_writeSecureSettings">"modificar configurações do sistema de segurança"</string>
+    <string name="permdesc_writeSecureSettings">"Permite que um aplicativo modifique os dados de configuração de segurança dos sistemas. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_writeGservices">"modificar o mapa de serviços do Google"</string>
-    <string name="permdesc_writeGservices">"Permite que um aplicativo modifique o mapa de serviços do Google. Não deve ser usado em aplicativos normais."</string>
+    <string name="permdesc_writeGservices">"Permite que um aplicativo modifique o mapa de serviços do Google. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_receiveBootCompleted">"iniciar automaticamente na inicialização"</string>
-    <string name="permdesc_receiveBootCompleted">"Permite que um aplicativo se inicie assim que o sistema termina de inicializar. Isso pode causar uma demora na inicialização do telefone e faz com que todo o telefone fique mais lento pela execução contínua do aplicativo."</string>
-    <string name="permlab_broadcastSticky">"enviar transmissão complexa"</string>
-    <string name="permdesc_broadcastSticky">"Permite que um aplicativo envie transmissões persistentes, as quais permanecem após o término da transmissão. Aplicativos maliciosos podem tornar o telefone lento ou instável fazendo com que use muita memória."</string>
-    <string name="permlab_readContacts">"ler dados de contato"</string>
-    <string name="permdesc_readContacts">"Permite que um aplicativo leia todos os dados de contato (endereço) armazenados no telefone. Aplicativos maliciosos podem usar isso para enviar seus dados a outras pessoas."</string>
+    <string name="permdesc_receiveBootCompleted">"Permite que um aplicativo inicie assim que o sistema conclui a inicialização. Isso pode retardar a inicialização do telefone e permitir que o aplicativo deixe o telefone mais lento por estar sempre em execução."</string>
+    <string name="permlab_broadcastSticky">"enviar transmissão persistente"</string>
+    <string name="permdesc_broadcastSticky">"Permite que um aplicativo envie uma transmissão persistente, que permanece após o término da transmissão. Aplicativos maliciosos podem tornar o telefone lento ou instável fazendo com que ele use muita memória."</string>
+    <string name="permlab_readContacts">"ler dados do contato"</string>
+    <string name="permdesc_readContacts">"Permite que um aplicativo leia todos os dados de contato (endereço) armazenados no seu telefone. Aplicativos maliciosos podem usar isso para enviar os seus dados para outras pessoas."</string>
     <string name="permlab_writeContacts">"gravar dados de contato"</string>
-    <string name="permdesc_writeContacts">"Permite que um aplicativo modifique os dados de contato (endereço) armazenados no telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar seus dados de contato."</string>
+    <string name="permdesc_writeContacts">"Permite que um aplicativo modifique os dados de contato (endereço) armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar os seus dados de contato."</string>
     <string name="permlab_writeOwnerData">"gravar dados do proprietário"</string>
-    <string name="permdesc_writeOwnerData">"Permite que um aplicativo modifique os dados do proprietário do telefone armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar os dados do proprietário."</string>
+    <string name="permdesc_writeOwnerData">"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">"ler dados do proprietário"</string>
-    <string name="permdesc_readOwnerData">"Permite que um aplicativo leia os dados do proprietário do telefone armazenados no seu telefone. Aplicativos maliciosos podem usar isso para ler os dados do proprietário."</string>
-    <string name="permlab_readCalendar">"ler os dados do calendário"</string>
-    <string name="permdesc_readCalendar">"Permite que um aplicativo leia todos os eventos de calendário armazenados no seu telefone. Aplicativos maliciosos podem usar isso para enviar os eventos do seu calendário a outras pessoas."</string>
-    <string name="permlab_writeCalendar">"gravar dados do calendário"</string>
-    <string name="permdesc_writeCalendar">"Permite que um aplicativo modifique os eventos do calendário armazenados no seu telefone. Aplicativos maliciosos podem usar isso para apagar ou modificar seus dados de contato."</string>
-    <string name="permlab_accessMockLocation">"imitar fontes de localização para teste"</string>
-    <string name="permdesc_accessMockLocation">"Criar imitação de fontes de localização para teste. Os aplicativos maliciosos podem usar isso para sobrescrever o local e/ou status retornado pelas fontes de localização reais como GPS ou provedores de rede."</string>
-    <string name="permlab_accessLocationExtraCommands">"acessar comandos extra do provedor de localização"</string>
-    <string name="permdesc_accessLocationExtraCommands">"Acessar comandos extra de fornecedor de localização. Aplicativos maliciosos podem usar isso para interferir com a operação do GPS ou com outras fontes de localização."</string>
+    <string name="permdesc_readOwnerData">"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">"ler dados da agenda"</string>
+    <string name="permdesc_readCalendar">"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">"gravar dados da agenda"</string>
+    <string name="permdesc_writeCalendar">"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>
+    <string name="permlab_accessMockLocation">"fontes de locais fictícios para teste"</string>
+    <string name="permdesc_accessMockLocation">"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">"acessar comandos extras do provedor de localização"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Acessa comandos extras do provedor de localização. Aplicativos maliciosos podem usar isso para interferir na operação do GPS ou de outras fontes de localização."</string>
     <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
     <skip />
     <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
     <skip />
     <string name="permlab_accessFineLocation">"Localização precisa (GPS)"</string>
-    <string name="permdesc_accessFineLocation">"Acesse fontes de localização precisa como o sistema GPS (Global Positioning System) no telefone, quando estiver disponível. Aplicativos maliciosos podem usar isso para determinar onde você está e também pode consumir energia da bateria."</string>
-    <string name="permlab_accessCoarseLocation">"Local inadequado (com base na rede)"</string>
-    <string name="permdesc_accessCoarseLocation">"Acessar fontes de localização aproximada como o banco de dados de rede de celular para determinar a localização aproximada de um telefone, quando houver disponibilidade. Aplicativos maliciosos podem usar isso para determinar sua localização aproximada."</string>
+    <string name="permdesc_accessFineLocation">"Acessa fontes de localização precisa como o GPS (Global Positioning System) no telefone, onde disponível. Aplicativos maliciosos podem usar isso para determinar onde você está e podem consumir energia adicional da bateria."</string>
+    <string name="permlab_accessCoarseLocation">"local aproximado (com base na rede)"</string>
+    <string name="permdesc_accessCoarseLocation">"Acessa fontes de localização aproximada como o banco de dados de rede celular para determinar a localização aproximada de um telefone, onde disponível. Aplicativos maliciosos podem usar isso para determinar aproximadamente onde você está."</string>
     <string name="permlab_accessSurfaceFlinger">"acessar SurfaceFlinger"</string>
-    <string name="permdesc_accessSurfaceFlinger">"Permite que o aplicativo use os recursos de nível inferior do SurfaceFlinger."</string>
-    <string name="permlab_readFrameBuffer">"ler buffer do quadro"</string>
-    <string name="permdesc_readFrameBuffer">"Permite que o aplicativo leia o conteúdo do buffer do quadro."</string>
-    <string name="permlab_modifyAudioSettings">"alterar as configurações do seu áudio"</string>
-    <string name="permdesc_modifyAudioSettings">"Permite que o aplicativo modifique as configurações de áudio globais como volume e roteamento."</string>
+    <string name="permdesc_accessSurfaceFlinger">"Permite que o aplicativo use recursos de nível inferior do SurfaceFlinger."</string>
+    <string name="permlab_readFrameBuffer">"ler o buffer do frame"</string>
+    <string name="permdesc_readFrameBuffer">"Permite que o aplicativo a ser usado leia o conteúdo do buffer de frame."</string>
+    <string name="permlab_modifyAudioSettings">"alterar as suas configurações de áudio"</string>
+    <string name="permdesc_modifyAudioSettings">"Permite que o aplicativo modifique as configurações globais de áudio como volume e roteamento."</string>
     <string name="permlab_recordAudio">"gravar áudio"</string>
-    <string name="permdesc_recordAudio">"Permite que o aplicativo acesso o caminho do registro de áudio."</string>
+    <string name="permdesc_recordAudio">"Permite que um aplicativo acesse o caminho de gravação do áudio."</string>
     <string name="permlab_camera">"tirar fotos"</string>
-    <string name="permdesc_camera">"Permite que o aplicativo tire fotos com a câmera. Isso permite que o aplicativo colete imagens exibidas pela câmera a qualquer momento."</string>
+    <string name="permdesc_camera">"Permite que o aplicativo tire fotos com a câmera. Isso permite que o aplicativo colete imagens vistas pela câmera a qualquer momento."</string>
     <string name="permlab_brick">"desativar permanentemente o telefone"</string>
-    <string name="permdesc_brick">"Permite que o aplicativo desative todo o telefone permanentemente. Isso é muito perigoso."</string>
-    <string name="permlab_reboot">"forçar reinicializarão do telefone"</string>
+    <string name="permdesc_brick">"Permite que o aplicativo desative o telefone inteiro permanentemente. Isso é muito perigoso."</string>
+    <string name="permlab_reboot">"forçar reinicialização do telefone"</string>
     <string name="permdesc_reboot">"Permite que o aplicativo force a reinicialização do telefone."</string>
     <string name="permlab_mount_unmount_filesystems">"montar e desmontar sistemas de arquivos"</string>
-    <string name="permdesc_mount_unmount_filesystems">"Permite que o aplicativo monte e desmonte sistemas de arquivos para armazenamento removível."</string>
-    <!-- no translation found for permlab_mount_format_filesystems (5523285143576718981) -->
-    <skip />
-    <!-- no translation found for permdesc_mount_format_filesystems (574060044906047386) -->
-    <skip />
-    <string name="permlab_vibrate">"controlar vibrador"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Permite que o aplicativo monte e desmonte arquivos de sistema para armazenamento removível."</string>
+    <string name="permlab_mount_format_filesystems">"formatar armazenamento externo"</string>
+    <string name="permdesc_mount_format_filesystems">"Permite que o aplicativo formate o armazenamento removível."</string>
+    <string name="permlab_vibrate">"controlar o vibrador"</string>
     <string name="permdesc_vibrate">"Permite que o aplicativo controle o vibrador."</string>
     <string name="permlab_flashlight">"controlar lanterna"</string>
     <string name="permdesc_flashlight">"Permite que o aplicativo controle a lanterna."</string>
     <string name="permlab_hardware_test">"testar hardware"</string>
-    <string name="permdesc_hardware_test">"Permite que o aplicativo controle diversos periféricos para teste de hardware."</string>
-    <string name="permlab_callPhone">"chamar números de telefone diretamente"</string>
-    <string name="permdesc_callPhone">"Permite que o aplicativo chame números de telefone sem sua intervenção. Aplicativos maliciosos podem causar a aparição de chamadas inesperadas na conta do seu telefone. Observe que isso não permite que o aplicativo ligue para números de emergência."</string>
-    <string name="permlab_callPrivileged">"chamar quaisquer números de telefone diretamente"</string>
-    <string name="permdesc_callPrivileged">"Permite que o aplicativo chame qualquer número de telefone, incluindo números de emergência, sem sua intervenção. Aplicativos maliciosos podem fazer chamadas desnecessárias e ilegais para serviços de emergência."</string>
-    <string name="permlab_locationUpdates">"controlar notificações de atualização de localização"</string>
-    <string name="permdesc_locationUpdates">"Permite a ativação/desativação das notificações sobre atualização de localização pelo rádio. Não deve ser usado em aplicativos normais."</string>
+    <string name="permdesc_hardware_test">"Permite que o aplicativo controle diversos periféricos para teste do hardware."</string>
+    <string name="permlab_callPhone">"chamar diretamente os números de telefone"</string>
+    <string name="permdesc_callPhone">"Permite que o aplicativo ligue para números de telefones sem a sua intervenção. Aplicativos maliciosos podem causar chamadas inesperadas na conta do seu telefone. Observe que isso não permite que o aplicativo ligue para números de emergência."</string>
+    <string name="permlab_callPrivileged">"chamar diretamente quaisquer números de telefone"</string>
+    <string name="permdesc_callPrivileged">"Permite que o aplicativo ligue para qualquer número de telefone, incluindo números de emergência, sem a sua intervenção. Aplicativos maliciosos podem fazer chamadas desnecessárias e ilegais para serviços de emergência."</string>
+    <string name="permlab_locationUpdates">"controlar as notificações de atualização do local"</string>
+    <string name="permdesc_locationUpdates">"Permite a ativação/desativação de notificações de atualização do local a partir do rádio. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_checkinProperties">"acessar propriedades de verificação"</string>
-    <string name="permdesc_checkinProperties">"Permite acesso de leitura/gravação às propriedades enviadas pelo serviço de verificação. Não deve ser usado em aplicativos normais."</string>
-    <!-- no translation found for permlab_bindGadget (776905339015863471) -->
-    <skip />
-    <!-- no translation found for permdesc_bindGadget (2098697834497452046) -->
-    <skip />
+    <string name="permdesc_checkinProperties">"Permite o acesso de leitura/gravação às propriedades enviadas pelo serviço de verificação. Não deve ser usado por aplicativos normais."</string>
+    <string name="permlab_bindGadget">"escolher widgets"</string>
+    <string name="permdesc_bindGadget">"Permite que o aplicativo informe ao sistema quais widgets podem ser usados por quais aplicativos. Com essa permissão, os aplicativos podem conceder acesso aos dados pessoais a outros aplicativos. Não deve ser usado por aplicativos normais."</string>
     <string name="permlab_modifyPhoneState">"modificar estado do telefone"</string>
-    <string name="permdesc_modifyPhoneState">"Permite que o aplicativo controle os recursos do telefone do dispositivo. Um aplicativo com essa permissão pode alternar entre redes, ligar e desligar o rádio e executar ações parecidas sem o notificar."</string>
+    <string name="permdesc_modifyPhoneState">"Permite que o aplicativo controle os recursos de telefone do dispositivo. Um aplicativo com essa permissão pode alternar redes, ligar e desligar o rádio do telefone e outras ações parecidas sem notificá-lo."</string>
     <string name="permlab_readPhoneState">"ler estado do telefone"</string>
-    <string name="permdesc_readPhoneState">"Permite que o aplicativo acesse os recursos do telefone do aparelho. Um aplicativo com essa permissão pode determinar o número deste telefone, se uma chamada está ativa, o número com o qual está chamada está conectada e outras coisas semelhantes."</string>
-    <string name="permlab_wakeLock">"impedir que o telefone entre em repouso"</string>
-    <string name="permdesc_wakeLock">"Permite que um aplicativo impeça o telefone de entrar em repouso."</string>
+    <string name="permdesc_readPhoneState">"Permite que o aplicativo acesse os recursos de telefone do dispositivo. Um aplicativo com essa permissão pode determinar o número desse telefone, se uma chamada está ativa, o número ao qual a chamada está conectada e outras informações parecidas."</string>
+    <string name="permlab_wakeLock">"impedir modo de inatividade do telefone"</string>
+    <string name="permdesc_wakeLock">"Permite que um aplicativo impeça o telefone de entrar no modo de inatividade."</string>
     <string name="permlab_devicePower">"ligar ou desligar o telefone"</string>
-    <string name="permdesc_devicePower">"Permite que o aplicativo ligue ou desligue o telefone."</string>
+    <string name="permdesc_devicePower">"Permite que o aplicativo ative ou desative o telefone."</string>
     <string name="permlab_factoryTest">"executar no modo de teste de fábrica"</string>
-    <string name="permdesc_factoryTest">"Executar como um teste de fabricante de nível inferior, permitindo o acesso completo ao hardware do telefone. Disponível apenas quando um telefone está executando no modo de teste de fábrica."</string>
+    <string name="permdesc_factoryTest">"Executa como um teste do fabricante de nível inferior, permitindo o acesso completo ao hardware do telefone. Disponível apenas quando um telefone está em execução no modo de teste do fabricante."</string>
     <string name="permlab_setWallpaper">"definir papel de parede"</string>
     <string name="permdesc_setWallpaper">"Permite que o aplicativo defina o papel de parede do sistema."</string>
-    <string name="permlab_setWallpaperHints">"definir dicas de tamanho de papel de parede"</string>
+    <string name="permlab_setWallpaperHints">"definir dicas de tamanho do papel de parede"</string>
     <string name="permdesc_setWallpaperHints">"Permite que o aplicativo defina as dicas de tamanho do papel de parede do sistema."</string>
-    <string name="permlab_masterClear">"reiniciar o sistema com o padrão de fábrica"</string>
-    <string name="permdesc_masterClear">"Permite que um aplicativo reinicie completamente o sistema com suas configurações de fábrica, apagando todos os dados, configuração e aplicativos instalados."</string>
+    <string name="permlab_masterClear">"redefinir o sistema para os padrões de fábrica"</string>
+    <string name="permdesc_masterClear">"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_setTimeZone">"definir fuso horário"</string>
     <string name="permdesc_setTimeZone">"Permite que um aplicativo altere o fuso horário do telefone."</string>
     <string name="permlab_getAccounts">"descobrir contas conhecidas"</string>
     <string name="permdesc_getAccounts">"Permite que um aplicativo obtenha a lista de contas conhecidas pelo telefone."</string>
-    <string name="permlab_accessNetworkState">"exibir estado da rede"</string>
-    <string name="permdesc_accessNetworkState">"Permite que um aplicativo exiba o estado de todas as redes."</string>
-    <string name="permlab_createNetworkSockets">"acesso total à Internet"</string>
+    <string name="permlab_accessNetworkState">"ver estado da rede"</string>
+    <string name="permdesc_accessNetworkState">"Permite que um aplicativo veja o estado de todas as redes."</string>
+    <string name="permlab_createNetworkSockets">"acesso total da internet"</string>
     <string name="permdesc_createNetworkSockets">"Permite que um aplicativo crie soquetes de rede."</string>
-    <string name="permlab_writeApnSettings">"gravar configurações de Nome do ponto de acesso"</string>
-    <string name="permdesc_writeApnSettings">"Permite que um aplicativo modifique as configurações de APN, como Proxy e a Porta de qualquer APN."</string>
+    <string name="permlab_writeApnSettings">"gravar as configurações do Nome do ponto de acesso"</string>
+    <string name="permdesc_writeApnSettings">"Permite que um aplicativo modifique as configurações de APN, como Proxy e Porta de qualquer APN."</string>
     <string name="permlab_changeNetworkState">"alterar conectividade da rede"</string>
-    <string name="permdesc_changeNetworkState">"Permite que um aplicativo mude o estado da conectividade da rede."</string>
-    <!-- no translation found for permlab_changeBackgroundDataSetting (1400666012671648741) -->
-    <skip />
-    <!-- no translation found for permdesc_changeBackgroundDataSetting (1001482853266638864) -->
-    <skip />
-    <string name="permlab_accessWifiState">"exibir estado da rede Wi-Fi"</string>
-    <string name="permdesc_accessWifiState">"Permite que um aplicativo exiba as informações sobre o estado da rede Wi-Fi."</string>
-    <string name="permlab_changeWifiState">"Alterar estado de Wi-Fi"</string>
+    <string name="permdesc_changeNetworkState">"Permite que um aplicativo altere o estado da conectividade de rede."</string>
+    <string name="permlab_changeBackgroundDataSetting">"alterar configuração de uso dos dados de segundo plano"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Permite que um aplicativo altere a configuração de uso dos dados de segundo plano."</string>
+    <string name="permlab_accessWifiState">"visualizar estado da rede Wi-Fi"</string>
+    <string name="permdesc_accessWifiState">"Permite que um aplicativo veja as informações sobre o estado de Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"alterar o estado de Wi-Fi"</string>
     <string name="permdesc_changeWifiState">"Permite que um aplicativo se conecte e desconecte dos pontos de acesso Wi-Fi e faça alterações nas redes Wi-Fi configuradas."</string>
     <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
     <skip />
     <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
     <skip />
-    <string name="permlab_bluetoothAdmin">"administração do bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin">"Permite que um aplicativo configure o telefone Bluetooth local, além de descobrir e parear com dispositivos remotos."</string>
+    <string name="permlab_bluetoothAdmin">"administração de Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Permite que um aplicativo configure o telefone Bluetooth local, descubra e pareie com dispositivos remotos."</string>
     <string name="permlab_bluetooth">"criar conexões Bluetooth"</string>
-    <string name="permdesc_bluetooth">"Permite que um aplicativo exiba a configuração do telefone Bluetooth local e faça e aceite conexões com os dispositivos pareados."</string>
-    <string name="permlab_disableKeyguard">"desativar bloqueio de teclado"</string>
-    <string name="permdesc_disableKeyguard">"Permite que um aplicativo desative o bloqueio do teclado e qualquer segurança de senha associada. Um exemplo legítimo disso é o telefone desativando o bloqueio do teclado ao receber uma chamada e reativando o bloqueio ao final da chamada."</string>
-    <string name="permlab_readSyncSettings">"ler configurações de sincronização"</string>
-    <string name="permdesc_readSyncSettings">"Permite que um aplicativo leia as configurações de sincronização, por exemplo se a sincronização está ativada para Contatos."</string>
+    <string name="permdesc_bluetooth">"Permite que um aplicativo veja a configuração do telefone Bluetooth local e que possa fazer e aceitar conexões com dispositivos pareados."</string>
+    <string name="permlab_disableKeyguard">"desativar o bloqueio de teclas"</string>
+    <string name="permdesc_disableKeyguard">"Permite que um aplicativo desative o bloqueio de teclas e qualquer segurança por senha associada. Um exemplo legítimo disso é a desativação do bloqueio de teclas pelo telefone ao receber uma chamada e a reativação do bloqueio quando a chamada é finalizada."</string>
+    <string name="permlab_readSyncSettings">"ler as configurações de sincronização"</string>
+    <string name="permdesc_readSyncSettings">"Permite que um aplicativo leia as configurações de sincronização, como se a sincronização está ativada para Contatos."</string>
     <string name="permlab_writeSyncSettings">"gravar configurações de sincronização"</string>
-    <string name="permdesc_writeSyncSettings">"Permite que um aplicativo modifique as configurações de sincronização, por exemplo se a sincronização está ativada para Contatos."</string>
+    <string name="permdesc_writeSyncSettings">"Permite que um aplicativo modifique as configurações de sincronização, como a ativação da sincronização para Contatos."</string>
     <string name="permlab_readSyncStats">"ler estatísticas de sincronização"</string>
-    <string name="permdesc_readSyncStats">"Permite que um aplicativo leia as estatísticas de sincronização; por exemplo, o histórico de sincronizações realizadas."</string>
+    <string name="permdesc_readSyncStats">"Permite que um aplicativo leia as estatísticas de sincronização; por exemplo, o histórico de sincronizações ocorridas."</string>
     <string name="permlab_subscribedFeedsRead">"ler feeds inscritos"</string>
-    <string name="permdesc_subscribedFeedsRead">"Permite que um aplicativo obtenha detalhes sobre os feeds sincronizados atualmente."</string>
+    <string name="permdesc_subscribedFeedsRead">"Permite que um aplicativo obtenha detalhes sobre os feeds sincronizados no momento."</string>
     <string name="permlab_subscribedFeedsWrite">"gravar feeds inscritos"</string>
-    <string name="permdesc_subscribedFeedsWrite">"Permite que um aplicativo modifique seus feeds sincronizados recentemente. Isso poderia permitir que um aplicativo malicioso alterasse seus feeds sincronizados."</string>
-    <!-- no translation found for permlab_readDictionary (432535716804748781) -->
-    <skip />
-    <!-- no translation found for permdesc_readDictionary (1082972603576360690) -->
-    <skip />
-    <!-- no translation found for permlab_writeDictionary (6703109511836343341) -->
-    <skip />
-    <!-- no translation found for permdesc_writeDictionary (2241256206524082880) -->
-    <skip />
+    <string name="permdesc_subscribedFeedsWrite">"Permite que um aplicativo modifique os seus feeds atualmente sincronizados. Isso pode permitir que um aplicativo malicioso altere os seus feeds sincronizados."</string>
+    <string name="permlab_readDictionary">"ler dicionário definido pelo usuário"</string>
+    <string name="permdesc_readDictionary">"Permite que um aplicativo leia quaisquer palavras, nomes e frases particulares armazenados pelo usuário no dicionário do usuário."</string>
+    <string name="permlab_writeDictionary">"gravar no dicionário definido pelo usuário"</string>
+    <string name="permdesc_writeDictionary">"Permite que um aplicativo grave novas palavras no dicionário do usuário."</string>
     <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
     <skip />
     <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
     <skip />
   <string-array name="phoneTypes">
-    <item>"Página Inicial"</item>
+    <item>"Página inicial"</item>
     <item>"Celular"</item>
     <item>"Trabalho"</item>
-    <item>"Fax comercial"</item>
+    <item>"Fax do trabalho"</item>
     <item>"Fax doméstico"</item>
     <item>"Pager"</item>
-    <item>"Outro"</item>
-    <item>"Personalizar"</item>
+    <item>"Outros"</item>
+    <item>"Personalizado"</item>
   </string-array>
   <string-array name="emailAddressTypes">
-    <item>"Página Inicial"</item>
+    <item>"Página inicial"</item>
     <item>"Trabalho"</item>
-    <item>"Outro"</item>
-    <item>"Personalizar"</item>
+    <item>"Outros"</item>
+    <item>"Personalizado"</item>
   </string-array>
-    <!-- no translation found for mobileEmailTypeName (2858957283716687707) -->
-    <skip />
+    <string name="mobileEmailTypeName">"Celular"</string>
   <string-array name="postalAddressTypes">
-    <item>"Página Inicial"</item>
+    <item>"Página inicial"</item>
     <item>"Trabalho"</item>
-    <item>"Outro"</item>
-    <item>"Personalizar"</item>
+    <item>"Outros"</item>
+    <item>"Personalizado"</item>
   </string-array>
   <string-array name="imAddressTypes">
-    <item>"Página Inicial"</item>
+    <item>"Página inicial"</item>
     <item>"Trabalho"</item>
-    <item>"Outro"</item>
-    <item>"Personalizar"</item>
+    <item>"Outros"</item>
+    <item>"Personalizado"</item>
   </string-array>
   <string-array name="organizationTypes">
     <item>"Trabalho"</item>
-    <item>"Outro"</item>
-    <item>"Personalizar"</item>
+    <item>"Outros"</item>
+    <item>"Personalizado"</item>
   </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
@@ -475,76 +459,80 @@
   </string-array>
     <string name="keyguard_password_enter_pin_code">"Digite o código PIN"</string>
     <string name="keyguard_password_wrong_pin_code">"Código PIN incorreto!"</string>
-    <string name="keyguard_label_text">"Para desbloquear, pressione Menu e 0."</string>
+    <string name="keyguard_label_text">"Para desbloquear, pressione Menu e, em seguida, 0."</string>
     <string name="emergency_call_dialog_number_for_display">"Número de emergência"</string>
     <string name="lockscreen_carrier_default">"(Sem serviço)"</string>
     <string name="lockscreen_screen_locked">"Tela bloqueada."</string>
-    <string name="lockscreen_instructions_when_pattern_enabled">"Pressione Menu para desbloquear ou fazer chamada de emergência."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Pressione Menu para desbloquear ou fazer uma chamada de emergência."</string>
     <string name="lockscreen_instructions_when_pattern_disabled">"Pressione Menu para desbloquear."</string>
-    <string name="lockscreen_pattern_instructions">"Desenhar padrão para desbloqueio"</string>
+    <string name="lockscreen_pattern_instructions">"Desenhe o padrão para desbloquear"</string>
     <string name="lockscreen_emergency_call">"Chamada de emergência"</string>
     <string name="lockscreen_pattern_correct">"Correto!"</string>
-    <string name="lockscreen_pattern_wrong">"Sentimos muito, tente novamente"</string>
-    <!-- no translation found for lockscreen_plugged_in (613343852842944435) -->
+    <string name="lockscreen_pattern_wrong">"Tente novamente"</string>
+    <string name="lockscreen_plugged_in">"Carregando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
     <skip />
-    <string name="lockscreen_low_battery">"Conecte o carregador."</string>
+    <string name="lockscreen_low_battery">"Conecte o seu carregador."</string>
     <string name="lockscreen_missing_sim_message_short">"Sem cartão SIM."</string>
     <string name="lockscreen_missing_sim_message">"Não há um cartão SIM no telefone."</string>
     <string name="lockscreen_missing_sim_instructions">"Insira um cartão SIM."</string>
     <string name="lockscreen_network_locked_message">"Rede bloqueada"</string>
     <string name="lockscreen_sim_puk_locked_message">"O cartão SIM está bloqueado pelo PUK."</string>
-    <!-- no translation found for lockscreen_sim_puk_locked_instructions (635967534992394321) -->
-    <skip />
+    <string name="lockscreen_sim_puk_locked_instructions">"Consulte o Guia do Usuário ou entre em contato com o Serviço de atendimento ao cliente."</string>
     <string name="lockscreen_sim_locked_message">"O cartão SIM está bloqueado."</string>
-    <string name="lockscreen_sim_unlock_progress_dialog_message">"Desbloqueando cartão SIM…"</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Você desenhou incorretamente seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem êxito, você receberá uma solicitação para desbloquear o telefone usando seu login do Google."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
-    <string name="lockscreen_too_many_failed_attempts_countdown">"Tentar novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Desbloqueando o cartão SIM…"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Você desenhou incorretamente o seu padrão de desbloqueio <xliff:g id="NUMBER_0">%d</xliff:g> vezes. "\n\n"Tente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Você desenhou o seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas e você receberá uma solicitação para desbloquear o seu telefone usando o seu login do Google."\n\n" Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Tente novamente em <xliff:g id="NUMBER">%d</xliff:g> segundos."</string>
     <string name="lockscreen_forgot_pattern_button_text">"Esqueceu o padrão?"</string>
     <string name="lockscreen_glogin_too_many_attempts">"Muitas tentativas de padrão!"</string>
-    <!-- no translation found for lockscreen_glogin_instructions (1816635201812207709) -->
-    <skip />
+    <string name="lockscreen_glogin_instructions">"Para desbloquear, faça login com a sua Conta do Google."</string>
     <string name="lockscreen_glogin_username_hint">"Nome de usuário (e-mail)"</string>
     <string name="lockscreen_glogin_password_hint">"Senha"</string>
     <string name="lockscreen_glogin_submit_button">"Fazer login"</string>
     <string name="lockscreen_glogin_invalid_input">"Nome de usuário ou senha inválida."</string>
-    <!-- no translation found for hour_ampm (4329881288269772723) -->
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
     <skip />
-    <!-- no translation found for hour_cap_ampm (1829009197680861107) -->
-    <skip />
-    <string name="status_bar_clear_all_button">"Limpar notificações"</string>
-    <string name="status_bar_no_notifications_title">"Sem modificações"</string>
+    <string name="status_bar_no_notifications_title">"Sem notificações"</string>
     <string name="status_bar_ongoing_events_title">"Em andamento"</string>
     <string name="status_bar_latest_events_title">"Notificações"</string>
-    <!-- no translation found for battery_status_text_percent_format (7660311274698797147) -->
-    <skip />
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="battery_status_charging">"Carregando..."</string>
     <string name="battery_low_title">"Conecte o carregador"</string>
-    <string name="battery_low_subtitle">"A carga da bateria está ficando baixa:"</string>
+    <string name="battery_low_subtitle">"A bateria está ficando baixa:"</string>
     <string name="battery_low_percent_format">"menos de <xliff:g id="NUMBER">%d%%</xliff:g> restantes."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"Falha no teste de fábrica"</string>
     <string name="factorytest_not_system">"A ação FACTORY_TEST é suportada apenas para pacotes instalados em /system/app."</string>
-    <string name="factorytest_no_action">"Nenhum pacote foi encontrado que forneça a ação FACTORY_TEST."</string>
+    <string name="factorytest_no_action">"Nenhum pacote que forneça a ação FACTORY_TEST foi encontrado."</string>
     <string name="factorytest_reboot">"Reiniciar"</string>
-    <!-- no translation found for js_dialog_title (8143918455087008109) -->
-    <skip />
-    <!-- no translation found for js_dialog_title_default (6961903213729667573) -->
-    <skip />
-    <!-- no translation found for js_dialog_before_unload (1901675448179653089) -->
-    <skip />
+    <string name="js_dialog_title">"A página em \"<xliff:g id="TITLE">%s</xliff:g>\" mostra:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Deseja sair desta página?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Selecione OK para continuar ou Cancelar para permanecer na página atual."</string>
     <string name="save_password_label">"Confirmar"</string>
-    <string name="save_password_message">"Deseja que o navegador se lembre desta senha?"</string>
-    <string name="save_password_notnow">"Não agora"</string>
-    <string name="save_password_remember">"Lembre-se"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Deseja que o navegador lembre desta senha?"</string>
+    <string name="save_password_notnow">"Agora não"</string>
+    <string name="save_password_remember">"Lembrar"</string>
     <string name="save_password_never">"Nunca"</string>
-    <string name="open_permission_deny">"Você não tem permissão para abrir essa página."</string>
+    <string name="open_permission_deny">"Você não tem permissão para abrir esta página."</string>
     <string name="text_copied">"Texto copiado para a área de transferência."</string>
     <string name="more_item_label">"Mais"</string>
     <string name="prepend_shortcut_label">"Menu+"</string>
     <string name="menu_space_shortcut_label">"espaço"</string>
     <string name="menu_enter_shortcut_label">"enter"</string>
     <string name="menu_delete_shortcut_label">"excluir"</string>
-    <string name="search_go">"Procurar"</string>
+    <string name="search_go">"Pesquisar"</string>
     <string name="oneMonthDurationPast">"1 mês atrás"</string>
     <string name="beforeOneMonthDurationPast">"Antes de 1 mês atrás"</string>
   <plurals name="num_seconds_ago">
@@ -552,11 +540,11 @@
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> segundos atrás"</item>
   </plurals>
   <plurals name="num_minutes_ago">
-    <item quantity="one">"1 minute atrás"</item>
+    <item quantity="one">"1 minuto atrás"</item>
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> minutos atrás"</item>
   </plurals>
   <plurals name="num_hours_ago">
-    <item quantity="one">"1 hora trás"</item>
+    <item quantity="one">"1 hora atrás"</item>
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> horas atrás"</item>
   </plurals>
   <plurals name="num_days_ago">
@@ -573,55 +561,69 @@
   </plurals>
   <plurals name="in_num_hours">
     <item quantity="one">"em 1 hora"</item>
-    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+    <item quantity="other">"Em <xliff:g id="COUNT">%d</xliff:g> horas"</item>
   </plurals>
   <plurals name="in_num_days">
     <item quantity="one">"amanhã"</item>
     <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> dias"</item>
   </plurals>
-    <!-- no translation found for abbrev_num_seconds_ago:one (1849036840200069118) -->
-    <!-- no translation found for abbrev_num_seconds_ago:other (3699169366650930415) -->
-    <!-- no translation found for abbrev_num_minutes_ago:one (6361490147113871545) -->
-    <!-- no translation found for abbrev_num_minutes_ago:other (851164968597150710) -->
-    <!-- no translation found for abbrev_num_hours_ago:one (4796212039724722116) -->
-    <!-- no translation found for abbrev_num_hours_ago:other (6889970745748538901) -->
-    <!-- no translation found for abbrev_num_days_ago:one (8463161711492680309) -->
-    <!-- no translation found for abbrev_num_days_ago:other (3453342639616481191) -->
-    <!-- no translation found for abbrev_in_num_seconds:one (5842225370795066299) -->
-    <!-- no translation found for abbrev_in_num_seconds:other (5495880108825805108) -->
-    <!-- no translation found for abbrev_in_num_minutes:one (562786149928284878) -->
-    <!-- no translation found for abbrev_in_num_minutes:other (4216113292706568726) -->
-    <!-- no translation found for abbrev_in_num_hours:one (3274708118124045246) -->
-    <!-- no translation found for abbrev_in_num_hours:other (3705373766798013406) -->
-    <!-- no translation found for abbrev_in_num_days:one (2178576254385739855) -->
-    <!-- no translation found for abbrev_in_num_days:other (2973062968038355991) -->
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"1 seg. atrás"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> segundos\n  atrás"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"1 minuto atrás"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> minutos atrás"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"1 hora atrás"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> horas atrás"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"ontem"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dias atrás"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"em 1 segundo"</item>
+    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> segundos"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"em 1 minuto"</item>
+    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> minutos"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"em 1 hora"</item>
+    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> horas"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"amanhã"</item>
+    <item quantity="other">"em <xliff:g id="COUNT">%d</xliff:g> dias"</item>
+  </plurals>
     <string name="preposition_for_date">"em %s"</string>
-    <string name="preposition_for_time">"a %s"</string>
+    <string name="preposition_for_time">"às %s"</string>
     <string name="preposition_for_year">"em %s"</string>
     <string name="day">"dia"</string>
     <string name="days">"dias"</string>
     <string name="hour">"hora"</string>
     <string name="hours">"horas"</string>
-    <string name="minute">"minuto"</string>
-    <string name="minutes">"minutos"</string>
-    <string name="second">"segundos"</string>
+    <string name="minute">"min."</string>
+    <string name="minutes">"min."</string>
+    <string name="second">"seg."</string>
     <string name="seconds">"segundos"</string>
     <string name="week">"semana"</string>
     <string name="weeks">"semanas"</string>
     <string name="year">"ano"</string>
     <string name="years">"anos"</string>
-    <string name="every_weekday">"Todo dia de semana (Seg–Sex)"</string>
+    <string name="every_weekday">"Todos os dias da semana (de segunda a sexta)"</string>
     <string name="daily">"Diariamente"</string>
-    <string name="weekly">"Semanalmente em <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="weekly">"Semanalmente na <xliff:g id="DAY">%s</xliff:g>"</string>
     <string name="monthly">"Mensalmente"</string>
     <string name="yearly">"Anualmente"</string>
     <string name="VideoView_error_title">"Não é possível reproduzir o vídeo"</string>
-    <!-- no translation found for VideoView_error_text_invalid_progressive_playback (897920883624437033) -->
-    <skip />
-    <string name="VideoView_error_text_unknown">"Sentimos muito, este vídeo não pode ser reproduzido."</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Este vídeo não é válido para transmissão com este dispositivo."</string>
+    <string name="VideoView_error_text_unknown">"Este vídeo não pode ser reproduzido."</string>
     <string name="VideoView_error_button">"OK"</string>
-    <!-- no translation found for relative_time (1818557177829411417) -->
-    <skip />
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
     <string name="noon">"meio-dia"</string>
     <string name="Noon">"Meio-dia"</string>
     <string name="midnight">"meia-noite"</string>
@@ -630,7 +632,7 @@
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Selecionar tudo"</string>
     <string name="selectText">"Selecionar texto"</string>
-    <string name="stopSelectingText">"Interromper seleção de texto"</string>
+    <string name="stopSelectingText">"Parar seleção de texto"</string>
     <string name="cut">"Recortar"</string>
     <string name="cutAll">"Recortar tudo"</string>
     <string name="copy">"Copiar"</string>
@@ -638,154 +640,124 @@
     <string name="paste">"Colar"</string>
     <string name="copyUrl">"Copiar URL"</string>
     <string name="inputMethod">"Método de entrada"</string>
-    <!-- no translation found for addToDictionary (726256909274177272) -->
-    <skip />
+    <string name="addToDictionary">"Adicionar \"%s\" ao dicionário"</string>
     <string name="editTextMenuTitle">"Editar texto"</string>
     <string name="low_internal_storage_view_title">"Pouco espaço"</string>
-    <string name="low_internal_storage_view_text">"O espaço de armazenamento do telefone está diminuindo."</string>
+    <string name="low_internal_storage_view_text">"O espaço de armazenamento do telefone está ficando baixo."</string>
     <string name="ok">"OK"</string>
     <string name="cancel">"Cancelar"</string>
     <string name="yes">"OK"</string>
     <string name="no">"Cancelar"</string>
-    <!-- no translation found for dialog_alert_title (2049658708609043103) -->
-    <skip />
-    <string name="capital_on">"LIGAR"</string>
-    <string name="capital_off">"DESLIGADO"</string>
-    <string name="whichApplication">"Completar ação usando"</string>
-    <string name="alwaysUse">"Use por padrão para esta ação."</string>
-    <string name="clearDefaultHintMsg">"Limpar o padrão nas Configurações da página inicial&gt; Aplicativos &gt; Gerenciar aplicativos."</string>
-    <string name="chooseActivity">"Selecione uma ação"</string>
-    <string name="noApplications">"Nenhum aplicativo pode executar essa ação."</string>
-    <string name="aerr_title">"Sentimos muito."</string>
-    <string name="aerr_application">"O aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g>(processo <xliff:g id="PROCESS">%2$s</xliff:g>) parou inesperadamente. Tente novamente."</string>
+    <string name="dialog_alert_title">"Atenção"</string>
+    <string name="capital_on">"ATIVADO"</string>
+    <string name="capital_off">"DESATIVADO"</string>
+    <string name="whichApplication">"Complete a ação usando"</string>
+    <string name="alwaysUse">"Use o como padrão para esta ação."</string>
+    <string name="clearDefaultHintMsg">"Limpar o padrão em Configurações da página inicial &gt; Aplicativos &gt; Gerenciar aplicativos."</string>
+    <string name="chooseActivity">"Selecionar uma ação"</string>
+    <string name="noApplications">"Nenhum aplicativo pode realizar esta ação."</string>
+    <string name="aerr_title">"Desculpe!"</string>
+    <string name="aerr_application">"O aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g> (processo <xliff:g id="PROCESS">%2$s</xliff:g>) parou inesperadamente. Tente novamente."</string>
     <string name="aerr_process">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou inesperadamente. Tente novamente."</string>
-    <string name="anr_title">"Sentimos muito."</string>
+    <string name="anr_title">"Desculpe!"</string>
     <string name="anr_activity_application">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> (no aplicativo <xliff:g id="APPLICATION">%2$s</xliff:g>) não está respondendo."</string>
-    <string name="anr_activity_process">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g> em processamento) não está respondendo."</string>
-    <string name="anr_application_process">"O aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g> (<xliff:g id="PROCESS">%2$s</xliff:g> em processamento) não está respondendo."</string>
+    <string name="anr_activity_process">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> (no processo <xliff:g id="PROCESS">%2$s</xliff:g>) não está respondendo."</string>
+    <string name="anr_application_process">"O aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g> (no processo <xliff:g id="PROCESS">%2$s</xliff:g>) não está respondendo."</string>
     <string name="anr_process">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> não está respondendo."</string>
     <string name="force_close">"Forçar fechamento"</string>
     <!-- no translation found for report (4060218260984795706) -->
     <skip />
-    <string name="wait">"Aguarde"</string>
-    <string name="debug">"Depuração"</string>
-    <string name="sendText">"Selecione uma ação para texto"</string>
+    <string name="wait">"Aguardar"</string>
+    <string name="debug">"Depurar"</string>
+    <string name="sendText">"Selecione uma ação para o texto"</string>
     <string name="volume_ringtone">"Volume da campainha"</string>
     <string name="volume_music">"Volume da mídia"</string>
-    <string name="volume_music_hint_playing_through_bluetooth">"Reprodução usando Bluetooth"</string>
-    <string name="volume_call">"Volume da chamada recebida"</string>
-    <!-- no translation found for volume_bluetooth_call (2002891926351151534) -->
-    <skip />
+    <string name="volume_music_hint_playing_through_bluetooth">"Reproduzindo por meio de Bluetooth"</string>
+    <string name="volume_call">"Volume na chamada"</string>
+    <string name="volume_bluetooth_call">"Volume de chamada Bluetooth"</string>
     <string name="volume_alarm">"Volume do alarme"</string>
     <string name="volume_notification">"Volume da notificação"</string>
     <string name="volume_unknown">"Volume"</string>
-    <string name="ringtone_default">"Ringtone padrão"</string>
-    <string name="ringtone_default_with_actual">"Ringtone padrão (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_default">"Toque padrão"</string>
+    <string name="ringtone_default_with_actual">"Toque padrão (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"Silencioso"</string>
-    <string name="ringtone_picker_title">"Ringtones"</string>
-    <string name="ringtone_unknown">"Ringtone desconhecido"</string>
+    <string name="ringtone_picker_title">"Toques"</string>
+    <string name="ringtone_unknown">"Toque desconhecido"</string>
   <plurals name="wifi_available">
     <item quantity="one">"Rede Wi-Fi disponível"</item>
     <item quantity="other">"Redes Wi-Fi disponíveis"</item>
   </plurals>
   <plurals name="wifi_available_detailed">
-    <item quantity="one">"Redes Wi-Fi abertas disponíveis"</item>
+    <item quantity="one">"Rede Wi-Fi aberta disponível"</item>
     <item quantity="other">"Redes Wi-Fi abertas disponíveis"</item>
   </plurals>
     <string name="select_character">"Inserir caractere"</string>
     <string name="sms_control_default_app_name">"Aplicativo desconhecido"</string>
-    <string name="sms_control_title">"Envio de mensagens SMS"</string>
-    <string name="sms_control_message">"Uma grande quantidade de mensagens SMS está sendo enviada. Selecione \"OK\" para continuar ou \"Cancelar\" para parar de enviar."</string>
+    <string name="sms_control_title">"Enviando mensagens SMS"</string>
+    <string name="sms_control_message">"Muitas mensagens SMS estão sendo enviadas. Selecione \"OK\" para continuar ou \"Cancelar\" para interromper o envio."</string>
     <string name="sms_control_yes">"OK"</string>
     <string name="sms_control_no">"Cancelar"</string>
     <string name="date_time_set">"Definir"</string>
     <string name="default_permission_group">"Padrão"</string>
-    <string name="no_permissions">"Nenhuma permissão é necessária"</string>
+    <string name="no_permissions">"Nenhuma permissão necessária"</string>
     <string name="perms_hide"><b>"Ocultar"</b></string>
-    <string name="perms_show_all"><b>"Mostrar tudo"</b></string>
-    <string name="googlewebcontenthelper_loading">"Carregando…"</string>
-    <string name="usb_storage_title">"Conectado via USB"</string>
-    <string name="usb_storage_message">"Você conectou o telefone ao seu computador via USB. Selecione \"Montar\" se quiser copiar os arquivos entre seu computador e o cartão SD do telefone."</string>
+    <string name="perms_show_all"><b>"Mostrar todas"</b></string>
+    <string name="googlewebcontenthelper_loading">"Carregando..."</string>
+    <string name="usb_storage_title">"Conectado por USB"</string>
+    <string name="usb_storage_message">"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">"Montar"</string>
     <string name="usb_storage_button_unmount">"Não montar"</string>
     <string name="usb_storage_error_message">"Há um problema com o uso do seu cartão SD para armazenamento USB."</string>
-    <string name="usb_storage_notification_title">"Conectado via USB"</string>
-    <string name="usb_storage_notification_message">"Selecione para copiar os arquivos para/do computador."</string>
-    <!-- no translation found for usb_storage_stop_notification_title (2336058396663516017) -->
+    <string name="usb_storage_notification_title">"Conectado por USB"</string>
+    <string name="usb_storage_notification_message">"Selecione para copiar arquivos para/do seu computador."</string>
+    <string name="usb_storage_stop_notification_title">"Desativar o armazenamento USB"</string>
+    <string name="usb_storage_stop_notification_message">"Selecione para desativar o armazenamento USB."</string>
+    <string name="usb_storage_stop_title">"Desativar o armazenamento USB"</string>
+    <string name="usb_storage_stop_message">"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">"Desativar"</string>
+    <string name="usb_storage_stop_button_unmount">"Cancelar"</string>
+    <string name="usb_storage_stop_error_message">"Encontramos um problema ao desativar o armazenamento USB. Verifique se desmontou o host USB e tente novamente."</string>
+    <string name="extmedia_format_title">"Formatar cartão SD"</string>
+    <string name="extmedia_format_message">"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">"Formatar"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
     <skip />
-    <!-- no translation found for usb_storage_stop_notification_message (2591813490269841539) -->
-    <skip />
-    <!-- no translation found for usb_storage_stop_title (6014127947456185321) -->
-    <skip />
-    <!-- no translation found for usb_storage_stop_message (2390958966725232848) -->
-    <skip />
-    <!-- no translation found for usb_storage_stop_button_mount (1181858854166273345) -->
-    <skip />
-    <!-- no translation found for usb_storage_stop_button_unmount (3774611918660582898) -->
-    <skip />
-    <!-- no translation found for usb_storage_stop_error_message (3917317248440072084) -->
-    <skip />
-    <!-- no translation found for extmedia_format_title (8663247929551095854) -->
-    <skip />
-    <!-- no translation found for extmedia_format_message (3621369962433523619) -->
-    <skip />
-    <!-- no translation found for extmedia_format_button_format (4131064560127478695) -->
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
     <skip />
     <string name="select_input_method">"Selecionar método de entrada"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
-    <!-- no translation found for candidates_style (4333913089637062257) -->
+    <string name="candidates_style"><u>"candidatos"</u></string>
+    <string name="ext_media_checking_notification_title">"Preparando o cartão SD"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
     <skip />
-    <!-- no translation found for ext_media_checking_notification_title (5457603418970994050) -->
+    <string name="ext_media_nofs_notification_title">"Cartão SD em branco"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
     <skip />
-    <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
+    <string name="ext_media_unmountable_notification_title">"Cartão SD danificado"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
     <skip />
-    <!-- no translation found for ext_media_nofs_notification_title (780477838241212997) -->
+    <string name="ext_media_badremoval_notification_title">"Cartão SD removido inesperadamente."</string>
+    <string name="ext_media_badremoval_notification_message">"Desmonte o cartão SD antes da remoção para evitar a perda de dados."</string>
+    <string name="ext_media_safe_unmount_notification_title">"O cartão SD já pode ser removido com segurança."</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
     <skip />
-    <!-- no translation found for ext_media_nofs_notification_message (1312266820092958014) -->
+    <string name="ext_media_nomedia_notification_title">"Cartão SD removido"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
     <skip />
-    <!-- no translation found for ext_media_unmountable_notification_title (6410723906019100189) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (2679412884290061775) -->
-    <skip />
-    <!-- no translation found for ext_media_badremoval_notification_title (6872152882604407837) -->
-    <skip />
-    <!-- no translation found for ext_media_badremoval_notification_message (7260183293747448241) -->
-    <skip />
-    <!-- no translation found for ext_media_safe_unmount_notification_title (6729801130790616200) -->
-    <skip />
-    <!-- no translation found for ext_media_safe_unmount_notification_message (7613960686747592770) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (8902518030404381318) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (4205117227342822275) -->
-    <skip />
-    <!-- no translation found for activity_list_empty (4168820609403385789) -->
-    <skip />
-    <!-- no translation found for permlab_pkgUsageStats (8787352074326748892) -->
-    <skip />
-    <!-- no translation found for permdesc_pkgUsageStats (891553695716752835) -->
-    <skip />
-    <!-- no translation found for tutorial_double_tap_to_zoom_message_short (1311810005957319690) -->
-    <skip />
-    <!-- no translation found for gadget_host_error_inflating (2613287218853846830) -->
-    <skip />
-    <!-- no translation found for ime_action_go (8320845651737369027) -->
-    <skip />
-    <!-- no translation found for ime_action_search (658110271822807811) -->
-    <skip />
-    <!-- no translation found for ime_action_send (2316166556349314424) -->
-    <skip />
-    <!-- no translation found for ime_action_next (3138843904009813834) -->
-    <skip />
-    <!-- no translation found for ime_action_done (8971516117910934605) -->
-    <skip />
-    <!-- no translation found for ime_action_default (2840921885558045721) -->
-    <skip />
-    <!-- no translation found for dial_number_using (5789176425167573586) -->
-    <skip />
-    <!-- no translation found for create_contact_using (4947405226788104538) -->
-    <skip />
+    <string name="activity_list_empty">"Nenhum atividade correspondente foi encontrada"</string>
+    <string name="permlab_pkgUsageStats">"atualizar estatísticas de uso do componente"</string>
+    <string name="permdesc_pkgUsageStats">"Permite a modificação das estatísticas de uso do componente coletadas. Não deve ser usado por aplicativos normais."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Toque duas vezes para ter controle do zoom"</string>
+    <string name="gadget_host_error_inflating">"Erro ao aumentar o widget"</string>
+    <string name="ime_action_go">"Ir"</string>
+    <string name="ime_action_search">"Pesquisar"</string>
+    <string name="ime_action_send">"Enviar"</string>
+    <string name="ime_action_next">"Próximo"</string>
+    <string name="ime_action_done">"Concluído"</string>
+    <string name="ime_action_default">"Executar"</string>
+    <string name="dial_number_using">"Discar número"\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Criar contato "\n"usando <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
     <skip />
     <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 048f6b1..03284c1 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -15,328 +15,404 @@
 -->
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="byteShort">"б"</string>
-    <string name="kilobyteShort">"Кб"</string>
-    <string name="megabyteShort">"Мб"</string>
-    <string name="gigabyteShort">"Гб"</string>
-    <string name="terabyteShort">"Тб"</string>
-    <string name="petabyteShort">"Пб"</string>
+    <string name="byteShort">"Б"</string>
+    <string name="kilobyteShort">"КБ"</string>
+    <string name="megabyteShort">"МБ"</string>
+    <string name="gigabyteShort">"ГБ"</string>
+    <string name="terabyteShort">"TБ"</string>
+    <string name="petabyteShort">"ПБ"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;без названия&gt;"</string>
     <string name="ellipsis">"…"</string>
     <string name="emptyPhoneNumber">"(Нет номера телефона)"</string>
     <string name="unknownName">"(Неизвестно)"</string>
     <string name="defaultVoiceMailAlphaTag">"Голосовая почта"</string>
     <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
-    <string name="mmiError">"Проблема с подключением или недействительный код MMI."</string>
+    <string name="mmiError">"Неполадки подключения или неверный код MMI."</string>
     <string name="serviceEnabled">"Служба включена."</string>
-    <string name="serviceEnabledFor">"Служба включена для следующего:"</string>
+    <string name="serviceEnabledFor">"Служба подключена для:"</string>
     <string name="serviceDisabled">"Служба отключена."</string>
-    <string name="serviceRegistered">"Регистрация прошла успешно."</string>
-    <string name="serviceErased">"Удаление прошло успешно."</string>
+    <string name="serviceRegistered">"Регистрация пройдена успешно."</string>
+    <string name="serviceErased">"Удаление выполнено успешно."</string>
     <string name="passwordIncorrect">"Неверный пароль."</string>
-    <string name="mmiComplete">"Код MMI завершен."</string>
-    <string name="badPin">"Указан неверный старый PIN."</string>
-    <string name="badPuk">"Указан неверный PUK."</string>
-    <string name="mismatchPin">"Указанные PIN-коды не совпадают."</string>
-    <string name="invalidPin">"Введите PIN, содержащий от 4 до 8 цифр."</string>
-    <string name="needPuk">"Ваша SIM-карта заблокирована PUK-кодом. Введите PUK, чтобы разблокировать ее."</string>
-    <string name="needPuk2">"Введите PUK2 для разблокирования SIM-карты."</string>
-    <string name="ClipMmi">"Идентификатор звонящего"</string>
-    <string name="ClirMmi">"Идентификатор принимающего вызов"</string>
-    <string name="CfMmi">"Перенаправление вызовов"</string>
-    <string name="CwMmi">"Ожидание вызова"</string>
+    <string name="mmiComplete">"Запрос MMI завершен."</string>
+    <string name="badPin">"Введен неверный старый PUK."</string>
+    <string name="badPuk">"Введен неверный PUK."</string>
+    <string name="mismatchPin">"Введенные PIN-коды не совпадают."</string>
+    <string name="invalidPin">"Введите PIN-код (от 4 до 8 цифр)."</string>
+    <string name="needPuk">"SIM-карта заблокирована с помощью кода PUK. Для разблокировки введите код PUK."</string>
+    <string name="needPuk2">"Для разблокировки SIM-карты введите PUK2."</string>
+    <string name="ClipMmi">"Идентификация вызывающего абонента"</string>
+    <string name="ClirMmi">"Идентификация звонящего абонента"</string>
+    <string name="CfMmi">"Переадресация вызова"</string>
+    <string name="CwMmi">"Параллельный вызов"</string>
     <string name="BaMmi">"Запрет вызовов"</string>
-    <string name="PwdMmi">"Изменение пароля"</string>
-    <string name="PinMmi">"Изменение PIN"</string>
-    <string name="CLIRDefaultOnNextCallOn">"Идентификатор звонящего по умолчанию ограничен. Следующий вызов: ограничен"</string>
-    <string name="CLIRDefaultOnNextCallOff">"Идентификатор звонящего по умолчанию ограничен. Следующий вызов: не ограничен"</string>
-    <string name="CLIRDefaultOffNextCallOn">"Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: ограничен"</string>
-    <string name="CLIRDefaultOffNextCallOff">"Идентификатор звонящего по умолчанию не ограничен. Следующий вызов: не ограничен"</string>
+    <string name="PwdMmi">"Смена пароля"</string>
+    <string name="PinMmi">"Смена PIN"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"Идентификация абонента по умолчанию запрещена. След. вызов: запрещена"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Идентификация абонента по умолчанию запрещена. След. вызов: разрешена"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Идентификация абонента по умолчанию не запрещена. След. вызов: запрещена"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Идентификация абонента по умолчанию не запрещена. След. вызов: разрешена"</string>
     <string name="serviceNotProvisioned">"Услуга не предоставляется."</string>
-    <string name="CLIRPermanent">"Нельзя изменить настройки идентификатора звонящего."</string>
+    <string name="CLIRPermanent">"Невозможно изменить настройку идентификации абонента."</string>
     <string name="RestrictedChangedTitle">"Ограничения доступа изменены"</string>
     <string name="RestrictedOnData">"Служба данных заблокирована."</string>
-    <string name="RestrictedOnEmergency">"Аварийная служба заблокирована."</string>
+    <string name="RestrictedOnEmergency">"Служба экстренной помощи заблокирована."</string>
     <string name="RestrictedOnNormal">"Служба передачи SMS/голосовых сообщений заблокирована."</string>
     <string name="RestrictedOnAll">"Все службы передачи SMS/голосовых сообщений заблокированы."</string>
-    <string name="serviceClassVoice">"Голос"</string>
+    <string name="serviceClassVoice">"Голосовая связь"</string>
     <string name="serviceClassData">"Данные"</string>
     <string name="serviceClassFAX">"ФАКС"</string>
     <string name="serviceClassSMS">"SMS"</string>
     <string name="serviceClassDataAsync">"Асинхр."</string>
-    <string name="serviceClassDataSync">"Синхронизация"</string>
-    <string name="serviceClassPacket">"Пакетные данные"</string>
+    <string name="serviceClassDataSync">"Синхр."</string>
+    <string name="serviceClassPacket">"Пакет"</string>
     <string name="serviceClassPAD">"PAD"</string>
-    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не переадресовано"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> через <xliff:g id="TIME_DELAY">{2}</xliff:g> сек."</string>
-    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
-    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: не перенаправлено"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> через <xliff:g id="TIME_DELAY">{2}</xliff:g> с."</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Не переадресовано"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Не переадресовано"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"ОК"</string>
-    <string name="httpError">"Веб-страница содержит ошибку."</string>
-    <string name="httpErrorLookup">"Не удается найти URL."</string>
+    <string name="httpError">"Ошибка на веб-странице."</string>
+    <string name="httpErrorLookup">"Не удалось найти URL."</string>
     <string name="httpErrorUnsupportedAuthScheme">"Схема аутентификации сайта не поддерживается."</string>
-    <string name="httpErrorAuth">"Не удалось выполнить аутентификацию."</string>
+    <string name="httpErrorAuth">"Не удалось провести аутентификацию."</string>
     <string name="httpErrorProxyAuth">"Не удалось выполнить аутентификацию через прокси-сервер."</string>
-    <string name="httpErrorConnect">"Не удалось связаться с сервером."</string>
-    <string name="httpErrorIO">"Сервер не отвечает. Повторите попытку позже."</string>
-    <string name="httpErrorTimeout">"Время подключения к серверу истекло."</string>
-    <string name="httpErrorRedirectLoop">"Страница содержит слишком много перенаправлений."</string>
-    <string name="httpErrorUnsupportedScheme">"Протокол не поддерживается"</string>
-    <string name="httpErrorFailedSslHandshake">"Невозможно установить безопасное соединение."</string>
-    <string name="httpErrorBadUrl">"Невозможно открыть страницу, поскольку URL недействителен."</string>
-    <string name="httpErrorFile">"Нет доступа к файлу."</string>
-    <string name="httpErrorFileNotFound">"Нужный файл не найден."</string>
-    <string name="httpErrorTooManyRequests">"Обрабатывается слишком много запросов. Повторите попытку позже."</string>
-    <string name="contentServiceSync">"Синхронизация"</string>
-    <string name="contentServiceSyncNotificationTitle">"Синхронизация"</string>
+    <string name="httpErrorConnect">"Не удалось подключиться к серверу."</string>
+    <string name="httpErrorIO">"Сервер не отвечает. Повторите попытку позднее."</string>
+    <string name="httpErrorTimeout">"Время ожидания соединения с сервером истекло."</string>
+    <string name="httpErrorRedirectLoop">"Страница содержит слишком много перенаправлений сервера."</string>
+    <string name="httpErrorUnsupportedScheme">"Этот протокол не поддерживается."</string>
+    <string name="httpErrorFailedSslHandshake">"Не удалось установить безопасное соединение."</string>
+    <string name="httpErrorBadUrl">"Не удалось открыть страницу. Указан недопустимый URL."</string>
+    <string name="httpErrorFile">"Не удается получить доступ к файлу."</string>
+    <string name="httpErrorFileNotFound">"Не удалось найти указанные файлы."</string>
+    <string name="httpErrorTooManyRequests">"Обрабатывается слишком много запросов. Повторите попытку позднее."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Синхр."</string>
+    <string name="contentServiceSyncNotificationTitle">"Синхр."</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"Слишком много удалений <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
-    <string name="low_memory">"Память телефона полна! Удалите какие-нибудь файлы, чтобы освободить место."</string>
+    <string name="low_memory">"Память телефона заполнена! Удалите файлы, чтобы освободить место."</string>
     <string name="me">"Я"</string>
     <string name="power_dialog">"Параметры телефона"</string>
     <string name="silent_mode">"Беззвучный режим"</string>
     <string name="turn_on_radio">"Включить беспроводную связь"</string>
-    <string name="turn_off_radio">"Отключить беспроводную связь"</string>
-    <string name="screen_lock">"Заблокировать экран"</string>
-    <string name="power_off">"Отключить питание"</string>
-    <string name="shutdown_progress">"Идет выключение…"</string>
-    <string name="shutdown_confirm">"Телефон будет выключен."</string>
-    <string name="no_recent_tasks">"Нет новых приложений."</string>
+    <string name="turn_off_radio">"Отключить беспроводное соединение"</string>
+    <string name="screen_lock">"Блокировка экрана"</string>
+    <string name="power_off">"Выключить связь"</string>
+    <string name="shutdown_progress">"Выключение..."</string>
+    <string name="shutdown_confirm">"Телефон будет отключен."</string>
+    <string name="no_recent_tasks">"Нет последних приложений."</string>
     <string name="global_actions">"Параметры телефона"</string>
-    <string name="global_action_lock">"Заблокировать экран"</string>
+    <string name="global_action_lock">"Блокировка экрана"</string>
     <string name="global_action_power_off">"Отключить питание"</string>
     <string name="global_action_toggle_silent_mode">"Беззвучный режим"</string>
-    <string name="global_action_silent_mode_on_status">"Звук выключен"</string>
-    <string name="global_action_silent_mode_off_status">"Звук включен"</string>
+    <string name="global_action_silent_mode_on_status">"Звук ВЫКЛ"</string>
+    <string name="global_action_silent_mode_off_status">"Звук ВКЛЮЧЕН"</string>
     <string name="global_actions_toggle_airplane_mode">"Режим полета"</string>
     <string name="global_actions_airplane_mode_on_status">"Режим полета ВКЛЮЧЕН"</string>
     <string name="global_actions_airplane_mode_off_status">"Режим полета ВЫКЛЮЧЕН"</string>
     <string name="safeMode">"Безопасный режим"</string>
     <string name="android_system_label">"Система Android"</string>
-    <string name="permgrouplab_costMoney">"Платные службы"</string>
-    <string name="permgroupdesc_costMoney">"Разрешить приложениям выполнять действия, за которые может взиматься плата."</string>
+    <string name="permgrouplab_costMoney">"Платные услуги"</string>
+    <string name="permgroupdesc_costMoney">"Разрешать приложениям использовать платные услуги."</string>
     <string name="permgrouplab_messages">"Сообщения"</string>
-    <string name="permgroupdesc_messages">"Чтение и запись SMS, электронной почты и других сообщений."</string>
+    <string name="permgroupdesc_messages">"Считывать и записывать SMS, электронные письма и другие сообщения."</string>
     <string name="permgrouplab_personalInfo">"Личная информация"</string>
-    <string name="permgroupdesc_personalInfo">"Прямой доступ к вашим контактам и календарю, сохраненным на телефоне."</string>
+    <string name="permgroupdesc_personalInfo">"Прямой доступ к контактам и событиям календаря, сохраненным в памяти телефона."</string>
     <string name="permgrouplab_location">"Ваше местоположение"</string>
-    <string name="permgroupdesc_location">"Наблюдение за вашим местоположением"</string>
-    <string name="permgrouplab_network">"Связь с сетью"</string>
-    <string name="permgroupdesc_network">"Разрешить приложениям использовать сетевые функции."</string>
+    <string name="permgroupdesc_location">"Отслеживание физического местоположения"</string>
+    <string name="permgrouplab_network">"Сетевой обмен данными"</string>
+    <string name="permgroupdesc_network">"Позволяет приложениям получать доступ к различным сетевым функциям."</string>
     <string name="permgrouplab_accounts">"Ваши аккаунты Google"</string>
-    <string name="permgroupdesc_accounts">"Доступ к имеющимся аккаунтам Google."</string>
-    <string name="permgrouplab_hardwareControls">"Управление оборудованием"</string>
-    <string name="permgroupdesc_hardwareControls">"Прямой доступ к оборудованию телефона."</string>
+    <string name="permgroupdesc_accounts">"Входить в доступные аккаунты Google."</string>
+    <string name="permgrouplab_hardwareControls">"Элементы управления аппаратным обеспечением"</string>
+    <string name="permgroupdesc_hardwareControls">"Прямой доступ к аппаратному обеспечению телефона."</string>
     <string name="permgrouplab_phoneCalls">"Телефонные вызовы"</string>
-    <string name="permgroupdesc_phoneCalls">"Слежение, запись и обработка вызовов."</string>
+    <string name="permgroupdesc_phoneCalls">"Отслеживать, записывать и обрабатывать телефонные звонки."</string>
     <string name="permgrouplab_systemTools">"Системные инструменты"</string>
-    <string name="permgroupdesc_systemTools">"Доступ и управление системой на низком уровне."</string>
-    <string name="permgrouplab_developmentTools">"Средства для разработки"</string>
+    <string name="permgroupdesc_systemTools">"Доступ нижнего уровня и управление системой."</string>
+    <string name="permgrouplab_developmentTools">"Инструменты разработки"</string>
     <string name="permgroupdesc_developmentTools">"Функции, необходимые только разработчикам приложений."</string>
-    <string name="permlab_statusBar">"отключать или изменять панель состояния"</string>
-    <string name="permdesc_statusBar">"Разрешает приложению отключать панель состояния или добавлять и удалять системные значки."</string>
-    <string name="permlab_expandStatusBar">"разворачивать/сворачивать панель состояния"</string>
-    <string name="permdesc_expandStatusBar">"Разрешает приложению разворачивать и сворачивать панель состояния."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"отключить или изменить строку состояния"</string>
+    <string name="permdesc_statusBar">"Позволяет приложению отключать строку состояния или добавлять/удалять системные значки."</string>
+    <string name="permlab_expandStatusBar">"разворачивать/сворачивать строку состояния"</string>
+    <string name="permdesc_expandStatusBar">"Позволяет приложению разворачивать или сворачивать строку состояния."</string>
     <string name="permlab_processOutgoingCalls">"перехватывать исходящие вызовы"</string>
-    <string name="permdesc_processOutgoingCalls">"Разрешает приложению обрабатывать исходящие вызовы и изменять набираемый номер. Вредоносное ПО может следить, перенаправлять или блокировать исходящие вызовы."</string>
+    <string name="permdesc_processOutgoingCalls">"Позволяет приложению обрабатывать исходящие вызовы и изменять набираемый номер. Вредоносные приложения могут отслеживать, перенаправлять или запрещать исходящие вызовы."</string>
     <string name="permlab_receiveSms">"получать SMS"</string>
-    <string name="permdesc_receiveSms">"Разрешает приложениям получать и обрабатывать сообщения SMS. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите."</string>
+    <string name="permdesc_receiveSms">"Позволяет приложению получать и обрабатывать SMS-сообщения. Вредоносные приложения могут отслеживать ваши сообщения или удалять их, не показывая вам."</string>
     <string name="permlab_receiveMms">"получать MMS"</string>
-    <string name="permdesc_receiveMms">"Разрешает приложениям получать и обрабатывать сообщения MMS. Вредоносное ПО может отслеживать ваши сообщения или удалять их, не показав вам."</string>
-    <string name="permlab_sendSms">"отправлять SMS"</string>
-    <string name="permdesc_sendSms">"Разрешает приложениям отправлять SMS. Вредоносное ПО может тратить ваши деньги, отправляя сообщения без вашего ведома."</string>
-    <string name="permlab_readSms">"читать SMS и MMS"</string>
-    <string name="permdesc_readSms">"Разрешает приложению записывать SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может читать конфиденциальные сообщения."</string>
-    <string name="permlab_writeSms">"изменять SMS и MMS"</string>
-    <string name="permdesc_writeSms">"Разрешает приложению записывать данные в SMS, сохраненные в телефоне или на SIM-карте. Вредоносное ПО может удалять сообщения."</string>
-    <string name="permlab_receiveWapPush">"получать через WAP"</string>
-    <string name="permdesc_receiveWapPush">"Разрешает приложениям получать и обрабатывать сообщения WAP. Вредоносное ПО может отслеживать ваши сообщения или удалять до того, как вы их увидите."</string>
-    <string name="permlab_getTasks">"получать работающие приложения"</string>
-    <string name="permdesc_getTasks">"Разрешает приложению получать информацию о работающих и недавно выполненных задачах. Может позволить вредоносному ПО получать конфиденциальную информацию о других приложениях."</string>
-    <string name="permlab_reorderTasks">"переупорядочивать работающие приложения"</string>
-    <string name="permdesc_reorderTasks">"Разрешает приложению изменять приоритет задач. Вредоносное ПО может выходить на передний план без вашего разрешения."</string>
-    <string name="permlab_setDebugApp">"включать отладку приложений"</string>
-    <string name="permdesc_setDebugApp">"Разрешает приложению включать отладку других приложений. Вредоносное ПО может таким образом закрывать другие приложения."</string>
-    <string name="permlab_changeConfiguration">"изменять настройки интерфейса"</string>
-    <string name="permdesc_changeConfiguration">"Позволяет приложению изменять текущую конфигурацию, например локаль и общий размер шрифта."</string>
+    <string name="permdesc_receiveMms">"Позволяет приложению получать и обрабатывать MMS-сообщения. Вредоносные приложения могут отслеживать ваши сообщения или удалять их, не показывая вам."</string>
+    <string name="permlab_sendSms">"отправлять SMS-сообщения"</string>
+    <string name="permdesc_sendSms">"Позволяет приложению отправлять SMS-сообщения. Вредоносные приложения могут отправлять сообщения без уведомления, что приведет к непредвиденным расходам."</string>
+    <string name="permlab_readSms">"считывать SMS или MMS"</string>
+    <string name="permdesc_readSms">"Позволяет приложению считывать SMS-сообщения, сохраненные на телефоне или SIM-карте. Вредоносные приложения могут считывать конфиденциальные сообщения."</string>
+    <string name="permlab_writeSms">"изменить SMS или MMS"</string>
+    <string name="permdesc_writeSms">"Позволяет приложению перезаписывать SMS-сообщения, сохраненные на телефоне или SIM-карте. Вредоносные приложения могут удалить сообщения."</string>
+    <string name="permlab_receiveWapPush">"получать WAP"</string>
+    <string name="permdesc_receiveWapPush">"Позволяет приложению получать и обрабатывать WAP-сообщения. Вредоносные приложения могут отслеживать ваши сообщения или удалять их, не показывая вам."</string>
+    <string name="permlab_getTasks">"извлечь запущенные приложения"</string>
+    <string name="permdesc_getTasks">"Позволяет приложению получать сведения о последних и текущих задачах. Вредоносные приложения могут получить доступ к конфиденциальной информации о других приложениях."</string>
+    <string name="permlab_reorderTasks">"изменять порядок запущенных приложений"</string>
+    <string name="permdesc_reorderTasks">"Позволяет приложению переключать режим выполнения задачи с активного на фоновый. Вредоносные приложения могут установить для себя активный режим без уведомления."</string>
+    <string name="permlab_setDebugApp">"запускать отладку приложения"</string>
+    <string name="permdesc_setDebugApp">"Позволяет приложению запускать процесс отладки другого приложения. Вредоносные приложения могут использовать эту возможность для остановки других приложений."</string>
+    <string name="permlab_changeConfiguration">"изменять настройки пользовательского интерфейса"</string>
+    <string name="permdesc_changeConfiguration">"Позволяет приложению изменять текущую конфигурацию, например региональные настройки или размер шрифта."</string>
     <string name="permlab_restartPackages">"перезапускать другие приложения"</string>
-    <string name="permdesc_restartPackages">"Разрешает приложению принудительно перезапускать другие приложения."</string>
+    <string name="permdesc_restartPackages">"Позволяет приложению принудительно перезапускать другие приложения."</string>
     <string name="permlab_forceBack">"принудительно закрывать приложения"</string>
-    <string name="permdesc_forceBack">"Позволяет приложению принудительно закрывать и переводить в фоновый режим действия, работающие на переднем плане. Не требуется обычным приложениям."</string>
-    <string name="permlab_dump">"получать внутреннее состояние системы"</string>
-    <string name="permdesc_dump">"Разрешает приложениям получать внутреннее состояние системы. Вредоносное ПО может получать множество личной и защищенной информации, которая обычно не была бы им доступна."</string>
-    <string name="permlab_runSetActivityWatcher">"наблюдать и управлять запуском всех приложений"</string>
-    <string name="permdesc_runSetActivityWatcher">"Разрешает приложению следить и управлять тем, как система запускает действия. Вредоносное ПО может полностью нарушить работу системы. Это разрешение нужно только для разработки, но не при обычном использовании телефона."</string>
-    <string name="permlab_broadcastPackageRemoved">"отправлять оповещения об удалении пакетов"</string>
-    <string name="permdesc_broadcastPackageRemoved">"Позволяет приложению распространять уведомление об удалении пакета приложения. Вредоносное ПО может использовать это для остановки любых других работающих приложений."</string>
-    <string name="permlab_broadcastSmsReceived">"отправлять оповещения о получении SMS"</string>
-    <string name="permdesc_broadcastSmsReceived">"Разрешает приложению распространять уведомление о том, что получено сообщение SMS. Вредоносное ПО может пользоваться этим для фальсификации входящих сообщений SMS."</string>
-    <string name="permlab_broadcastWapPush">"отправлять оповещения о получении WAP-PUSH"</string>
-    <string name="permdesc_broadcastWapPush">"Разрешает приложению распространять уведомление о получении сообщения WAP PUSH. Вредоносное ПО может использовать это для подделки отчета о получении MMS или просто заменять содержание любой веб-страницы вредоносными вариантами."</string>
-    <string name="permlab_setProcessLimit">"ограничивать количество выполняемых процессов"</string>
-    <string name="permdesc_setProcessLimit">"Позволяет приложению контролировать максимальное количество выполняемых процессов. Не требуется обычным приложениям."</string>
-    <string name="permlab_setAlwaysFinish">"закрывать все фоновые приложения"</string>
-    <string name="permdesc_setAlwaysFinish">"Разрешает приложению следить, чтобы действия всегда завершались после перехода в фоновый режим. Не требуется обычным приложениям."</string>
-    <string name="permlab_batteryStats">"изменять данные о батарее"</string>
-    <string name="permdesc_batteryStats">"Разрешает изменять данные о батарее. Не используется обычными приложениями."</string>
-    <string name="permlab_internalSystemWindow">"отображать неавторизованные окна"</string>
-    <string name="permdesc_internalSystemWindow">"Разрешает создавать окна, используемые внутренним системным интерфейсом пользователя. Не для использования обычными программами."</string>
-    <string name="permlab_systemAlertWindow">"отображать системные предупреждения"</string>
-    <string name="permdesc_systemAlertWindow">"Разрешает приложению показывать окна системных предупреждений. Вредоносное ПО может захватить весь экран телефона."</string>
-    <string name="permlab_setAnimationScale">"изменять общую скорость анимации"</string>
-    <string name="permdesc_setAnimationScale">"Позволяет приложению в любой момент изменять общую скорость анимации (ускорять и замедлять анимацию)."</string>
+    <string name="permdesc_forceBack">"Позволяет приложению принудительно закрыть или вернуть в исходное состояние процессы, выполняемые в активном режиме. Не требуется для обычных приложений."</string>
+    <string name="permlab_dump">"извлекать данные о внутреннем состоянии системы"</string>
+    <string name="permdesc_dump">"Позволяет приложению извлекать внутренние сведения о состоянии системы. Вредоносные приложения смогут извлечь разнообразные личные и защищенные сведения, в которых обычно нет необходимости."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"отслеживать и управлять запуском всех приложений"</string>
+    <string name="permdesc_runSetActivityWatcher">"Позволяет приложению отслеживать и управлять способом подключения системы. Вредоносные приложения могут разгласить конфиденциальную информацию о системе. Это разрешение необходимо только при разработке, но не при обычной работе с телефоном."</string>
+    <string name="permlab_broadcastPackageRemoved">"отправлять рассылку об удалении пакета"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Позволяет приложению выполнять рассылку уведомлений об удалении пакета приложения. Вредоносные приложения могут использовать эту возможность для остановки всех остальных выполняющихся приложений."</string>
+    <string name="permlab_broadcastSmsReceived">"отправлять рассылку уведомлений о получении SMS"</string>
+    <string name="permdesc_broadcastSmsReceived">"Позволяет приложению отправлять уведомления о получении SMS-сообщения. Вредоносные приложения могут использовать эту возможность для имитации получения SMS -сообщений."</string>
+    <string name="permlab_broadcastWapPush">"отправлять рассылку уведомлений о получении WAP-сообщений поставщика услуг"</string>
+    <string name="permdesc_broadcastWapPush">"Позволяет приложению отправлять уведомления о получении WAP-сообщения поставщика услуг. Вредоносные приложения могут использовать эту возможность для имитации получения MMS-сообщения или замены содержимого любой веб-страницы на вредоносное без уведомления."</string>
+    <string name="permlab_setProcessLimit">"ограничивать количество запущенных процессов"</string>
+    <string name="permdesc_setProcessLimit">"Позволяет приложению управлять максимальным количеством выполняемых процессов. Не требуется для обычных приложений."</string>
+    <string name="permlab_setAlwaysFinish">"закрывать все приложения, работающие в фоновом режиме"</string>
+    <string name="permdesc_setAlwaysFinish">"Позволяет приложению контролировать, были ли действия завершены сразу же после их перехода в фоновый режим. Не требуется для обычных приложений."</string>
+    <string name="permlab_batteryStats">"изменять статистику батареи"</string>
+    <string name="permdesc_batteryStats">"Позволяет изменять собранную статистику батареи. Не предназначено для использования обычными приложениями."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"показывать неавторизованные окна"</string>
+    <string name="permdesc_internalSystemWindow">"Разрешает создание окон, предназначенных для использования внутренним пользовательским интерфейсом системы. Не предназначено для использования обычными приложениями."</string>
+    <string name="permlab_systemAlertWindow">"показывать оповещения системного уровня"</string>
+    <string name="permdesc_systemAlertWindow">"Позволяет приложению отображать окна предупреждений системы. Вредоносные приложения смогут получить контроль над всем экраном телефона."</string>
+    <string name="permlab_setAnimationScale">"изменять глобальную скорость анимации"</string>
+    <string name="permdesc_setAnimationScale">"Позволяет приложению в любое время изменять общую скорость анимации (ускоренная или замедленная анимация)."</string>
     <string name="permlab_manageAppTokens">"управлять маркерами приложений"</string>
-    <string name="permdesc_manageAppTokens">"Разрешает приложениям создавать и управлять собственными маркерами вместо обычного порядка Z. Не требуется обычным приложениям."</string>
-    <string name="permlab_injectEvents">"нажимать на клавиши и кнопки управления"</string>
-    <string name="permdesc_injectEvents">"Позволяет приложению передавать другим приложениям собственные события ввода (нажатия клавиш и т.д.). Вредоносное ПО может воспользоваться этим для захвата телефона."</string>
-    <string name="permlab_readInputState">"записывать нажимаемые клавиши и действия"</string>
-    <string name="permdesc_readInputState">"Разрешает приложениям отслеживать нажимаемые клавиши даже при работе в другом приложении (например набор пароля). Никогда не используется обычными приложениями."</string>
-    <string name="permlab_bindInputMethod">"выполнять привязку к способу ввода"</string>
-    <string name="permdesc_bindInputMethod">"Разрешает владельцу привязку к интерфейсу верхнего уровня способа ввода. Не требуется обычным приложениям."</string>
-    <string name="permlab_setOrientation">"изменять положение экрана"</string>
-    <string name="permdesc_setOrientation">"Позволяет приложению в любой момент изменять положение экрана. Не требуется обычным приложениям."</string>
-    <string name="permlab_signalPersistentProcesses">"отправлять приложениям Linux-сигналы"</string>
-    <string name="permdesc_signalPersistentProcesses">"Разрешает приложению запрашивать отправку поступающего сигнала всем постоянным процессам."</string>
-    <string name="permlab_persistentActivity">"выполнять приложение постоянно"</string>
-    <string name="permdesc_persistentActivity">"Позволяет приложению переводить свои компоненты в постоянное состояние так, что система не сможет использовать их для других приложений."</string>
+    <string name="permdesc_manageAppTokens">"Позволяет приложениям создавать собственные маркеры и управлять ими, обходя обычное Z-упорядочивание. Не требуется для обычных приложений."</string>
+    <string name="permlab_injectEvents">"отрабатывать нажатия клавиш и кнопок управления"</string>
+    <string name="permdesc_injectEvents">"Позволяет приложению передавать собственные события ввода (например, нажатия клавиш) в другие приложения. Вредоносные приложения могут использовать эту возможность для установки полного контроля над телефоном."</string>
+    <string name="permlab_readInputState">"записывать вводимый текст и совершаемые действия"</string>
+    <string name="permdesc_readInputState">"Позволяет приложению распознавать нажатые пользователем клавиши даже при работе с другим приложением (например, при вводе пароля). Не требуется для обычных приложений."</string>
+    <string name="permlab_bindInputMethod">"связывать с методом ввода"</string>
+    <string name="permdesc_bindInputMethod">"Позволяет выполнять привязку к интерфейсу ввода верхнего уровня. Не требуется для обычных приложений."</string>
+    <string name="permlab_setOrientation">"изменять ориентацию экрана"</string>
+    <string name="permdesc_setOrientation">"Позволяет приложению изменять ориентацию экрана в любое время. Не требуется для обычных приложений."</string>
+    <string name="permlab_signalPersistentProcesses">"отправлять приложениям сигналы Linux"</string>
+    <string name="permdesc_signalPersistentProcesses">"Позволяет приложению направлять запрос на передачу предоставленного сигнала всем постоянным процессам."</string>
+    <string name="permlab_persistentActivity">"запускать постоянную работу приложения"</string>
+    <string name="permdesc_persistentActivity">"Позволяет приложению сделать свои компоненты постоянными, благодаря чему система не может использовать их для других приложений."</string>
     <string name="permlab_deletePackages">"удалять приложения"</string>
-    <string name="permdesc_deletePackages">"Разрешает приложению удалять пакеты Android. Вредоносное ПО может воспользоваться этим для удаления важных приложений."</string>
+    <string name="permdesc_deletePackages">"Позволяет приложению удалять пакеты Android. Вредоносные приложения могут использовать эту возможность для удаления важных приложений."</string>
     <string name="permlab_clearAppUserData">"удалять данные других приложений"</string>
-    <string name="permdesc_clearAppUserData">"Разрешает приложению удалять данные пользователя."</string>
-    <string name="permlab_deleteCacheFiles">"удалять кэш других приложений"</string>
+    <string name="permdesc_clearAppUserData">"Позволяет приложению удалять данные пользователя."</string>
+    <string name="permlab_deleteCacheFiles">"очищать кэши других приложений"</string>
     <string name="permdesc_deleteCacheFiles">"Позволяет приложению удалять файлы из кэша."</string>
-    <string name="permlab_getPackageSize">"измерять место для хранения данных приложений"</string>
-    <string name="permdesc_getPackageSize">"Разрешает приложению получать размеры своего кода, данных и кэша"</string>
-    <string name="permlab_installPackages">"напрямую устанавливать приложения"</string>
-    <string name="permdesc_installPackages">"Разрешает приложению устанавливать новые или обновленные пакеты Android. Вредоносное ПО может использовать это для добавления новых приложений с абсолютными полномочиями."</string>
+    <string name="permlab_getPackageSize">"определять объем памяти приложений"</string>
+    <string name="permdesc_getPackageSize">"Позволяет приложению получать сведения о размере кода, данных и кэша."</string>
+    <string name="permlab_installPackages">"устанавливать приложения непосредственно"</string>
+    <string name="permdesc_installPackages">"Позволяет приложению устанавливать новые или обновленные пакеты Android. Вредоносные приложения могут использовать эту возможность для добавления новых приложений со сколь угодно высоким уровнем разрешения."</string>
     <string name="permlab_clearAppCache">"удалять все данные из кэша приложений"</string>
-    <string name="permdesc_clearAppCache">"Разрешает приложению освобождать место на телефоне, удаляя файлы из каталога кэша приложения. Обычно доступ разрешен только системным процессам."</string>
-    <string name="permlab_readLogs">"читать файлы системного журнала"</string>
-    <string name="permdesc_readLogs">"Разрешает приложению считывать различные файлы журналов системы. Это позволяет получать сведения о том, что вы делаете с телефоном, но в этих файлах не должно быть личной или конфиденциальной информации."</string>
-    <string name="permlab_diagnostic">"считывать и записывать ресурсы, принадлежащих diag"</string>
-    <string name="permdesc_diagnostic">"Разрешает приложению считывать и записывать в любой ресурс, принадлежащий группе diag, например файлы в /dev. Это может влиять на стабильность и безопасность системы. Следует использовать ТОЛЬКО при диагностике оборудования производителем или оператором."</string>
-    <string name="permlab_changeComponentState">"включать и выключать компоненты приложений"</string>
-    <string name="permdesc_changeComponentState">"Разрешает приложению включать или отключать компоненты другого приложения. Вредоносное ПО сможет отключать важные функции телефона. Эту возможность следует использовать с осторожностью, так как можно привести компоненты приложений в нерабочее, несовместимое или нестабильное состояние."</string>
-    <string name="permlab_setPreferredApplications">"задавать предпочитаемые приложения"</string>
-    <string name="permdesc_setPreferredApplications">"Позволяет приложению изменять предпочитаемые приложения. Это может позволить вредоносному ПО незаметно изменить работающие приложения поддельными  и собрать ваши личные данные."</string>
-    <string name="permlab_writeSettings">"изменять глобальные настройки системы"</string>
-    <string name="permdesc_writeSettings">"Разрешает приложению изменять данные настройки системы. Вредоносное ПО может повредить конфигурацию вашей системы."</string>
-    <string name="permlab_writeSecureSettings">"изменять защищенные настройки системы"</string>
-    <string name="permdesc_writeSecureSettings">"Разрешает приложению изменять данные в защищенных настройках системы. Не используется обычными приложениями."</string>
-    <string name="permlab_writeGservices">"изменять карту служб Google"</string>
-    <string name="permdesc_writeGservices">"Разрешает приложению изменять карту служб Google. Не используется обычными приложениями."</string>
-    <string name="permlab_receiveBootCompleted">"автоматически запускаться при загрузке"</string>
-    <string name="permdesc_receiveBootCompleted">"Разрешает приложению запускаться сразу после загрузки системы. Это может увеличить время запуска телефона, а постоянная работа приложения может снизить общую скорость работы."</string>
-    <string name="permlab_broadcastSticky">"отправлять постоянное оповещение"</string>
-    <string name="permdesc_broadcastSticky">"Разрешает приложению отправлять постоянные оповещения, остающиеся после окончания рассылки. Вредоносное ПО может замедлить работу телефона или привести к нестабильности, используя слишком много памяти."</string>
-    <string name="permlab_readContacts">"считывать данные контактов"</string>
-    <string name="permdesc_readContacts">"Разрешает приложению считывать полную контактную информацию (адрес), сохраненную в вашем телефоне. Может использоваться вредоносным ПО для отправки этих данных другим людям."</string>
-    <string name="permlab_writeContacts">"записывать данные контактов"</string>
-    <string name="permdesc_writeContacts">"Разрешает приложению изменять контактную информацию (адрес), сохраненную в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных контактов."</string>
-    <string name="permlab_writeOwnerData">"записывать данные о владельце"</string>
-    <string name="permdesc_writeOwnerData">"Разрешает приложению изменять данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для удаления или изменения данных о владельце."</string>
+    <string name="permdesc_clearAppCache">"Позволяет приложению освобождать память телефона с помощью удаления файлов из каталога кэша приложений. Обычно это разрешается только системным процессам."</string>
+    <string name="permlab_readLogs">"считывать системные файлы журналов"</string>
+    <string name="permdesc_readLogs">"Позволяет приложению считывать информацию из различных журналов системы. Приложение может получить сведения о работе пользователя с телефоном, но они не должны содержать какой-либо личной или конфиденциальной информации."</string>
+    <string name="permlab_diagnostic">"считывать/записывать данные в ресурсы, принадлежащие группе диагностики"</string>
+    <string name="permdesc_diagnostic">"Позволяет приложению считывать и записывать данные в любые ресурсы, принадлежащие группе диагностики (например, файлы в каталоге /dev). Это может повлиять на стабильность и безопасность системы. Эта возможность может быть использована ТОЛЬКО производителем или оператором для диагностики аппаратного обеспечения."</string>
+    <string name="permlab_changeComponentState">"включать или отключать компоненты приложения"</string>
+    <string name="permdesc_changeComponentState">"Позволяет приложению отключать или включать компоненты другого приложения. Вредоносные приложения могут использовать это разрешение для отключения важных возможностей телефона. Это разрешение следует использовать с осторожностью, так как это может привести к несовместимости, нестабильности и неработоспособности компонентов приложения."</string>
+    <string name="permlab_setPreferredApplications">"выбирать предпочтительные приложения"</string>
+    <string name="permdesc_setPreferredApplications">"Позволяет приложению изменять предпочтительные приложения. Вредоносные приложения могут использовать эту возможность для незаметного изменения запущенных приложений и для сбора конфиденциальной информации с помощью имитации подключения существующих приложений."</string>
+    <string name="permlab_writeSettings">"изменить общие настройки системы"</string>
+    <string name="permdesc_writeSettings">"Позволяет приложению изменять данные настроек системы. Вредоносные приложения могут повредить конфигурацию системы."</string>
+    <string name="permlab_writeSecureSettings">"изменять настройки системы безопасности"</string>
+    <string name="permdesc_writeSecureSettings">"Позволяет приложению изменять данные настроек безопасности системы. Не предназначено для использования обычными приложениями."</string>
+    <string name="permlab_writeGservices">"изменить карту служб Google"</string>
+    <string name="permdesc_writeGservices">"Позволяет приложению изменять карту служб Google. Не предназначено для использования обычными приложениями."</string>
+    <string name="permlab_receiveBootCompleted">"автоматически запускать при загрузке"</string>
+    <string name="permdesc_receiveBootCompleted">"Позволяет приложению запускаться сразу же по завершении загрузки. Это может увеличить время запуска телефона и замедлить его работу в связи с постоянной работой приложения."</string>
+    <string name="permlab_broadcastSticky">"отправить несрочную рассылку"</string>
+    <string name="permdesc_broadcastSticky">"Позволяет приложению отправлять несрочные рассылки, которые остались по завершении данной рассылки. Вредоносные приложения могут замедлить работу телефона или сделать ее нестабильной с помощью использования слишком большого объема памяти."</string>
+    <string name="permlab_readContacts">"считывать данные контакта"</string>
+    <string name="permdesc_readContacts">"Позволяет приложению считывать все данные контактов (адресов), сохраненные в памяти телефона. Вредоносные приложения могут использовать эту возможность для передачи данных посторонним лицам."</string>
+    <string name="permlab_writeContacts">"перезаписывать данные контакта"</string>
+    <string name="permdesc_writeContacts">"Позволяет приложению изменять данные (адрес) контакта, сохраненные в памяти телефона. Вредоносные приложения могут использовать эту возможность для удаления или изменения данных контакта."</string>
+    <string name="permlab_writeOwnerData">"перезаписывать данные о владельце"</string>
+    <string name="permdesc_writeOwnerData">"Позволяет приложению изменять сведения о владельце, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для удаления или изменения данных владельца."</string>
     <string name="permlab_readOwnerData">"считывать данные о владельце"</string>
-    <string name="permdesc_readOwnerData">"Разрешает приложению считывать данные о владельце, сохраненные в телефоне. Вредоносное ПО может использовать это для чтения данных о владельце."</string>
+    <string name="permdesc_readOwnerData">"Позволяет приложению считывать сведения о владельце, сохраненные в памяти телефона. Вредоносные приложения могут использовать эту возможность для считывания данных владельца."</string>
     <string name="permlab_readCalendar">"считывать данные календаря"</string>
-    <string name="permdesc_readCalendar">"Разрешает приложению считывать все события календаря, сохраненные в телефоне. Вредоносное ПО может использовать это для отправки событий вашего календаря другим людям."</string>
+    <string name="permdesc_readCalendar">"Позволяет приложению считывать все события календаря, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для передачи ваших событий календаря посторонним лицам."</string>
     <string name="permlab_writeCalendar">"записывать данные календаря"</string>
-    <string name="permdesc_writeCalendar">"Позволяет приложению изменять сохраненные в телефоне события календаря. Вредоносное ПО сможет стирать или изменять данные календаря."</string>
-    <string name="permlab_accessMockLocation">"имитировать источники данных о положении для тестирования"</string>
-    <string name="permdesc_accessMockLocation">"Создание имитаций источников данных о местоположении для тестирования. Вредоносное ПО может использовать это для изменения данных о местоположении и/или состоянии, сообщаемых настоящими источниками таких данных, например GPS или оператором связи."</string>
-    <string name="permlab_accessLocationExtraCommands">"получать доступ к дополнительным командам местоположения от поставщика связи"</string>
-    <string name="permdesc_accessLocationExtraCommands">"Доступ к дополнительным командам местоположения от поставщика связи. Это дает вредоносному ПО возможность мешать работе GPS или других источников данных о местоположении."</string>
-    <string name="permlab_accessFineLocation">"определять точное местоположение (GPS)"</string>
-    <string name="permdesc_accessFineLocation">"Доступ к имеющимся источникам точных данных о местоположении телефона, например к GPS. Вредоносное ПО сможет узнать, где вы находитесь, а также истратить заряд батареи."</string>
-    <string name="permlab_accessCoarseLocation">"определять приблизительное местоположение (на основе данных сети)"</string>
-    <string name="permdesc_accessCoarseLocation">"Доступ (при наличии) к источникам сведений о приблизительном расположении, например базам данных сотовой сети. Вредоносное ПО может использовать эту функцию для того, чтобы определять ваше местоположение."</string>
-    <string name="permlab_accessSurfaceFlinger">"открывать SurfaceFlinger"</string>
-    <string name="permdesc_accessSurfaceFlinger">"Разрешает приложению использовать функции SurfaceFlinger низкого уровня."</string>
-    <string name="permlab_readFrameBuffer">"считывать данные из буфера фреймов"</string>
-    <string name="permdesc_readFrameBuffer">"Разрешает приложению считывать содержание буфера фрейма."</string>
-    <string name="permlab_modifyAudioSettings">"изменять настройки звука"</string>
-    <string name="permdesc_modifyAudioSettings">"Разрешает приложениям изменять глобальные настройки звука, например громкость и маршрут сигнала."</string>
-    <string name="permlab_recordAudio">"записывать звук"</string>
-    <string name="permdesc_recordAudio">"Разрешает приложению получать доступ к пути записи звука."</string>
+    <string name="permdesc_writeCalendar">"Позволяет приложению изменять события календаря, сохраненные на телефоне. Вредоносные приложения могут использовать эту возможность для удаления или изменения событий календаря."</string>
+    <string name="permlab_accessMockLocation">"копировать источники мест для проверки"</string>
+    <string name="permdesc_accessMockLocation">"Создавать копии источников данных о местоположении для проверки. Вредоносные приложения могут использовать эту возможность для перезаписи места и/или состояния, возвращаемого действительными источниками данных о местоположении, такими как GPS или операторы связи."</string>
+    <string name="permlab_accessLocationExtraCommands">"получать доступ к дополнительным командам источника данных о местоположении"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Получать доступ к дополнительным командам поставщика данных о местоположении. Вредоносные приложения могут использовать эту возможность для вмешательства в работу GPS или других источников места."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"точное местоположение (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Получать доступ к источникам точного местоположения, таким как GPS, если возможно. Вредоносные приложения могут использовать это разрешение для определения вашего местоположения и расходовать ресурс батареи."</string>
+    <string name="permlab_accessCoarseLocation">"отслеживать местоположение по сигналам сети"</string>
+    <string name="permdesc_accessCoarseLocation">"Получать доступ к источникам данных о местоположении, таким как база данных сотовой сети, для определения приблизительного местоположения телефона, если возможно. Вредоносные приложения могут использовать эту возможность для определения вашего приблизительного местоположения."</string>
+    <string name="permlab_accessSurfaceFlinger">"получать доступ к SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Позволяет приложению использовать функции SurfaceFlinger нижнего уровня."</string>
+    <string name="permlab_readFrameBuffer">"считывать буфер фреймов"</string>
+    <string name="permdesc_readFrameBuffer">"Позволяет приложению использовать функцию чтения содержимого буфера фреймов."</string>
+    <string name="permlab_modifyAudioSettings">"изменять настройки аудио"</string>
+    <string name="permdesc_modifyAudioSettings">"Позволяет приложению изменять глобальные аудионастройки, такие как громкость и маршрутизацию."</string>
+    <string name="permlab_recordAudio">"записывать аудио"</string>
+    <string name="permdesc_recordAudio">"Позволяет приложению получать доступ к пути аудиозаписи."</string>
     <string name="permlab_camera">"снимать фотографии"</string>
-    <string name="permdesc_camera">"Разрешает приложению делать снимки с помощью камеры. Это позволяет приложению в любой момент записывать то, что видно через камеру."</string>
-    <string name="permlab_brick">"отключать телефон навсегда"</string>
-    <string name="permdesc_brick">"Разрешает приложению навсегда отключить телефон. Это очень опасно."</string>
+    <string name="permdesc_camera">"Позволяет приложению делать снимки с помощью камеры. Это разрешение позволяет приложению в любое время собирать изображения, видимые через объектив камеры."</string>
+    <string name="permlab_brick">"отключать телефон"</string>
+    <string name="permdesc_brick">"Позволяет данному приложению отключить телефон навсегда. Это очень опасно."</string>
     <string name="permlab_reboot">"принудительно перезагружать телефон"</string>
-    <string name="permdesc_reboot">"Разрешает приложению принудительно перезагружать телефон."</string>
-    <string name="permlab_mount_unmount_filesystems">"подключаться и отключаться от файловых систем"</string>
-    <string name="permdesc_mount_unmount_filesystems">"Разрешает приложению подключаться и отключаться от файловых систем съемных устройств хранения."</string>
+    <string name="permdesc_reboot">"Позволяет приложению принудительно перезагружать телефон."</string>
+    <string name="permlab_mount_unmount_filesystems">"монтировать и удалять файловые системы"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Позволяет приложению монтировать и удалять файловые системы съемных носителей."</string>
     <string name="permlab_mount_format_filesystems">"форматировать внешний накопитель"</string>
     <string name="permdesc_mount_format_filesystems">"Позволяет приложению форматировать съемный накопитель."</string>
-    <string name="permlab_vibrate">"управлять вибрацией"</string>
-    <string name="permdesc_vibrate">"Разрешает приложению управлять вибровызовом."</string>
-    <string name="permlab_flashlight">"управлять фонарем"</string>
-    <string name="permdesc_flashlight">"Разрешает приложению управлять фонарем."</string>
-    <string name="permlab_hardware_test">"проверять оборудование"</string>
-    <string name="permdesc_hardware_test">"Разрешает приложению управлять внешними устройствами для тестирования оборудования."</string>
-    <string name="permlab_callPhone">"напрямую вызывать телефонные номера"</string>
-    <string name="permdesc_callPhone">"Разрешает приложениям вызывать телефонные номера без вашего участия. Вредоносное ПО может выполнять вызовы, за которые придется платить. Заметьте, что это не разрешает приложению вызывать номера экстренных служб."</string>
-    <string name="permlab_callPrivileged">"напрямую вызывать любые телефонные номера"</string>
-    <string name="permdesc_callPrivileged">"Разрешает приложению вызывать любой номер, включая экстренные, без вашего участия. Вредоносное ПО может совершать ненужные и незаконные вызовы в службы неотложной помощи."</string>
+    <string name="permlab_vibrate">"управлять вибровызовом"</string>
+    <string name="permdesc_vibrate">"Позволяет приложению управлять виброзвонком."</string>
+    <string name="permlab_flashlight">"управлять вспышкой"</string>
+    <string name="permdesc_flashlight">"Позволяет приложению управлять вспышкой."</string>
+    <string name="permlab_hardware_test">"проверять аппаратное обеспечение"</string>
+    <string name="permdesc_hardware_test">"Позволяет приложению управлять различными периферийными устройствами для проверки аппаратного обеспечения."</string>
+    <string name="permlab_callPhone">"посылать прямые вызовы на номера телефонов"</string>
+    <string name="permdesc_callPhone">"Позволяет приложению вызывать телефонные номера без вмешательства пользователя. Вредоносные приложения могут осуществлять нежелательные вызовы. Это разрешение не позволяет приложению совершать вызовы служб экстренной помощи."</string>
+    <string name="permlab_callPrivileged">"посылать прямые вызовы на любые номера"</string>
+    <string name="permdesc_callPrivileged">"Позволяет приложению осуществлять вызов любого номера, включая номера экстренной помощи, без вмешательства пользователя. Вредоносные приложения могут осуществить нежелательные или незаконные вызовы служб экстренной помощи."</string>
     <string name="permlab_locationUpdates">"управлять уведомлениями об обновлении местоположения"</string>
-    <string name="permdesc_locationUpdates">"Разрешает включение/отключение уведомлений о местоположении по радиосвязи. Не используется обычными приложениями."</string>
-    <string name="permlab_checkinProperties">"открывать свойства проверки"</string>
-    <string name="permdesc_checkinProperties">"Разрешает доступ на чтение и запись к свойствам, загруженным службой проверки. Не используется обычными приложениями."</string>
+    <string name="permdesc_locationUpdates">"Позволяет включать/отключать отправку уведомлений об обновлениях местоположения по радиосвязи. Не предназначено для использования обычными приложениями."</string>
+    <string name="permlab_checkinProperties">"получать доступ к свойствам регистрации"</string>
+    <string name="permdesc_checkinProperties">"Позволяет получать доступ для чтения/записи свойств, загруженных службой регистрации. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_bindGadget">"выбирать виджеты"</string>
     <string name="permdesc_bindGadget">"Позволяет приложению сообщить системе, какие приложения могут использовать какие виджеты. Это разрешение позволяет приложениям предоставлять другим приложениям доступ к личной информации. Не предназначено для использования обычными приложениями."</string>
     <string name="permlab_modifyPhoneState">"изменять состояние телефона"</string>
-    <string name="permdesc_modifyPhoneState">"Позволяет приложению управлять телефонными функциями устройства. Приложение с такими полномочиями может переключать сети, включать и выключать радиосвязь и т.д., не сообщая вам об этом."</string>
+    <string name="permdesc_modifyPhoneState">"Позволяет приложению управлять функциями телефона в устройстве. Приложение, обладающее этим разрешением, может переключать сети, включать и выключать радио на телефоне и выполнять другие подобные действия без соответствующего уведомления."</string>
     <string name="permlab_readPhoneState">"считывать состояние телефона"</string>
-    <string name="permdesc_readPhoneState">"Разрешает приложению использовать телефонные функции устройства. Приложение с такими полномочиями может определить номер данного телефона, наличие вызова, номер, с которым связан вызов и так далее."</string>
-    <string name="permlab_wakeLock">"предотвращать переход телефона в режим ожидания"</string>
-    <string name="permdesc_wakeLock">"Разрешает приложению блокировать переход телефона в режим ожидания."</string>
-    <string name="permlab_devicePower">"включать и отключать телефон"</string>
-    <string name="permdesc_devicePower">"Позволяет приложениям включать и выключать телефон."</string>
-    <string name="permlab_factoryTest">"работа в режиме заводского тестирования"</string>
-    <string name="permdesc_factoryTest">"Работа в качестве теста производителя низкого уровня, что дает полный доступ к оборудованию телефона. Доступно только при работе телефона в режиме теста производителя."</string>
+    <string name="permdesc_readPhoneState">"Позволяет приложению получить доступ к функциям телефона на устройстве. Приложение с таким разрешением может определить номер телефона устройства, наличие активного вызова, номер вызываемого/вызывающего абонента и тому подобное."</string>
+    <string name="permlab_wakeLock">"предотвратить переключение телефона в спящий режим"</string>
+    <string name="permdesc_wakeLock">"Позволяет приложению запретить переход телефона в спящий режим"</string>
+    <string name="permlab_devicePower">"включать и выключать питание телефона"</string>
+    <string name="permdesc_devicePower">"Позволяет приложению включать и отключать телефон."</string>
+    <string name="permlab_factoryTest">"запустить в тестовом режиме"</string>
+    <string name="permdesc_factoryTest">"Выполнить стандартную проверку нижнего уровня, обеспечивающую полный доступ к аппаратному обеспечению телефона. Доступно, только в режиме стандартной проверки."</string>
     <string name="permlab_setWallpaper">"устанавливать фоновый рисунок"</string>
-    <string name="permdesc_setWallpaper">"Разрешает приложению устанавливать системный фоновый рисунок."</string>
-    <string name="permlab_setWallpaperHints">"устанавливать подсказки по размеру фонового рисунка"</string>
-    <string name="permdesc_setWallpaperHints">"Разрешает приложению устанавливать системные подсказки по размеру фонового рисунка."</string>
-    <string name="permlab_masterClear">"выполнять сброс системы и восстановление заводских настроек"</string>
-    <string name="permdesc_masterClear">"Разрешает приложению полностью сбрасывать настройки системы до заводских, удаляя все данные, конфигурацию и установленные приложения."</string>
-    <string name="permlab_setTimeZone">"устанавливать часовой пояс"</string>
-    <string name="permdesc_setTimeZone">"Разрешает приложению изменять часовой пояс телефона."</string>
+    <string name="permdesc_setWallpaper">"Позволяет данному приложению устанавливать системный фоновый рисунок."</string>
+    <string name="permlab_setWallpaperHints">"давать рекомендации по размеру фоновых рисунков"</string>
+    <string name="permdesc_setWallpaperHints">"Позволяет данному приложению устанавливать советы по размеру фоновых рисунков."</string>
+    <string name="permlab_masterClear">"восстанавливать параметры системы по умолчанию, установленные на заводе-изготовителе"</string>
+    <string name="permdesc_masterClear">"Позволяет приложению восстановить стандартные настройки системы, удалив все данные, конфигурацию и установленные приложения."</string>
+    <string name="permlab_setTimeZone">"настраивать часовой пояс"</string>
+    <string name="permdesc_setTimeZone">"Позволяет приложению изменять часовой пояс телефона."</string>
     <string name="permlab_getAccounts">"обнаруживать известные аккаунты"</string>
-    <string name="permdesc_getAccounts">"Разрешает приложению получать список аккаунтов, известных телефону."</string>
+    <string name="permdesc_getAccounts">"Позволяет приложению получать список аккаунтов, известных телефону."</string>
     <string name="permlab_accessNetworkState">"просматривать состояние сети"</string>
-    <string name="permdesc_accessNetworkState">"Позволяет приложению видеть состояние всех сетей."</string>
-    <string name="permlab_createNetworkSockets">"обладать полным доступом в Интернет"</string>
+    <string name="permdesc_accessNetworkState">"Позволяет приложению просматривать состояние всех сетей."</string>
+    <string name="permlab_createNetworkSockets">"неограниченный доступ в Интернет"</string>
     <string name="permdesc_createNetworkSockets">"Позволяет приложению создавать сетевые сокеты."</string>
-    <string name="permlab_writeApnSettings">"записывать настройки названий точек доступа"</string>
-    <string name="permdesc_writeApnSettings">"Разрешает приложению изменять настройки APN, например прокси и порт любого APN."</string>
-    <string name="permlab_changeNetworkState">"изменять подключение к сети"</string>
-    <string name="permdesc_changeNetworkState">"Позволяет приложению изменять подключение к сети."</string>
-    <string name="permlab_changeBackgroundDataSetting">"изменить настройку использования фоновых данных"</string>
-    <string name="permdesc_changeBackgroundDataSetting">"Позволяет приложению изменять настройку использования фоновых данных."</string>
+    <string name="permlab_writeApnSettings">"записывать настройки имени точки доступа"</string>
+    <string name="permdesc_writeApnSettings">"Позволяет приложению изменять настройки APN, такие как прокси-сервер и порт любого APN."</string>
+    <string name="permlab_changeNetworkState">"изменять настройки подключения к сети"</string>
+    <string name="permdesc_changeNetworkState">"Позволяет приложению изменять состояние подключаемости сети."</string>
+    <string name="permlab_changeBackgroundDataSetting">"изменить настройку использования данных в фоновом режиме"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Позволяет приложению изменять настройку использования данных в фоновом режиме."</string>
     <string name="permlab_accessWifiState">"просматривать состояние Wi-Fi"</string>
-    <string name="permdesc_accessWifiState">"Разрешает приложению просматривать сведения о состоянии Wi-Fi."</string>
+    <string name="permdesc_accessWifiState">"Позволяет приложению просматривать сведения о состоянии Wi-Fi."</string>
     <string name="permlab_changeWifiState">"изменять состояние Wi-Fi"</string>
-    <string name="permdesc_changeWifiState">"Разрешает приложению подключаться и отключаться от точек доступа Wi-Fi и вносить изменения в настроенные сети Wi-Fi."</string>
-    <string name="permlab_bluetoothAdmin">"управлять Bluetooth"</string>
-    <string name="permdesc_bluetoothAdmin">"Разрешает приложению настраивать локальный телефон с Bluetooth, а также обнаруживать удаленные устройства и соединяться с ними."</string>
-    <string name="permlab_bluetooth">"создавать Bluetooth-подключения"</string>
-    <string name="permdesc_bluetooth">"Позволяет приложению просматривать конфигурацию локального телефона Bluetooth, создавать и разрешать подключение к связанным устройствам."</string>
+    <string name="permdesc_changeWifiState">"Позволяет приложению подключаться к точкам доступа Wi-Fi и отключаться от них, а также вносить изменения в конфигурацию сетей Wi-Fi."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"управление Bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Позволяет приложению настраивать локальный телефон Bluetooth, обнаруживать и выполнять сопряжение удаленных устройств."</string>
+    <string name="permlab_bluetooth">"создавать подключения Bluetooth"</string>
+    <string name="permdesc_bluetooth">"Позволяет приложению просматривать конфигурацию локального телефона Bluetooth, создавать подключения с сопряженными устройствами."</string>
     <string name="permlab_disableKeyguard">"отключать блокировку клавиатуры"</string>
-    <string name="permdesc_disableKeyguard">"Разрешает приложению отключать блокировку клавиш и связанную с ней защиту паролем. Пример нормального использования – отключение блокировки телефоном, когда он принимает вызов, и ее включение после окончания вызова."</string>
+    <string name="permdesc_disableKeyguard">"Позволяет приложению отключить блокировку клавиатуры и другие функции защиты паролем. Примером допустимого использования этой функции является отключение блокировки клавиатуры при получении входящего вызова и включение блокировки после завершения разговора."</string>
     <string name="permlab_readSyncSettings">"считывать настройки синхронизации"</string>
-    <string name="permdesc_readSyncSettings">"Разрешает приложению считывать настройки синхронизации, например наличие синхронизации контактов."</string>
+    <string name="permdesc_readSyncSettings">"Позволяет приложению считывать настройки синхронизации, такие как включение синхронизации Контактов."</string>
     <string name="permlab_writeSyncSettings">"записывать настройки синхронизации"</string>
-    <string name="permdesc_writeSyncSettings">"Разрешает приложению изменять настройки синхронизации, например синхронизацию контактов."</string>
-    <string name="permlab_readSyncStats">"считывать данные о синхронизации"</string>
-    <string name="permdesc_readSyncStats">"Разрешает приложению считывать данные о синхронизации, например историю выполненных синхронизаций."</string>
-    <string name="permlab_subscribedFeedsRead">"считывать фиды с подпиской"</string>
-    <string name="permdesc_subscribedFeedsRead">"Позволяет приложению получать сведения о синхронизированных фидах."</string>
-    <string name="permlab_subscribedFeedsWrite">"записывать фиды с подпиской"</string>
-    <string name="permdesc_subscribedFeedsWrite">"Разрешает приложению изменять ваши синхронизированные фиды. Это может позволить вредоносному ПО изменять ваши синхронизированные фиды."</string>
+    <string name="permdesc_writeSyncSettings">"Позволяет приложению изменять настройки синхронизации, например включение синхронизации Контактов."</string>
+    <string name="permlab_readSyncStats">"считывать статистику синхронизации"</string>
+    <string name="permdesc_readSyncStats">"Позволяет приложению считывать статистику синхронизации, например историю произведенных синхронизаций."</string>
+    <string name="permlab_subscribedFeedsRead">"считывать каналы, на которые есть подписка"</string>
+    <string name="permdesc_subscribedFeedsRead">"Позволяет приложению получить сведения о последних синхронизированных каналах."</string>
+    <string name="permlab_subscribedFeedsWrite">"изменять каналы, на которые есть подписка"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Позволяет приложению изменять синхронизированные каналы. Вредоносные приложения могут использовать эту возможность для изменения синхронизированных каналов."</string>
     <string name="permlab_readDictionary">"выполнять чтение из пользовательского словаря"</string>
     <string name="permdesc_readDictionary">"Позволяет приложению считывать любые слова, имена и фразы личного пользования, которые могут храниться в пользовательском словаре."</string>
     <string name="permlab_writeDictionary">"записывать в пользовательский словарь"</string>
     <string name="permdesc_writeDictionary">"Позволяет приложению записывать новые слова в пользовательский словарь."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
     <item>"Домашний"</item>
     <item>"Мобильный"</item>
@@ -344,31 +420,32 @@
     <item>"Рабочий факс"</item>
     <item>"Домашний факс"</item>
     <item>"Пейджер"</item>
-    <item>"Другое"</item>
     <item>"Другой"</item>
+    <item>"Особый"</item>
   </string-array>
   <string-array name="emailAddressTypes">
     <item>"Домашний"</item>
     <item>"Рабочий"</item>
-    <item>"Другое"</item>
     <item>"Другой"</item>
+    <item>"Особый"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"Мобильный"</string>
   <string-array name="postalAddressTypes">
     <item>"Домашний"</item>
     <item>"Рабочий"</item>
-    <item>"Другое"</item>
     <item>"Другой"</item>
+    <item>"Особый"</item>
   </string-array>
   <string-array name="imAddressTypes">
     <item>"Домашний"</item>
     <item>"Рабочий"</item>
     <item>"Другое"</item>
-    <item>"Другой"</item>
+    <item>"Особый"</item>
   </string-array>
   <string-array name="organizationTypes">
     <item>"Рабочий"</item>
-    <item>"Другое"</item>
     <item>"Другой"</item>
+    <item>"Особый"</item>
   </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
@@ -382,72 +459,85 @@
   </string-array>
     <string name="keyguard_password_enter_pin_code">"Введите PIN-код"</string>
     <string name="keyguard_password_wrong_pin_code">"Неверный PIN-код!"</string>
-    <string name="keyguard_label_text">"Для разблокировки нажмите Menu и 0."</string>
+    <string name="keyguard_label_text">"Для разблокировки нажмите \"Меню\", а затем 0."</string>
     <string name="emergency_call_dialog_number_for_display">"Номер экстренной службы"</string>
-    <string name="lockscreen_carrier_default">"(Вне зоны обслуживания)"</string>
+    <string name="lockscreen_carrier_default">"(Сеть не найдена)"</string>
     <string name="lockscreen_screen_locked">"Экран заблокирован."</string>
-    <string name="lockscreen_instructions_when_pattern_enabled">"Нажмите Menu для разблокировки или выполните экстренный вызов."</string>
-    <string name="lockscreen_instructions_when_pattern_disabled">"Чтобы снять блокировку, нажмите Menu."</string>
-    <string name="lockscreen_pattern_instructions">"Для разблокировки воспроизведите комбинацию"</string>
-    <string name="lockscreen_emergency_call">"Экстренный вызов"</string>
-    <string name="lockscreen_pattern_correct">"Верно!"</string>
-    <string name="lockscreen_pattern_wrong">"Неверно, попробуйте еще раз"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Нажмите \"Меню\", чтобы разблокировать экран или вызвать службу экстренной помощи."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Для разблокировки нажмите \"Меню\"."</string>
+    <string name="lockscreen_pattern_instructions">"Для разблокировки введите графический ключ"</string>
+    <string name="lockscreen_emergency_call">"Вызов службы экстренной помощи"</string>
+    <string name="lockscreen_pattern_correct">"Правильно!"</string>
+    <string name="lockscreen_pattern_wrong">"Повторите попытку"</string>
     <string name="lockscreen_plugged_in">"Идет зарядка (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"Подключите зарядное устройство."</string>
     <string name="lockscreen_missing_sim_message_short">"Нет SIM-карты."</string>
-    <string name="lockscreen_missing_sim_message">"В телефоне нет SIM-карты."</string>
+    <string name="lockscreen_missing_sim_message">"SIM-карта не установлена."</string>
     <string name="lockscreen_missing_sim_instructions">"Вставьте SIM-карту."</string>
-    <string name="lockscreen_network_locked_message">"Заблокирована сетью"</string>
-    <string name="lockscreen_sim_puk_locked_message">"SIM-карта заблокирована PUK-кодом."</string>
+    <string name="lockscreen_network_locked_message">"Сеть заблокирована"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM-карта заблокирована с помощью кода PUK."</string>
     <string name="lockscreen_sim_puk_locked_instructions">"См. руководство пользователя или свяжитесь со службой поддержки."</string>
     <string name="lockscreen_sim_locked_message">"SIM-карта заблокирована."</string>
-    <string name="lockscreen_sim_unlock_progress_dialog_message">"Разблокировка SIM-карты..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Вы неправильно воспроизвели комбинацию разблокировки <xliff:g id="NUMBER_0">%d</xliff:g> раз. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"Вы неверно воспроизвели комбинацию разблокировки <xliff:g id="NUMBER_0">%d</xliff:g> раз(а). После <xliff:g id="NUMBER_1">%d</xliff:g> неудачных попыток(ки) придется разблокировать телефон с помощью входа Google."\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
-    <string name="lockscreen_too_many_failed_attempts_countdown">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> сек."</string>
-    <string name="lockscreen_forgot_pattern_button_text">"Забыли комбинацию?"</string>
-    <string name="lockscreen_glogin_too_many_attempts">"Слишком много попыток ввести комбинацию!"</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Разблокировка SIM-карты…"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. "\n\n"Повторите попытку через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Количество неудачных попыток ввода графического ключа разблокировки: <xliff:g id="NUMBER_0">%d</xliff:g>. После <xliff:g id="NUMBER_1">%d</xliff:g> неудачных попыток вам будет предложено разблокировать телефон с помощью учетных данных Google.\n "\n\n" Повторите попытку через <xliff:g id="NUMBER_2">%d</xliff:g> с."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Повторите попытку через <xliff:g id="NUMBER">%d</xliff:g> с."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Забыли графический ключ?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Слишком много попыток ввода графического ключа!"</string>
     <string name="lockscreen_glogin_instructions">"Для разблокировки войдите с помощью своего аккаунта Google"</string>
-    <string name="lockscreen_glogin_username_hint">"Имя пользователя (адрес электронной почты)"</string>
+    <string name="lockscreen_glogin_username_hint">"Имя пользователя (электронная почта)"</string>
     <string name="lockscreen_glogin_password_hint">"Пароль"</string>
-    <string name="lockscreen_glogin_submit_button">"Войти"</string>
-    <string name="lockscreen_glogin_invalid_input">"Недействительное имя пользователя или пароль."</string>
+    <string name="lockscreen_glogin_submit_button">"Вход"</string>
+    <string name="lockscreen_glogin_invalid_input">"Неверное имя пользователя или пароль."</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"Очистить уведомления"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"Нет уведомлений"</string>
     <string name="status_bar_ongoing_events_title">"Текущие"</string>
     <string name="status_bar_latest_events_title">"Уведомления"</string>
     <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="battery_status_charging">"Идет зарядка..."</string>
     <string name="battery_low_title">"Подключите зарядное устройство"</string>
-    <string name="battery_low_subtitle">"Батарея садится:"</string>
-    <string name="battery_low_percent_format">"осталось менее <xliff:g id="NUMBER">%d%%</xliff:g>."</string>
-    <string name="factorytest_failed">"Ошибка заводского теста"</string>
-    <string name="factorytest_not_system">"Действие FACTORY_TEST поддерживается только для пакетов, установленных в папке /system/app."</string>
-    <string name="factorytest_no_action">"Пакет, предоставляющий действие FACTORY_TEST, не найден."</string>
-    <string name="factorytest_reboot">"Перезагрузить"</string>
+    <string name="battery_low_subtitle">"Батарея разряжена:"</string>
+    <string name="battery_low_percent_format">"осталось менее <xliff:g id="NUMBER">%d%%</xliff:g>"</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"Не удалось провести стандартный тест"</string>
+    <string name="factorytest_not_system">"Действие FACTORY_TEST поддерживается только для пакетов, установленных в /system/app."</string>
+    <string name="factorytest_no_action">"Пакет, обеспечивающий действие FACTORY_TEST, не найден."</string>
+    <string name="factorytest_reboot">"Перезагрузка"</string>
     <string name="js_dialog_title">"На странице по адресу \"<xliff:g id="TITLE">%s</xliff:g>\" сказано:"</string>
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"Перейти с этой страницы?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Нажмите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остаться на текущей странице."</string>
-    <string name="save_password_label">"Подтверждение"</string>
-    <string name="save_password_message">"Сохранить этот пароль в браузере?"</string>
+    <string name="save_password_label">"Подтвердите"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Вы хотите, чтобы браузер запомнил этот пароль?"</string>
     <string name="save_password_notnow">"Не сейчас"</string>
     <string name="save_password_remember">"Запомнить"</string>
     <string name="save_password_never">"Никогда"</string>
-    <string name="open_permission_deny">"У вас нет разрешения открывать эту страницу."</string>
+    <string name="open_permission_deny">"У вас нет разрешения на открытие этой страницы."</string>
     <string name="text_copied">"Текст скопирован в буфер обмена."</string>
-    <string name="more_item_label">"Еще"</string>
-    <string name="prepend_shortcut_label">"Мenu+"</string>
-    <string name="menu_space_shortcut_label">"место"</string>
+    <string name="more_item_label">"Дополнительно"</string>
+    <string name="prepend_shortcut_label">"Меню+"</string>
+    <string name="menu_space_shortcut_label">"пробел"</string>
     <string name="menu_enter_shortcut_label">"ввод"</string>
     <string name="menu_delete_shortcut_label">"удалить"</string>
     <string name="search_go">"Поиск"</string>
     <string name="oneMonthDurationPast">"1 месяц назад"</string>
-    <string name="beforeOneMonthDurationPast">"Больше 1 месяца назад"</string>
+    <string name="beforeOneMonthDurationPast">"Более месяца назад"</string>
   <plurals name="num_seconds_ago">
     <item quantity="one">"1 секунду назад"</item>
-    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> сек. назад"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> с. назад"</item>
   </plurals>
   <plurals name="num_minutes_ago">
     <item quantity="one">"1 минуту назад"</item>
@@ -463,7 +553,7 @@
   </plurals>
   <plurals name="in_num_seconds">
     <item quantity="one">"через 1 секунду"</item>
-    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> сек."</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> с."</item>
   </plurals>
   <plurals name="in_num_minutes">
     <item quantity="one">"через 1 минуту"</item>
@@ -471,7 +561,7 @@
   </plurals>
   <plurals name="in_num_hours">
     <item quantity="one">"через 1 час"</item>
-    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> час."</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> ч."</item>
   </plurals>
   <plurals name="in_num_days">
     <item quantity="one">"завтра"</item>
@@ -494,8 +584,8 @@
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> дн. назад"</item>
   </plurals>
   <plurals name="abbrev_in_num_seconds">
-    <item quantity="one">"через 1 сек."</item>
-    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> сек."</item>
+    <item quantity="one">"через 1 с."</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> с."</item>
   </plurals>
   <plurals name="abbrev_in_num_minutes">
     <item quantity="one">"через 1 мин."</item>
@@ -503,50 +593,46 @@
   </plurals>
   <plurals name="abbrev_in_num_hours">
     <item quantity="one">"через 1 час"</item>
-    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> час."</item>
+    <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> ч."</item>
   </plurals>
   <plurals name="abbrev_in_num_days">
     <item quantity="one">"завтра"</item>
     <item quantity="other">"через <xliff:g id="COUNT">%d</xliff:g> дн."</item>
   </plurals>
-    <string name="preposition_for_date">"%s"</string>
+    <string name="preposition_for_date">"в %s"</string>
     <string name="preposition_for_time">"в %s"</string>
-    <string name="preposition_for_year">"в %s"</string>
-    <string name="day">"день"</string>
-    <string name="days">"дни"</string>
-    <string name="hour">"час"</string>
-    <string name="hours">"часы"</string>
-    <string name="minute">"мин"</string>
+    <string name="preposition_for_year">"через %s"</string>
+    <string name="day">"дн."</string>
+    <string name="days">"дн."</string>
+    <string name="hour">"ч."</string>
+    <string name="hours">"ч."</string>
+    <string name="minute">"мин."</string>
     <string name="minutes">"мин."</string>
-    <string name="second">"сек"</string>
-    <string name="seconds">"сек."</string>
-    <string name="week">"неделя"</string>
-    <string name="weeks">"недели"</string>
-    <string name="year">"год"</string>
-    <string name="years">"годы"</string>
-    <string name="every_weekday">"По рабочим дням (пн-пт)"</string>
+    <string name="second">"с."</string>
+    <string name="seconds">"с."</string>
+    <string name="week">"нед."</string>
+    <string name="weeks">"нед."</string>
+    <string name="year">"г."</string>
+    <string name="years">"г."</string>
+    <string name="every_weekday">"Каждый рабочий день (пн-пт)"</string>
     <string name="daily">"Ежедневно"</string>
-    <string name="weekly">"Еженедельно в: <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="weekly">"Еженедельно, <xliff:g id="DAY">%s</xliff:g>"</string>
     <string name="monthly">"Ежемесячно"</string>
     <string name="yearly">"Ежегодно"</string>
-    <string name="VideoView_error_title">"Не удается воспроизвести видео"</string>
-    <string name="VideoView_error_text_invalid_progressive_playback">"К сожалению, это видео не подходит для потокового воспроизведения на данном устройстве."</string>
-    <string name="VideoView_error_text_unknown">"К сожалению, это видео нельзя воспроизвести."</string>
+    <string name="VideoView_error_title">"Не удалось воспроизвести видео"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Это видео не подходит для потокового воспроизведения на данном устройстве."</string>
+    <string name="VideoView_error_text_unknown">"Невозможно воспроизвести видео."</string>
     <string name="VideoView_error_button">"ОК"</string>
     <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
     <string name="noon">"полдень"</string>
     <string name="Noon">"Полдень"</string>
     <string name="midnight">"полночь"</string>
     <string name="Midnight">"Полночь"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"Выбрать все"</string>
     <string name="selectText">"Выбрать текст"</string>
-    <string name="stopSelectingText">"Прекратить выбор текста"</string>
+    <string name="stopSelectingText">"Остановить выделение текста"</string>
     <string name="cut">"Вырезать"</string>
     <string name="cutAll">"Вырезать все"</string>
     <string name="copy">"Копировать"</string>
@@ -555,9 +641,9 @@
     <string name="copyUrl">"Копировать URL"</string>
     <string name="inputMethod">"Способ ввода"</string>
     <string name="addToDictionary">"Добавить \"%s\" в словарь"</string>
-    <string name="editTextMenuTitle">"Правка текста"</string>
+    <string name="editTextMenuTitle">"Изменить текст"</string>
     <string name="low_internal_storage_view_title">"Недостаточно места"</string>
-    <string name="low_internal_storage_view_text">"В памяти телефона осталось мало места."</string>
+    <string name="low_internal_storage_view_text">"Заканчивается место в памяти телефона."</string>
     <string name="ok">"ОК"</string>
     <string name="cancel">"Отмена"</string>
     <string name="yes">"ОК"</string>
@@ -565,48 +651,50 @@
     <string name="dialog_alert_title">"Внимание"</string>
     <string name="capital_on">"ВКЛ"</string>
     <string name="capital_off">"ВЫКЛ"</string>
-    <string name="whichApplication">"Выполнить действие с помощью"</string>
-    <string name="alwaysUse">"Использовать для этого действия по умолчанию."</string>
-    <string name="clearDefaultHintMsg">"Значения по умолчанию можно сбросить в разделе Настройки главного экрана &gt; Приложения &gt; Управление приложениями."</string>
+    <string name="whichApplication">"Завершить действие с помощью"</string>
+    <string name="alwaysUse">"Использовать по умолчанию для этого действия."</string>
+    <string name="clearDefaultHintMsg">"Удалить настройки по умолчанию: главный экран &gt; \"Настройки\" &gt; \"Приложения\" &gt; \"Управление приложениями\"."</string>
     <string name="chooseActivity">"Выберите действие"</string>
-    <string name="noApplications">"Нет приложений, которые могли бы выполнить это действие."</string>
-    <string name="aerr_title">"Ой!"</string>
-    <string name="aerr_application">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> (процесс <xliff:g id="PROCESS">%2$s</xliff:g>) неожиданно остановилось. Повторите попытку."</string>
-    <string name="aerr_process">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> неожиданно остановился. Повторите попытку."</string>
-    <string name="anr_title">"Ой!"</string>
+    <string name="noApplications">"Это действие не может выполнять ни одно приложение."</string>
+    <string name="aerr_title">"Ошибка приложения!"</string>
+    <string name="aerr_application">"Произошла неожиданная остановка приложения <xliff:g id="APPLICATION">%1$s</xliff:g> (процесс <xliff:g id="PROCESS">%2$s</xliff:g>). Повторите попытку."</string>
+    <string name="aerr_process">"Произошла неожиданная остановка процесса <xliff:g id="PROCESS">%1$s</xliff:g>. Повторите попытку."</string>
+    <string name="anr_title">"Извините!"</string>
     <string name="anr_activity_application">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в приложении <xliff:g id="APPLICATION">%2$s</xliff:g>) не отвечает."</string>
     <string name="anr_activity_process">"Действие <xliff:g id="ACTIVITY">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
     <string name="anr_application_process">"Приложение <xliff:g id="APPLICATION">%1$s</xliff:g> (в процессе <xliff:g id="PROCESS">%2$s</xliff:g>) не отвечает."</string>
     <string name="anr_process">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g> не отвечает."</string>
-    <string name="force_close">"Закрыть принудительно"</string>
-    <string name="wait">"Подождать"</string>
-    <string name="debug">"Отладка"</string>
+    <string name="force_close">"Принудительное закрытие"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Подождите"</string>
+    <string name="debug">"Выполнить отладку"</string>
     <string name="sendText">"Выберите действие для текста"</string>
     <string name="volume_ringtone">"Громкость звонка"</string>
-    <string name="volume_music">"Громкость звука мультимедиа"</string>
-    <string name="volume_music_hint_playing_through_bluetooth">"Воспроизводится через Bluetooth"</string>
-    <string name="volume_call">"Громкость звонка"</string>
+    <string name="volume_music">"Громкость мультимедиа"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Воспроизведение по каналу Bluetooth"</string>
+    <string name="volume_call">"Громкость входящего вызова"</string>
     <string name="volume_bluetooth_call">"Громкость входящего вызова Bluetooth"</string>
-    <string name="volume_alarm">"Громкость будильника"</string>
+    <string name="volume_alarm">"Громкость сигнала предупреждения"</string>
     <string name="volume_notification">"Громкость уведомления"</string>
     <string name="volume_unknown">"Громкость"</string>
-    <string name="ringtone_default">"Мелодия звонка по умолчанию"</string>
-    <string name="ringtone_default_with_actual">"Мелодия звонка по умолчанию (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
-    <string name="ringtone_silent">"Тишина"</string>
-    <string name="ringtone_picker_title">"Мелодии звонка"</string>
-    <string name="ringtone_unknown">"Неизвестная мелодия звонка"</string>
+    <string name="ringtone_default">"Мелодия по умолчанию"</string>
+    <string name="ringtone_default_with_actual">"Мелодия по умолчанию (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Без звука"</string>
+    <string name="ringtone_picker_title">"Мелодии"</string>
+    <string name="ringtone_unknown">"Неизвестная мелодия"</string>
   <plurals name="wifi_available">
     <item quantity="one">"Доступна сеть Wi-Fi"</item>
-    <item quantity="other">"Доступны сети Wi-Fi"</item>
+    <item quantity="other">"Доступна сеть Wi-Fi"</item>
   </plurals>
   <plurals name="wifi_available_detailed">
-    <item quantity="one">"Доступна открытая сеть Wi-Fi"</item>
-    <item quantity="other">"Доступны открытые сети Wi-Fi"</item>
+    <item quantity="one">"Найдена доступная сеть Wi-Fi"</item>
+    <item quantity="other">"Найдены доступные сети Wi-Fi"</item>
   </plurals>
-    <string name="select_character">"Вставка символа"</string>
+    <string name="select_character">"Введите символ"</string>
     <string name="sms_control_default_app_name">"Неизвестное приложение"</string>
-    <string name="sms_control_title">"Отправка SMS"</string>
-    <string name="sms_control_message">"Отправляется большое количество сообщений SMS. Выберите \"ОК\", чтобы продолжить, или \"Отмена\", чтобы остановить отправку."</string>
+    <string name="sms_control_title">"Отправка SMS-сообщений"</string>
+    <string name="sms_control_message">"Отправляется большое количество SMS-сообщений. Нажмите \"ОК\" для продолжения или \"Отмена\" для прекращения отправки."</string>
     <string name="sms_control_yes">"ОК"</string>
     <string name="sms_control_no">"Отмена"</string>
     <string name="date_time_set">"Установить"</string>
@@ -615,39 +703,48 @@
     <string name="perms_hide"><b>"Скрыть"</b></string>
     <string name="perms_show_all"><b>"Показать все"</b></string>
     <string name="googlewebcontenthelper_loading">"Идет загрузка…"</string>
-    <string name="usb_storage_title">"Подключение через USB"</string>
-    <string name="usb_storage_message">"Вы подключили телефон к компьютеру через USB. Выберите \"Подключиться\" для копирования файлов между компьютером и картой SD телефона."</string>
-    <string name="usb_storage_button_mount">"Подключиться"</string>
-    <string name="usb_storage_button_unmount">"Не подключаться"</string>
-    <string name="usb_storage_error_message">"Не удается использовать карту SD в качестве USB-хранилища."</string>
-    <string name="usb_storage_notification_title">"Подключение через USB"</string>
-    <string name="usb_storage_notification_message">"Выберите для копирования файлов на/с компьютера."</string>
+    <string name="usb_storage_title">"устройство USB подключено"</string>
+    <string name="usb_storage_message">"Телефон подключен к компьютеру через порт USB. Если необходимо копировать файлы с компьютера на SD-карту телефона (или наоборот), выберите \"Установить\"."</string>
+    <string name="usb_storage_button_mount">"Смонтировать"</string>
+    <string name="usb_storage_button_unmount">"Не монтировать"</string>
+    <string name="usb_storage_error_message">"При использовании SD-карты как USB-накопителя возникла неполадка."</string>
+    <string name="usb_storage_notification_title">"устройство USB подключено"</string>
+    <string name="usb_storage_notification_message">"Выберите копирование файлов на компьютер или с компьютера."</string>
     <string name="usb_storage_stop_notification_title">"Выключить USB-накопитель"</string>
     <string name="usb_storage_stop_notification_message">"Выберите, чтобы выключить USB-накопитель."</string>
     <string name="usb_storage_stop_title">"Выключить USB-накопитель"</string>
     <string name="usb_storage_stop_message">"Перед выключением USB-накопителя обязательно отключите USB-хост. Выберите \"Выключить\", чтобы выключить USB-накопитель."</string>
     <string name="usb_storage_stop_button_mount">"Выключить"</string>
     <string name="usb_storage_stop_button_unmount">"Отмена"</string>
-    <string name="usb_storage_stop_error_message">"При выключении USB-накопителя произошла проблема. Убедитесь, что USB-хост отключен, и повторите попытку."</string>
+    <string name="usb_storage_stop_error_message">"При выключении USB-накопителя произошла неполадка. Убедитесь, что USB-хост отключен, и повторите попытку."</string>
     <string name="extmedia_format_title">"Форматировать карту SD"</string>
     <string name="extmedia_format_message">"Отформатировать карту SD? Все данные, находящиеся на карте, будут уничтожены."</string>
     <string name="extmedia_format_button_format">"Формат"</string>
-    <string name="select_input_method">"Выбор способа ввода"</string>
-    <string name="fast_scroll_alphabet">" АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ"</string>
-    <string name="fast_scroll_numeric_alphabet">" 0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ"</string>
-    <string name="candidates_style"><u>"кандидаты"</u></string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Выберите способ ввода"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"варианты"</u></string>
     <string name="ext_media_checking_notification_title">"Подготовка карты SD"</string>
-    <string name="ext_media_checking_notification_message">"Поиск ошибок"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"Пустая карта SD"</string>
-    <string name="ext_media_nofs_notification_message">"Карта SD пуста или использует неподдерживаемую файловую систему."</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"Поврежденная карта SD"</string>
-    <string name="ext_media_unmountable_notification_message">"Карта SD повреждена. Может потребоваться переформатировать ее."</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"Карта SD неожиданно извлечена"</string>
     <string name="ext_media_badremoval_notification_message">"Перед извлечением карты SD отключите ее во избежание потери данных."</string>
     <string name="ext_media_safe_unmount_notification_title">"Безопасное удаление карты SD"</string>
-    <string name="ext_media_safe_unmount_notification_message">"Теперь карту SD можно безопасно удалить."</string>
-    <string name="ext_media_nomedia_notification_title">"Карта SD удалена"</string>
-    <string name="ext_media_nomedia_notification_message">"Карта SD была удалена. Для увеличения емкости устройства вставьте новую карту SD."</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"Отсутствует карта SD"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"Подходящих действий не найдено"</string>
     <string name="permlab_pkgUsageStats">"обновлять статистику использования компонентов"</string>
     <string name="permdesc_pkgUsageStats">"Позволяет изменять собранную статистику использования компонентов. Не предназначено для использования обычными приложениями."</string>
@@ -661,4 +758,8 @@
     <string name="ime_action_default">"Выполнить"</string>
     <string name="dial_number_using">"Набрать номер"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
     <string name="create_contact_using">"Создать контакт"\n"с номером <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
 </resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
new file mode 100644
index 0000000..383126a
--- /dev/null
+++ b/core/res/res/values-sv/strings.xml
@@ -0,0 +1,765 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"kB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
+    <string name="untitled">"&lt;utan titel&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Inget telefonnummer)"</string>
+    <string name="unknownName">"(Okänd)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Röstbrevlåda"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Anslutningsproblem eller ogiltig MMI-kod."</string>
+    <string name="serviceEnabled">"Tjänsten har aktiverats."</string>
+    <string name="serviceEnabledFor">"Tjänsten har aktiverats för:"</string>
+    <string name="serviceDisabled">"Tjänsten har inaktiverats."</string>
+    <string name="serviceRegistered">"Registreringen slutförd."</string>
+    <string name="serviceErased">"Radering lyckades."</string>
+    <string name="passwordIncorrect">"Fel lösenord."</string>
+    <string name="mmiComplete">"MMI slutförd."</string>
+    <string name="badPin">"Den gamla PIN-koden som du angav är fel."</string>
+    <string name="badPuk">"PUK-koden som du angav är fel."</string>
+    <string name="mismatchPin">"PIN-koderna som du angav matchar inte."</string>
+    <string name="invalidPin">"Ange en PIN-kod som är 4 till 8 siffror."</string>
+    <string name="needPuk">"Ditt SIM-kort är PUK-låst. Ange PUK-koden om du vill låsa upp det."</string>
+    <string name="needPuk2">"Ange PUK2-koden för att häva spärren av SIM-kortet."</string>
+    <string name="ClipMmi">"Nummerpresentatör för inkommande samtal"</string>
+    <string name="ClirMmi">"Nummerpresentatör för utgående samtal"</string>
+    <string name="CfMmi">"Vidarebefordra samtal"</string>
+    <string name="CwMmi">"Samtal väntar"</string>
+    <string name="BaMmi">"Samtalsspärr"</string>
+    <string name="PwdMmi">"Byt lösenord"</string>
+    <string name="PinMmi">"Byt PIN-kod"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"Nummerpresentatören är begränsad som standard. Nästa samtal: Begränsad"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Nummerpresentatörens standardinställning är begränsad. Nästa samtal: Inte begränsad"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Nummerpresentatörens standardinställning är inte begränsad. Nästa samtal: Begränsad"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Nummerpresentatörens standardinställning är inte begränsad. Nästa samtal: Inte begränsad"</string>
+    <string name="serviceNotProvisioned">"Tjänsten är inte etablerad."</string>
+    <string name="CLIRPermanent">"Det går inte att ändra inställningen för nummerpresentatör."</string>
+    <string name="RestrictedChangedTitle">"Begränsad åtkomst har ändrats"</string>
+    <string name="RestrictedOnData">"Datatjänsten är blockerad."</string>
+    <string name="RestrictedOnEmergency">"Räddningstjänsten är blockerad."</string>
+    <string name="RestrictedOnNormal">"Tjänsten röst/SMS är blockerad."</string>
+    <string name="RestrictedOnAll">"Alla röst-/SMS-tjänster har blockerats."</string>
+    <string name="serviceClassVoice">"Röst"</string>
+    <string name="serviceClassData">"Data"</string>
+    <string name="serviceClassFAX">"FAX"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Asynkront"</string>
+    <string name="serviceClassDataSync">"Synkronisera"</string>
+    <string name="serviceClassPacket">"Paket"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Vidarebefordras inte"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g><xliff:g id="DIALING_NUMBER">{1}</xliff:g> efter <xliff:g id="TIME_DELAY">{2}</xliff:g> sekunder"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>. Vidarebefordras inte"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Vidarebefordras inte"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
+    <string name="httpErrorOk">"OK"</string>
+    <string name="httpError">"Webbsidan innehåller ett fel."</string>
+    <string name="httpErrorLookup">"Webbadressen kunde inte hittas."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Webbplatsens autentiseringsmetod stöds inte."</string>
+    <string name="httpErrorAuth">"Det gick inte att autentisera."</string>
+    <string name="httpErrorProxyAuth">"Det gick inte att autentisera via proxyservern."</string>
+    <string name="httpErrorConnect">"Det gick inte att ansluta till servern."</string>
+    <string name="httpErrorIO">"Servern kommunicerade inte. Försök igen senare."</string>
+    <string name="httpErrorTimeout">"Anslutningen till servern har kopplats ifrån."</string>
+    <string name="httpErrorRedirectLoop">"Sidan innehåller för många serveromdirigeringar."</string>
+    <string name="httpErrorUnsupportedScheme">"Protokollet stöds inte."</string>
+    <string name="httpErrorFailedSslHandshake">"Det gick inte att upprätta en säker anslutning."</string>
+    <string name="httpErrorBadUrl">"Sidan kunde inte öppnas eftersom webbadressen är ogiltig."</string>
+    <string name="httpErrorFile">"Det gick inte att komma åt filen."</string>
+    <string name="httpErrorFileNotFound">"Den begärda filen hittades inte."</string>
+    <string name="httpErrorTooManyRequests">"För många begäranden bearbetas. Försök igen senare."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Synkronisera"</string>
+    <string name="contentServiceSyncNotificationTitle">"Synkronisera"</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"För många <xliff:g id="CONTENT_TYPE">%s</xliff:g>-borttagningar."</string>
+    <string name="low_memory">"Telefonens lagringsutrymme är fullt! Radera några filer för att frigöra utrymme."</string>
+    <string name="me">"Jag"</string>
+    <string name="power_dialog">"Telefonalternativ"</string>
+    <string name="silent_mode">"Tyst läge"</string>
+    <string name="turn_on_radio">"Aktivera trådlöst"</string>
+    <string name="turn_off_radio">"Inaktivera trådlöst"</string>
+    <string name="screen_lock">"Skärmlås"</string>
+    <string name="power_off">"Stäng av"</string>
+    <string name="shutdown_progress">"Avslutar…"</string>
+    <string name="shutdown_confirm">"Din telefon stängs av."</string>
+    <string name="no_recent_tasks">"Inga nya program."</string>
+    <string name="global_actions">"Telefonalternativ"</string>
+    <string name="global_action_lock">"Skärmlås"</string>
+    <string name="global_action_power_off">"Stäng av"</string>
+    <string name="global_action_toggle_silent_mode">"Tyst läge"</string>
+    <string name="global_action_silent_mode_on_status">"Ljudet är AV"</string>
+    <string name="global_action_silent_mode_off_status">"Ljudet är PÅ"</string>
+    <string name="global_actions_toggle_airplane_mode">"Flygplansläge"</string>
+    <string name="global_actions_airplane_mode_on_status">"Flygplansläge är AKTIVERAT"</string>
+    <string name="global_actions_airplane_mode_off_status">"Flygplansläge är INAKTIVERAT"</string>
+    <string name="safeMode">"Säkert läge"</string>
+    <string name="android_system_label">"Android-system"</string>
+    <string name="permgrouplab_costMoney">"Tjänster som kostar pengar"</string>
+    <string name="permgroupdesc_costMoney">"Tillåter att program gör saker som kostar pengar."</string>
+    <string name="permgrouplab_messages">"Dina meddelanden"</string>
+    <string name="permgroupdesc_messages">"Läs och skriv SMS, e-post och andra meddelanden."</string>
+    <string name="permgrouplab_personalInfo">"Dina personliga uppgifter"</string>
+    <string name="permgroupdesc_personalInfo">"Direktåtkomst till dina kontakter och kalendern som har lagrats på telefonen."</string>
+    <string name="permgrouplab_location">"Din plats"</string>
+    <string name="permgroupdesc_location">"Övervaka din fysiska plats"</string>
+    <string name="permgrouplab_network">"Nätverkskommunikation"</string>
+    <string name="permgroupdesc_network">"Tillåt att program kommer åt olika nätverksfunktioner."</string>
+    <string name="permgrouplab_accounts">"Dina Google-konton"</string>
+    <string name="permgroupdesc_accounts">"Få åtkomst till tillgängliga Google-konton."</string>
+    <string name="permgrouplab_hardwareControls">"Kontroller för maskinvara"</string>
+    <string name="permgroupdesc_hardwareControls">"Direkt åtkomst till maskinvara på handenheten."</string>
+    <string name="permgrouplab_phoneCalls">"Telefonsamtal"</string>
+    <string name="permgroupdesc_phoneCalls">"Övervaka, spela in och bearbeta telefonsamtal"</string>
+    <string name="permgrouplab_systemTools">"Systemverktyg"</string>
+    <string name="permgroupdesc_systemTools">"Åtkomst och kontroll av systemet på lägre nivå."</string>
+    <string name="permgrouplab_developmentTools">"Utvecklingsverktyg"</string>
+    <string name="permgroupdesc_developmentTools">"Funktioner som endast behövs för programutvecklare."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"inaktivera eller ändra statusfält"</string>
+    <string name="permdesc_statusBar">"Tillåter att programmet inaktiverar statusfältet eller lägger till och tar bort systemikoner."</string>
+    <string name="permlab_expandStatusBar">"expandera/komprimera statusfält"</string>
+    <string name="permdesc_expandStatusBar">"Tillåter att program expanderar eller komprimerar statusfältet."</string>
+    <string name="permlab_processOutgoingCalls">"spärra utgående samtal"</string>
+    <string name="permdesc_processOutgoingCalls">"Tillåter att program hanterar utgående samtal och ändrar numret som ska ringas upp. Skadliga program kan övervaka, omdirigera eller förhindra utgående samtal."</string>
+    <string name="permlab_receiveSms">"ta emot SMS"</string>
+    <string name="permdesc_receiveSms">"Tillåter att program tar emot och bearbetar SMS-meddelanden. Skadliga program kan övervaka dina meddelanden eller ta bort dem utan att visa dem för dig."</string>
+    <string name="permlab_receiveMms">"ta emot MMS"</string>
+    <string name="permdesc_receiveMms">"Tillåter att program tar emot och bearbetar MMS-meddelanden. Skadliga program kan övervaka dina meddelanden eller ta bort dem innan du har sett dem."</string>
+    <string name="permlab_sendSms">"skicka SMS"</string>
+    <string name="permdesc_sendSms">"Tillåter att programmet skickar SMS-meddelanden. Skadliga program kan skicka meddelanden utan ditt godkännande vilket kan kosta pengar."</string>
+    <string name="permlab_readSms">"läsa SMS eller MMS"</string>
+    <string name="permdesc_readSms">"Tillåter att program läser SMS-meddelanden som sparats på din telefon eller SIM-kort. Skadliga program kan läsa dina konfidentiella meddelanden."</string>
+    <string name="permlab_writeSms">"redigera SMS eller MMS"</string>
+    <string name="permdesc_writeSms">"Tillåter att program skriver till SMS-meddelanden som lagrats på din telefon eller SIM-kort. Skadliga program kan radera dina meddelanden."</string>
+    <string name="permlab_receiveWapPush">"ta emot WAP"</string>
+    <string name="permdesc_receiveWapPush">"Tillåter att program tar emot och bearbetar WAP-meddelanden. Skadliga program kan övervaka dina meddelanden eller ta bort dem utan att visa dem för dig."</string>
+    <string name="permlab_getTasks">"hämta program som körs"</string>
+    <string name="permdesc_getTasks">"Tillåter att program hämtar information om uppgifter som körs och har körts. Skadliga program kan upptäcka privat information om andra program."</string>
+    <string name="permlab_reorderTasks">"byt ordning på program som körs"</string>
+    <string name="permdesc_reorderTasks">"Tillåter att ett program flyttar uppgifter till förgrunden eller bakgrunden. Skadliga program kan tvinga sig till förgrunden utan att du kan styra det."</string>
+    <string name="permlab_setDebugApp">"aktivera felsökning av program"</string>
+    <string name="permdesc_setDebugApp">"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">"ändra dina gränssnittsinställningar"</string>
+    <string name="permdesc_changeConfiguration">"Tillåter att ett program ändrar den aktuella konfigurationen, till exempel språk eller övergripande teckenformat."</string>
+    <string name="permlab_restartPackages">"starta om andra program"</string>
+    <string name="permdesc_restartPackages">"Tillåter att ett program framtvingar omstart av andra program."</string>
+    <string name="permlab_forceBack">"tvinga program att avsluta"</string>
+    <string name="permdesc_forceBack">"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">"hämta systemets interna status"</string>
+    <string name="permdesc_dump">"Tillåter att ett program hämtar systemets interna status. Skadliga program kan hämta privat och skyddad information som de normalt aldrig ska behöva."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"övervaka och styra alla program som öppnas"</string>
+    <string name="permdesc_runSetActivityWatcher">"Tillåter att ett program övervakar och styr hur systemet startar aktiviteter. Skadliga program kan bryta systemet helt. Den här behörigheten behövs bara för programmering, aldrig för vanlig telefonanvändning."</string>
+    <string name="permlab_broadcastPackageRemoved">"skicka meddelande om borttaget paket"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Tillåter att ett program skickar ett meddelande om att ett programpaket har tagits bort. Skadliga program kan använda detta för att avsluta alla andra program som körs."</string>
+    <string name="permlab_broadcastSmsReceived">"skicka SMS-mottagen sändning"</string>
+    <string name="permdesc_broadcastSmsReceived">"Tillåter att ett program sänder ut en avisering när SMS tas emot. Skadliga program kan använda detta för att förfalska inkommande SMS-meddelanden."</string>
+    <string name="permlab_broadcastWapPush">"skicka WAP-PUSH-mottagen sändning"</string>
+    <string name="permdesc_broadcastWapPush">"Tillåter att ett program skickar ut en avisering när ett WAP PUSH-meddelande tas emot. Skadliga program kan använda detta för att förfalska mottagning av MMS eller för att obemärkt byta ut innehållet på en webbsida mot skadligt innehåll."</string>
+    <string name="permlab_setProcessLimit">"begränsa antalet processer som körs"</string>
+    <string name="permdesc_setProcessLimit">"Tillåter att ett program styr högsta antalet processer som körs. Behövs inte för vanliga program."</string>
+    <string name="permlab_setAlwaysFinish">"gör så att alla bakgrundsprogram stängs"</string>
+    <string name="permdesc_setAlwaysFinish">"Tillåter att ett program bestämmer om aktiviteter alltid är slutförda när de hamnar i bakgrunden. Ska inte behövas för vanliga program."</string>
+    <string name="permlab_batteryStats">"ändra batteristatistik"</string>
+    <string name="permdesc_batteryStats">"Tillåter att samlad batteristatistik ändras. Används inte av vanliga program."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"visa otillåtna fönster"</string>
+    <string name="permdesc_internalSystemWindow">"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">"visa varningar på systemnivå"</string>
+    <string name="permdesc_systemAlertWindow">"Tillåter att ett program visar fönster med systemvarningar. Skadliga program kan överta hela telefonens skärm."</string>
+    <string name="permlab_setAnimationScale">"ändra global animeringshastighet"</string>
+    <string name="permdesc_setAnimationScale">"Tillåter att ett program när som helst ändrar den globala animeringshastigheten (snabbare eller långsammare)."</string>
+    <string name="permlab_manageAppTokens">"hantera programtoken"</string>
+    <string name="permdesc_manageAppTokens">"Tillåter att program skapar och hanterar egna token och förbigår normala Z-beställningar. Behövs inte för vanliga program."</string>
+    <string name="permlab_injectEvents">"trycka på knappar och styrknappar"</string>
+    <string name="permdesc_injectEvents">"Tillåter att ett program levererar egna inmatningshändelser (knapptryckningar, osv.) till andra program. Skadliga program använder detta för att kapa telefonen."</string>
+    <string name="permlab_readInputState">"registrera vad du skriver och vilka åtgärder du vidtar"</string>
+    <string name="permdesc_readInputState">"Tillåter att program övervakar knapparna som du trycker på, till och med när du använder andra program (till exempel när du anger ett lösenord). Ska inte behövas för vanliga program."</string>
+    <string name="permlab_bindInputMethod">"binda till en metod för indata"</string>
+    <string name="permdesc_bindInputMethod">"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_setOrientation">"ändra bildskärmens rikting"</string>
+    <string name="permdesc_setOrientation">"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">"skicka Linux-signaler till program"</string>
+    <string name="permdesc_signalPersistentProcesses">"Tillåter att programmet begär att den angivna signalen skickas till alla beständiga processer."</string>
+    <string name="permlab_persistentActivity">"se till att programmet alltid körs"</string>
+    <string name="permdesc_persistentActivity">"Tillåter att ett program gör vissa delar beständiga så att systemet inte kan använda det för andra program."</string>
+    <string name="permlab_deletePackages">"ta bort program"</string>
+    <string name="permdesc_deletePackages">"Tillåter att ett program tar bort Android-paket. Skadliga program kan använda detta för att ta bort viktiga program."</string>
+    <string name="permlab_clearAppUserData">"ta bort de andra programmens uppgifter"</string>
+    <string name="permdesc_clearAppUserData">"Tillåter att ett program tar bort användardata."</string>
+    <string name="permlab_deleteCacheFiles">"ta bort de andra programmens cacheminnen"</string>
+    <string name="permdesc_deleteCacheFiles">"Tillåter att ett program raderar cachefiler."</string>
+    <string name="permlab_getPackageSize">"mäta telefonens lagringsutrymme"</string>
+    <string name="permdesc_getPackageSize">"Tillåter att ett program hämtar kod, data och cachestorlekar"</string>
+    <string name="permlab_installPackages">"installera program direkt"</string>
+    <string name="permdesc_installPackages">"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">"ta bort cacheinformation för alla program"</string>
+    <string name="permdesc_clearAppCache">"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>
+    <string name="permlab_readLogs">"läsa systemets loggfiler"</string>
+    <string name="permdesc_readLogs">"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">"läsa/skriva till resurser som ägs av diag"</string>
+    <string name="permdesc_diagnostic">"Tillåter att ett program läser och skriver till en resurs som ägs av diag-gruppen; till exempel filer i /dev. Detta kan eventuellt påverka systemets stabilitet och säkerhet. Detta bör ENDAST används av tillverkaren eller operatören för maskinvaruspecifik diagnostik."</string>
+    <string name="permlab_changeComponentState">"aktivera eller inaktivera programkomponenter"</string>
+    <string name="permdesc_changeComponentState">"Tillåter att ett program ändrar inställningen för om en komponent i ett annat program har aktiverats eller inte. Skadliga program kan använda detta för att inaktivera viktiga telefonfunktioner. Var försiktig med behörigheten, eftersom programkomponenter kan bli oanvändbara, inkonsekventa eller ostabila."</string>
+    <string name="permlab_setPreferredApplications">"ange önskade program"</string>
+    <string name="permdesc_setPreferredApplications">"Tillåter att ett program ändrar dina önskade program. Skadliga program kan utan varning ändra de program som körs och förfalska dina befintliga program så att de samlar privata data från dig."</string>
+    <string name="permlab_writeSettings">"ändra globala systeminställningar"</string>
+    <string name="permdesc_writeSettings">"Tillåter att ett program ändrar systemets inställningar. Skadliga program kan skada systemets konfiguration."</string>
+    <string name="permlab_writeSecureSettings">"ändra skyddade systeminställningar"</string>
+    <string name="permdesc_writeSecureSettings">"Tillåter att ett program ändrar systemets data för skyddade inställningar. Används inte av vanliga program."</string>
+    <string name="permlab_writeGservices">"ändra kartan för Googles tjänster"</string>
+    <string name="permdesc_writeGservices">"Tillåter att ett program ändrar kartan för Google-tjänster. Används inte av vanliga program."</string>
+    <string name="permlab_receiveBootCompleted">"starta automatiskt vid systemstart"</string>
+    <string name="permdesc_receiveBootCompleted">"Tillåter att ett program startar när systemet har startats om. Detta kan innebära att det tar längre tid att starta om telefonen och att telefonen blir långsammare i och med att programmet hela tiden körs i bakgrunden."</string>
+    <string name="permlab_broadcastSticky">"Skicka sticky broadcast"</string>
+    <string name="permdesc_broadcastSticky">"Tillåter att ett program skickar sticky broadcasts, som finns kvar när sändningen är slut. Skadliga program kan göra telefonen seg eller instabil genom att se till att den använder för mycket minne."</string>
+    <string name="permlab_readContacts">"läsa kontaktinformation"</string>
+    <string name="permdesc_readContacts">"Tillåter att ett program läser alla kontaktuppgifter (adresser) som har lagrats på din telefon. Skadliga program kan använda detta för att skicka dina data till andra personer."</string>
+    <string name="permlab_writeContacts">"skriva kontaktuppgifter"</string>
+    <string name="permdesc_writeContacts">"Tillåter att ett program ändrar kontaktuppgifter (adress) som har lagrats på din telefon. Skadliga program kan använda detta för att radera eller ändra kontaktuppgifter."</string>
+    <string name="permlab_writeOwnerData">"skriva ägarinformation"</string>
+    <string name="permdesc_writeOwnerData">"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">"läsa information om ägare"</string>
+    <string name="permdesc_readOwnerData">"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">"läsa kalenderinformation"</string>
+    <string name="permdesc_readCalendar">"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">"skriva kalenderdata"</string>
+    <string name="permdesc_writeCalendar">"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>
+    <string name="permlab_accessMockLocation">"skenplatser för att testa"</string>
+    <string name="permdesc_accessMockLocation">"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">"få åtkomst till extra kommandon för platsleverantör"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Få åtkomst till extra kommandon för platsleverantörer. Skadliga program kan använda detta för att störa hur GPS eller andra platskällor fungerar."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"hitta plats (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"Få åtkomst till detaljerade platskällor som Global Positioning System på telefonen, om det är tillgängligt. Skadliga program kan använda detta för att identifiera var du befinner dig, vilket drar mycket batteri."</string>
+    <string name="permlab_accessCoarseLocation">"grov (nätverksbaserad) plats"</string>
+    <string name="permdesc_accessCoarseLocation">"Få åtkomst till grova platser, till exempel mobilnätverkets databas, för att bestämma ungefärlig plats för en telefon. Skadliga program kan använda detta för att avgöra ungefär var du befinner dig."</string>
+    <string name="permlab_accessSurfaceFlinger">"få åtkomst till SurfaceFlinger"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Tillåter att program använder lågnivåfunktioner i SurfaceFlinger."</string>
+    <string name="permlab_readFrameBuffer">"läsa rambuffert"</string>
+    <string name="permdesc_readFrameBuffer">"Tillåter att program använder innehållet i rambufferten."</string>
+    <string name="permlab_modifyAudioSettings">"ändra dina ljudinställningar"</string>
+    <string name="permdesc_modifyAudioSettings">"Tillåter att ett program ändrar globala ljudinställningar, till exempel volym och routning."</string>
+    <string name="permlab_recordAudio">"spela in ljud"</string>
+    <string name="permdesc_recordAudio">"Tillåter att program får åtkomst till sökvägen för ljudinspelning."</string>
+    <string name="permlab_camera">"ta bilder"</string>
+    <string name="permdesc_camera">"Tillåter att program tar kort med kameran. Då kan programmet när som helst samla bilderna som visas i kameran."</string>
+    <string name="permlab_brick">"inaktivera telefonen permanent"</string>
+    <string name="permdesc_brick">"Tillåter att programmet inaktiverar hela telefonen permanent. Detta är mycket farligt."</string>
+    <string name="permlab_reboot">"tvinga omstart av telefon"</string>
+    <string name="permdesc_reboot">"Tillåter att ett program tvingar telefonen att starta om."</string>
+    <string name="permlab_mount_unmount_filesystems">"montering och demontering av filsystem"</string>
+    <string name="permdesc_mount_unmount_filesystems">"Tillåter att programmet monterar och demonterar filsystem för flyttbara lagringsmedia."</string>
+    <string name="permlab_mount_format_filesystems">"formatera extern lagring"</string>
+    <string name="permdesc_mount_format_filesystems">"Tillåter att programmet formaterar flyttbara lagringsmedia."</string>
+    <string name="permlab_vibrate">"kontrollera vibration"</string>
+    <string name="permdesc_vibrate">"Tillåter att programmet styr vibratorn."</string>
+    <string name="permlab_flashlight">"styra lampa"</string>
+    <string name="permdesc_flashlight">"Tillåter att programmet styr lampan."</string>
+    <string name="permlab_hardware_test">"testa maskinvara"</string>
+    <string name="permdesc_hardware_test">"Tillåter att ett program styr kringutrustning i syfte att testa maskinvara."</string>
+    <string name="permlab_callPhone">"ringa telefonnummer direkt"</string>
+    <string name="permdesc_callPhone">"Tillåter att programmet ringer telefonnummer utan åtgärd från dig. Skadliga program kan orsaka oväntade samtal på din telefonräkning. Observera att programmet inte tillåts att ringa nödsamtal."</string>
+    <string name="permlab_callPrivileged">"ringa telefonnummer direkt"</string>
+    <string name="permdesc_callPrivileged">"Tillåter att programmet ringer ett telefonnummer, inklusive nödnummer, utan att du behöver göra något. Skadliga program kan ringa onödiga och olagliga samtal till räddningtjänsten."</string>
+    <string name="permlab_locationUpdates">"styra meddelanden för platsuppdatering"</string>
+    <string name="permdesc_locationUpdates">"Tillåter aktivering och inaktivering av avisering om platsuppdatering i radion. Används inte av vanliga program."</string>
+    <string name="permlab_checkinProperties">"få åtkomst till incheckningsegenskaper"</string>
+    <string name="permdesc_checkinProperties">"Tillåter läs/skrivåtkomst till egenskaper som läggs upp via incheckningstjänsten. Används inte av vanliga program."</string>
+    <string name="permlab_bindGadget">"välja widgetar"</string>
+    <string name="permdesc_bindGadget">"Tillåter att programmet instruerar systemet vilka widgetar som kan användas av vilket program. Med den här behörigheten kan åtkomst till personliga data beviljas andra program. Används inte av vanliga program."</string>
+    <string name="permlab_modifyPhoneState">"ändra telefonstatus"</string>
+    <string name="permdesc_modifyPhoneState">"Tillåter att programmet styr enhetens telefonfunktioner. Ett program med denna behörighet kan växla nätverk, aktivera och inaktivera telefonens radio och så vidare utan att ens meddela dig."</string>
+    <string name="permlab_readPhoneState">"läsa telefonstatus"</string>
+    <string name="permdesc_readPhoneState">"Tillåter att programmet kommer åt enhetens telefonfunktioner. Ett program som har den här behörigheten kan identifiera telefonens telefonnummer, om ett samtal pågår, numret som samtalet är kopplat till och så vidare."</string>
+    <string name="permlab_wakeLock">"förhindra att telefonen sätts i viloläge"</string>
+    <string name="permdesc_wakeLock">"Tillåter att ett program förhindrar att telefonen går in i viloläge."</string>
+    <string name="permlab_devicePower">"sätta på eller stänga av telefonen"</string>
+    <string name="permdesc_devicePower">"Tillåter att ett program sätter på eller stänger av telefonen."</string>
+    <string name="permlab_factoryTest">"kör i fabrikstestläge"</string>
+    <string name="permdesc_factoryTest">"Köra som ett testläge för tillverkaren på låg nivå. På så sätt får du fullständig åtkomst till telefonens maskinvara. Är endast tillgänglig när telefonen körs i tillverkarens testläge."</string>
+    <string name="permlab_setWallpaper">"ange bakgrund"</string>
+    <string name="permdesc_setWallpaper">"Tillåter att programmet anger systemets bakgrund."</string>
+    <string name="permlab_setWallpaperHints">"ange tips för bakgrundsstorlek"</string>
+    <string name="permdesc_setWallpaperHints">"Tillåter att programmet ger tips om systemets bakgrundsstorlek."</string>
+    <string name="permlab_masterClear">"återställa systemets fabriksinställningar"</string>
+    <string name="permdesc_masterClear">"Tillåter att ett program helt återställer systemets fabriksinställningar. Alla data, inställningar och installerade program raderas."</string>
+    <string name="permlab_setTimeZone">"ange tidszon"</string>
+    <string name="permdesc_setTimeZone">"Tillåter att ett program ändrar telefonens tidszon."</string>
+    <string name="permlab_getAccounts">"upptäcka kända konton"</string>
+    <string name="permdesc_getAccounts">"Tillåter att ett program hämtar en lista över konton som telefonen känner till."</string>
+    <string name="permlab_accessNetworkState">"visa nätverksstatus"</string>
+    <string name="permdesc_accessNetworkState">"Tillåter att ett program ser status för alla nätverk."</string>
+    <string name="permlab_createNetworkSockets">"fullständig Internetåtkomst"</string>
+    <string name="permdesc_createNetworkSockets">"Tillåter att ett program skapar nätverksuttag."</string>
+    <string name="permlab_writeApnSettings">"skriva inställningar för åtkomstpunktens namn"</string>
+    <string name="permdesc_writeApnSettings">"Tillåter att ett program ändrar APN-inställningarna, till exempel Proxy och Port för alla APN."</string>
+    <string name="permlab_changeNetworkState">"ändra nätverksanslutning"</string>
+    <string name="permdesc_changeNetworkState">"Tillåter att ett program ändrar statusens nätverksanslutning."</string>
+    <string name="permlab_changeBackgroundDataSetting">"ändra inställningar för användning av bakgrundsdata"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Tillåter att ett program ändrar inställningen för användning av bakgrundsdata."</string>
+    <string name="permlab_accessWifiState">"visa Wi-Fi-status"</string>
+    <string name="permdesc_accessWifiState">"Tillåter att ett program visar information om statusen för Wi-Fi."</string>
+    <string name="permlab_changeWifiState">"byta Wi-Fi-status"</string>
+    <string name="permdesc_changeWifiState">"Tillåter att ett program ansluter till och kopplar från Wi-Fi-åtkomstpunkter och gör ändringar i konfigurerade Wi-Fi-nätverk."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"administrera bluetooth"</string>
+    <string name="permdesc_bluetoothAdmin">"Tillåter att ett program konfigurerar den lokala Bluetooth-telefonen samt upptäcker och parkopplar den med fjärranslutna enheter."</string>
+    <string name="permlab_bluetooth">"skapa Bluetooth-anslutningar"</string>
+    <string name="permdesc_bluetooth">"Tillåter att ett program ser den lokala Bluetooth-telefonens konfiguration, och skapar och accepterar anslutningar med parkopplade enheter."</string>
+    <string name="permlab_disableKeyguard">"inaktivera tangentlås"</string>
+    <string name="permdesc_disableKeyguard">"Tillåter att ett program inaktiverar tangentlåset och tillhörande lösenordsskydd. Ett exempel på detta är att telefonen inaktiverar tangentlåset vid inkommande samtal och sedan aktiverar det igen när samtalet är avslutat."</string>
+    <string name="permlab_readSyncSettings">"läsa synkroniseringsinställningar"</string>
+    <string name="permdesc_readSyncSettings">"Tillåter att ett program läser synkroniseringsinställningarna, till exempel om synkronisering har aktiverats för kontakter."</string>
+    <string name="permlab_writeSyncSettings">"skriva synkroniseringsinställningar"</string>
+    <string name="permdesc_writeSyncSettings">"Tillåter att ett program ändrar synkroniseringsinställningarna, till exempel om synkronisering har aktiverats för kontakter."</string>
+    <string name="permlab_readSyncStats">"läsa synkroniseringsstatistik"</string>
+    <string name="permdesc_readSyncStats">"Tillåter att ett program läser synkroniseringsstatistiken, t.ex. historiken över synkroniseringar som har inträffat."</string>
+    <string name="permlab_subscribedFeedsRead">"läsa flöden som du prenumererar på"</string>
+    <string name="permdesc_subscribedFeedsRead">"Tillåter att ett program får information om aktuella synkroniserade flöden."</string>
+    <string name="permlab_subscribedFeedsWrite">"skriva flöden som du prenumererar på"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Tillåter att ett program ändrar dina aktuella synkroniserade flöden. Det kan innebära att ett skadligt program kan ändra dina synkroniserade flöden."</string>
+    <string name="permlab_readDictionary">"läsa användardefinierad ordlista"</string>
+    <string name="permdesc_readDictionary">"Tillåt att ett program läser alla privata ord, namn och fraser som användaren lagrar i sin ordlista."</string>
+    <string name="permlab_writeDictionary">"skriva till användardefinierad ordlista"</string>
+    <string name="permdesc_writeDictionary">"Tillåter att ett program skriver in nya ord i användarordlistan."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
+  <string-array name="phoneTypes">
+    <item>"Hem"</item>
+    <item>"Mobil"</item>
+    <item>"Arbete"</item>
+    <item>"Fax, arbete"</item>
+    <item>"Hemfax"</item>
+    <item>"Personsökare"</item>
+    <item>"Övrigt"</item>
+    <item>"Anpassad"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Hem"</item>
+    <item>"Arbete"</item>
+    <item>"Övrigt"</item>
+    <item>"Anpassad"</item>
+  </string-array>
+    <string name="mobileEmailTypeName">"Mobil"</string>
+  <string-array name="postalAddressTypes">
+    <item>"Hem"</item>
+    <item>"Arbete"</item>
+    <item>"Övrigt"</item>
+    <item>"Anpassad"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Hem"</item>
+    <item>"Arbete"</item>
+    <item>"Övrigt"</item>
+    <item>"Anpassad"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"Arbete"</item>
+    <item>"Övrigt"</item>
+    <item>"Anpassad"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"Ange PIN-kod"</string>
+    <string name="keyguard_password_wrong_pin_code">"Fel PIN-kod!"</string>
+    <string name="keyguard_label_text">"Tryck på Meny och sedan på 0 om du vill låsa upp."</string>
+    <string name="emergency_call_dialog_number_for_display">"Nödsamtalsnummer"</string>
+    <string name="lockscreen_carrier_default">"(Ingen tjänst)"</string>
+    <string name="lockscreen_screen_locked">"Skärmen har låsts."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Tryck på Meny om du vill låsa upp eller ringa nödsamtal."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Tryck på Meny om du vill låsa upp."</string>
+    <string name="lockscreen_pattern_instructions">"Rita grafiskt lösenord för att låsa upp"</string>
+    <string name="lockscreen_emergency_call">"Nödsamtal"</string>
+    <string name="lockscreen_pattern_correct">"Korrekt!"</string>
+    <string name="lockscreen_pattern_wrong">"Försök igen"</string>
+    <string name="lockscreen_plugged_in">"Laddar (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
+    <string name="lockscreen_low_battery">"Anslut din laddare."</string>
+    <string name="lockscreen_missing_sim_message_short">"Inget SIM-kort."</string>
+    <string name="lockscreen_missing_sim_message">"Inget SIM-kort i telefonen."</string>
+    <string name="lockscreen_missing_sim_instructions">"Sätt i ett SIM-kort."</string>
+    <string name="lockscreen_network_locked_message">"Nätverk låst"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM-kortet är PUK-låst."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Se användarhandboken eller kontakta Kundtjänst."</string>
+    <string name="lockscreen_sim_locked_message">"SIM-kortet är låst."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"Låser upp SIM-kort…"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. "\n\n"Försök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter <xliff:g id="NUMBER_1">%d</xliff:g> försök till kommer du att uppmanas att låsa upp telefonen med din Google-inloggning."\n\n" Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"Försök igen om <xliff:g id="NUMBER">%d</xliff:g> sekunder."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Glömt ditt grafiska lösenord?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"För många försök med grafiskt lösenord!"</string>
+    <string name="lockscreen_glogin_instructions">"Logga in med ditt Google-konto om du vill låsa upp"</string>
+    <string name="lockscreen_glogin_username_hint">"Användarnamn (e-post)"</string>
+    <string name="lockscreen_glogin_password_hint">"Lösenord"</string>
+    <string name="lockscreen_glogin_submit_button">"Logga in"</string>
+    <string name="lockscreen_glogin_invalid_input">"Ogiltigt användarnamn eller lösenord."</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
+    <string name="status_bar_no_notifications_title">"Inga aviseringar"</string>
+    <string name="status_bar_ongoing_events_title">"Pågående"</string>
+    <string name="status_bar_latest_events_title">"Meddelanden"</string>
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="battery_status_charging">"Laddar…"</string>
+    <string name="battery_low_title">"Anslut laddaren"</string>
+    <string name="battery_low_subtitle">"Batteriet håller på att ta slut:"</string>
+    <string name="battery_low_percent_format">"Mindre än <xliff:g id="NUMBER">%d%%</xliff:g> återstår."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"Det gick fel vid fabrikstestet"</string>
+    <string name="factorytest_not_system">"Åtgärden FACTORY_TEST stöds endast för paket som har installerats i /system/app."</string>
+    <string name="factorytest_no_action">"Vi hittade inget paket som erbjuder åtgärden FACTORY_TEST."</string>
+    <string name="factorytest_reboot">"Starta om"</string>
+    <string name="js_dialog_title">"På sidan på <xliff:g id="TITLE">%s</xliff:g> står det:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Vill du lämna den här den här sidan?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Tryck på OK om du vill fortsätta eller på Avbryt om du vill vara kvar på den aktuella sidan."</string>
+    <string name="save_password_label">"Bekräfta"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Vill du att webbläsaren ska komma ihåg lösenordet?"</string>
+    <string name="save_password_notnow">"Inte nu"</string>
+    <string name="save_password_remember">"Kom ihåg"</string>
+    <string name="save_password_never">"Aldrig"</string>
+    <string name="open_permission_deny">"Du har inte behörighet att öppna den här sidan."</string>
+    <string name="text_copied">"Text har kopierats till urklipp."</string>
+    <string name="more_item_label">"Mer"</string>
+    <string name="prepend_shortcut_label">"Meny+"</string>
+    <string name="menu_space_shortcut_label">"utrymme"</string>
+    <string name="menu_enter_shortcut_label">"retur"</string>
+    <string name="menu_delete_shortcut_label">"ta bort"</string>
+    <string name="search_go">"Sök"</string>
+    <string name="oneMonthDurationPast">"för 1 månad sedan"</string>
+    <string name="beforeOneMonthDurationPast">"För mer än en månad sedan"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"för 1 sekund sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> sekunder sedan"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"för 1 minut sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> minuter sedan"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"för 1 timme sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> timmar sedan"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"igår"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> dagar sedan"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"om 1 sekund"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"om 1 minut"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> minuter"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"om 1 timme"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> timmar"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"imorgon"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> dagar"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"för 1 sek sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> sekunder sedan"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"för 1 minut sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> minuter sedan"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"för 1 timme sedan"</item>
+    <item quantity="other">"för <xliff:g id="COUNT">%d</xliff:g> timmar sedan"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"igår"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dagar sedan"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"om 1 sekund"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> sek"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"om 1 minut"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> minuter"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"om 1 timme"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> timmar"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"imorgon"</item>
+    <item quantity="other">"om <xliff:g id="COUNT">%d</xliff:g> dagar"</item>
+  </plurals>
+    <string name="preposition_for_date">"den %s"</string>
+    <string name="preposition_for_time">"vid %s"</string>
+    <string name="preposition_for_year">"%s"</string>
+    <string name="day">"dag"</string>
+    <string name="days">"dagar"</string>
+    <string name="hour">"timme"</string>
+    <string name="hours">"timmar"</string>
+    <string name="minute">"minut"</string>
+    <string name="minutes">"minuter"</string>
+    <string name="second">"sekunder"</string>
+    <string name="seconds">"sekunder"</string>
+    <string name="week">"vecka"</string>
+    <string name="weeks">"veckor"</string>
+    <string name="year">"år"</string>
+    <string name="years">"år"</string>
+    <string name="every_weekday">"Alla vardagar (mån–fre)"</string>
+    <string name="daily">"Varje dag"</string>
+    <string name="weekly">"Varje vecka på <xliff:g id="DAY">%s</xliff:g>"</string>
+    <string name="monthly">"Varje månad"</string>
+    <string name="yearly">"Varje år"</string>
+    <string name="VideoView_error_title">"Det går inte att spela upp videon"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Videon kan tyvärr inte spelas upp i den här enheten."</string>
+    <string name="VideoView_error_text_unknown">"Det går tyvärr inte att spela upp den här videon."</string>
+    <string name="VideoView_error_button">"OK"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon">"eftermiddag"</string>
+    <string name="Noon">"Mitt på dagen"</string>
+    <string name="midnight">"midnatt"</string>
+    <string name="Midnight">"Midnatt"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Välj alla"</string>
+    <string name="selectText">"Markera text"</string>
+    <string name="stopSelectingText">"Sluta välja text"</string>
+    <string name="cut">"Klipp ut"</string>
+    <string name="cutAll">"Klipp ut alla"</string>
+    <string name="copy">"Kopiera"</string>
+    <string name="copyAll">"Kopiera alla"</string>
+    <string name="paste">"Klistra in"</string>
+    <string name="copyUrl">"Kopiera webbadress"</string>
+    <string name="inputMethod">"Indatametod"</string>
+    <string name="addToDictionary">"Lägg till %s i ordlistan"</string>
+    <string name="editTextMenuTitle">"Redigera text"</string>
+    <string name="low_internal_storage_view_title">"Dåligt med utrymme"</string>
+    <string name="low_internal_storage_view_text">"Telefonens lagringsutrymme håller på att ta slut."</string>
+    <string name="ok">"OK"</string>
+    <string name="cancel">"Avbryt"</string>
+    <string name="yes">"OK"</string>
+    <string name="no">"Avbryt"</string>
+    <string name="dialog_alert_title">"Obs!"</string>
+    <string name="capital_on">"PÅ"</string>
+    <string name="capital_off">"AV"</string>
+    <string name="whichApplication">"Slutför åtgärd genom att använda"</string>
+    <string name="alwaysUse">"Använd som standard för denna åtgärd."</string>
+    <string name="clearDefaultHintMsg">"Rensa standardinställning i Startinställningar &gt; Program &gt; Hantera program."</string>
+    <string name="chooseActivity">"Välj en åtgärd"</string>
+    <string name="noApplications">"Inga program kan utföra den här åtgärden."</string>
+    <string name="aerr_title">"Tyvärr!"</string>
+    <string name="aerr_application">"Processen <xliff:g id="PROCESS">%2$s</xliff:g> för programmet <xliff:g id="APPLICATION">%1$s</xliff:g> stoppades oväntat. Försök igen."</string>
+    <string name="aerr_process">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> avslutades oväntat. Försök igen."</string>
+    <string name="anr_title">"Tyvärr!"</string>
+    <string name="anr_activity_application">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> (i programmet <xliff:g id="APPLICATION">%2$s</xliff:g>) svarar inte."</string>
+    <string name="anr_activity_process">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> (i processen <xliff:g id="PROCESS">%2$s</xliff:g>) svarar inte."</string>
+    <string name="anr_application_process">"Programmet <xliff:g id="APPLICATION">%1$s</xliff:g> (i processen <xliff:g id="PROCESS">%2$s</xliff:g>) svarar inte."</string>
+    <string name="anr_process">"Processen <xliff:g id="PROCESS">%1$s</xliff:g> svarar inte."</string>
+    <string name="force_close">"Tvinga fram en stängning"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Vänta"</string>
+    <string name="debug">"Felsökning"</string>
+    <string name="sendText">"Välj en åtgärd för text"</string>
+    <string name="volume_ringtone">"Ringvolym"</string>
+    <string name="volume_music">"Mediavolym"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Spelar upp genom Bluetooth"</string>
+    <string name="volume_call">"Samtalsvolym"</string>
+    <string name="volume_bluetooth_call">"Samtalsvolym för Bluetooth"</string>
+    <string name="volume_alarm">"Larmvolym"</string>
+    <string name="volume_notification">"Aviseringsvolym"</string>
+    <string name="volume_unknown">"Volym"</string>
+    <string name="ringtone_default">"Standardringsignal"</string>
+    <string name="ringtone_default_with_actual">"Standardringsignal (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Tyst"</string>
+    <string name="ringtone_picker_title">"Ringsignaler"</string>
+    <string name="ringtone_unknown">"Okänd ringsignal"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Wi-Fi-nätverk är tillgängliga"</item>
+    <item quantity="other">"Wi-Fi-nätverk är tillgängliga"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Öppna Wi-Fi-nätverk är tillgängliga"</item>
+    <item quantity="other">"Öppna Wi-Fi-nätverk är tillgängliga"</item>
+  </plurals>
+    <string name="select_character">"Infoga tecken"</string>
+    <string name="sms_control_default_app_name">"Okänt program"</string>
+    <string name="sms_control_title">"Skickar SMS"</string>
+    <string name="sms_control_message">"Flera SMS-meddelanden skickas. Tryck på OK om du vill fortsätta eller på Avbryt om du vill avsluta sändningen."</string>
+    <string name="sms_control_yes">"OK"</string>
+    <string name="sms_control_no">"Avbryt"</string>
+    <string name="date_time_set">"Ställ in"</string>
+    <string name="default_permission_group">"Standardinställning"</string>
+    <string name="no_permissions">"Inga behörigheter krävs"</string>
+    <string name="perms_hide"><b>"Dölj"</b></string>
+    <string name="perms_show_all"><b>"Visa alla"</b></string>
+    <string name="googlewebcontenthelper_loading">"Läser in…"</string>
+    <string name="usb_storage_title">"USB-ansluten"</string>
+    <string name="usb_storage_message">"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">"Montera"</string>
+    <string name="usb_storage_button_unmount">"Montera inte"</string>
+    <string name="usb_storage_error_message">"Det gick inte att använda ditt SD-kort för USB-lagring."</string>
+    <string name="usb_storage_notification_title">"USB-ansluten"</string>
+    <string name="usb_storage_notification_message">"Välj om du vill kopiera filer till/från din dator."</string>
+    <string name="usb_storage_stop_notification_title">"Inaktivera USB-lagring"</string>
+    <string name="usb_storage_stop_notification_message">"Välj om USB-lagring ska inaktiveras."</string>
+    <string name="usb_storage_stop_title">"Inaktivera USB-lagring"</string>
+    <string name="usb_storage_stop_message">"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">"Inaktivera"</string>
+    <string name="usb_storage_stop_button_unmount">"Avbryt"</string>
+    <string name="usb_storage_stop_error_message">"Ett problem uppstod när vi skulle inaktivera USB-lagringsplatsen. Kontrollera att USB-värden har demonterats och försök igen."</string>
+    <string name="extmedia_format_title">"Formatera SD-kort"</string>
+    <string name="extmedia_format_message">"Vill du formatera SD-kortet? Alla data på ditt kort kommer att gå förlorade."</string>
+    <string name="extmedia_format_button_format">"Format"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Välj indatametod"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"kandidater"</u></string>
+    <string name="ext_media_checking_notification_title">"Förbereder SD-kort"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
+    <string name="ext_media_nofs_notification_title">"Tomt SD-kort"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
+    <string name="ext_media_unmountable_notification_title">"Skadat SD-kort"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
+    <string name="ext_media_badremoval_notification_title">"SD-kort togs oväntat bort"</string>
+    <string name="ext_media_badremoval_notification_message">"Demontera SD-kort innan borttagning för att undvika dataförlust."</string>
+    <string name="ext_media_safe_unmount_notification_title">"Säkert att ta bort SD-kort"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"Borttaget SD-kort"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
+    <string name="activity_list_empty">"Inga matchande aktiviteter hittades"</string>
+    <string name="permlab_pkgUsageStats">"uppdatera statistik över användning av komponenter"</string>
+    <string name="permdesc_pkgUsageStats">"Tillåter att samlad komponentstatistik ändras. Används inte av vanliga program."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Peka två gånger för zoomkontroll"</string>
+    <string name="gadget_host_error_inflating">"Fel när widgeten expanderades"</string>
+    <string name="ime_action_go">"Kör"</string>
+    <string name="ime_action_search">"Sök"</string>
+    <string name="ime_action_send">"Skicka"</string>
+    <string name="ime_action_next">"Nästa"</string>
+    <string name="ime_action_done">"Färdig"</string>
+    <string name="ime_action_default">"Utför"</string>
+    <string name="dial_number_using">"Slå nummer "\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"Skapa kontakt"\n"med <xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
+</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
new file mode 100644
index 0000000..ccaa08b
--- /dev/null
+++ b/core/res/res/values-tr/strings.xml
@@ -0,0 +1,765 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="byteShort">"B"</string>
+    <string name="kilobyteShort">"KB"</string>
+    <string name="megabyteShort">"MB"</string>
+    <string name="gigabyteShort">"GB"</string>
+    <string name="terabyteShort">"TB"</string>
+    <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
+    <string name="untitled">"&lt;başlıksız&gt;"</string>
+    <string name="ellipsis">"…"</string>
+    <string name="emptyPhoneNumber">"(Telefon numarası yok)"</string>
+    <string name="unknownName">"(Bilinmiyor)"</string>
+    <string name="defaultVoiceMailAlphaTag">"Sesli Mesaj"</string>
+    <string name="defaultMsisdnAlphaTag">"MSISDN1"</string>
+    <string name="mmiError">"Bağlantı sorunu veya geçersiz MMI kodu."</string>
+    <string name="serviceEnabled">"Hizmet etkindi."</string>
+    <string name="serviceEnabledFor">"Hizmet şunun için etkinleştirildi:"</string>
+    <string name="serviceDisabled">"Hizmet devre dışı bırakıldı."</string>
+    <string name="serviceRegistered">"Kayıt işlemi başarılı oldu."</string>
+    <string name="serviceErased">"Silme işlemi başarılı."</string>
+    <string name="passwordIncorrect">"Yanlış şifre."</string>
+    <string name="mmiComplete">"MMI tamamlandı."</string>
+    <string name="badPin">"Yazdığınız eski PIN doğru değil."</string>
+    <string name="badPuk">"Yazdığınız PUK doğru değil."</string>
+    <string name="mismatchPin">"Girdiğiniz PIN kodları eşleşmiyor."</string>
+    <string name="invalidPin">"4 ila 8 rakamdan oluşan bir PIN girin."</string>
+    <string name="needPuk">"SIM kartınızın PUK kilidi devrede. Kilidi açmak için PUK kodunu yazın."</string>
+    <string name="needPuk2">"Engellenen SIM kartı açmak için PUK2 kodunu yazın."</string>
+    <string name="ClipMmi">"Gelen Çağrı Kimliği"</string>
+    <string name="ClirMmi">"Giden Çağrı Kimliği"</string>
+    <string name="CfMmi">"Çağrı yönlendirme"</string>
+    <string name="CwMmi">"Çağrı bekletme"</string>
+    <string name="BaMmi">"Çağrı engelleme"</string>
+    <string name="PwdMmi">"Şifre değişikliği"</string>
+    <string name="PinMmi">"PIN kodu değişikliği"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"Arayan kimliği varsayılanları kısıtlanmıştır. Sonraki çağrı: Kısıtlanmış"</string>
+    <string name="CLIRDefaultOnNextCallOff">"Arayan kimliği varsayılanları kısıtlanmıştır. Sonraki çağrı: Kısıtlanmamış"</string>
+    <string name="CLIRDefaultOffNextCallOn">"Arayan kimliği varsayılanları kısıtlanmamıştır. Sonraki çağrı: Kısıtlanmış"</string>
+    <string name="CLIRDefaultOffNextCallOff">"Arayan kimliği varsayılanları kısıtlanmamıştır. Sonraki çağrı: Kısıtlanmamış"</string>
+    <string name="serviceNotProvisioned">"Hizmet sağlanamadı."</string>
+    <string name="CLIRPermanent">"Arayan kimliği ayarı değiştirilemez."</string>
+    <string name="RestrictedChangedTitle">"Kısıtlanmış erişim değiştirildi"</string>
+    <string name="RestrictedOnData">"Veri hizmeti engellendi."</string>
+    <string name="RestrictedOnEmergency">"Acil durum hizmeti engellendi."</string>
+    <string name="RestrictedOnNormal">"Ses/SMS hizmeti engellendi."</string>
+    <string name="RestrictedOnAll">"Tüm ses/SMS hizmetleri engellendi."</string>
+    <string name="serviceClassVoice">"Ses"</string>
+    <string name="serviceClassData">"Veri"</string>
+    <string name="serviceClassFAX">"FAKS"</string>
+    <string name="serviceClassSMS">"SMS"</string>
+    <string name="serviceClassDataAsync">"Asenk."</string>
+    <string name="serviceClassDataSync">"Senk."</string>
+    <string name="serviceClassPacket">"Paket"</string>
+    <string name="serviceClassPAD">"PAD"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
+    <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="TIME_DELAY">{2}</xliff:g> saniye sonra <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Yönlendirilmedi"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
+    <string name="httpErrorOk">"Tamam"</string>
+    <string name="httpError">"Web sayfası hata içeriyor."</string>
+    <string name="httpErrorLookup">"URL bulunamadı."</string>
+    <string name="httpErrorUnsupportedAuthScheme">"Site kimlik doğrulaması şeması desteklenmiyor."</string>
+    <string name="httpErrorAuth">"Kimlik doğrulanamadı."</string>
+    <string name="httpErrorProxyAuth">"Proxy sunucusu üzerinden kimlik doğrulanamadı."</string>
+    <string name="httpErrorConnect">"Sunucu ile bağlantı kurulamadı."</string>
+    <string name="httpErrorIO">"Sunucu iletişim kuramadı. Daha sonra yeniden deneyin."</string>
+    <string name="httpErrorTimeout">"Sunucuya bağlanma işlemi zaman aşımına uğradı."</string>
+    <string name="httpErrorRedirectLoop">"Sayfada çok fazla sunucu yeniden yönlendirmesi bulunuyor."</string>
+    <string name="httpErrorUnsupportedScheme">"Protokol desteklenmiyor."</string>
+    <string name="httpErrorFailedSslHandshake">"Güvenli bir bağlantı kurulamadı."</string>
+    <string name="httpErrorBadUrl">"URL geçersiz olduğundan sayfa açılamadı."</string>
+    <string name="httpErrorFile">"Dosyaya erişilemedi."</string>
+    <string name="httpErrorFileNotFound">"İstenen dosya bulunamadı."</string>
+    <string name="httpErrorTooManyRequests">"Çok fazla sayıda istek işleniyor. Daha sonra yeniden deneyin."</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
+    <string name="contentServiceSync">"Senk."</string>
+    <string name="contentServiceSyncNotificationTitle">"Senk."</string>
+    <string name="contentServiceTooManyDeletesNotificationDesc">"Çok fazla <xliff:g id="CONTENT_TYPE">%s</xliff:g> silme var."</string>
+    <string name="low_memory">"Telefonun depolama alanı doldu! Yer açmak için bazı dosyaları silin."</string>
+    <string name="me">"Ben"</string>
+    <string name="power_dialog">"Telefon seçenekleri"</string>
+    <string name="silent_mode">"Sessiz mod"</string>
+    <string name="turn_on_radio">"Kablosuzu aç"</string>
+    <string name="turn_off_radio">"Kablosuzu kapat"</string>
+    <string name="screen_lock">"Ekran kilidi"</string>
+    <string name="power_off">"Kapat"</string>
+    <string name="shutdown_progress">"Kapanıyor…"</string>
+    <string name="shutdown_confirm">"Telefonunuz kapanacak."</string>
+    <string name="no_recent_tasks">"Hiçbir yeni uygulama yok."</string>
+    <string name="global_actions">"Telefon seçenekleri"</string>
+    <string name="global_action_lock">"Ekran kilidi"</string>
+    <string name="global_action_power_off">"Kapat"</string>
+    <string name="global_action_toggle_silent_mode">"Sessiz mod"</string>
+    <string name="global_action_silent_mode_on_status">"Ses KAPALI"</string>
+    <string name="global_action_silent_mode_off_status">"Ses AÇIK"</string>
+    <string name="global_actions_toggle_airplane_mode">"Uçak modu"</string>
+    <string name="global_actions_airplane_mode_on_status">"Uçak modu AÇIK"</string>
+    <string name="global_actions_airplane_mode_off_status">"Uçak modu KAPALI"</string>
+    <string name="safeMode">"Güvenli mod"</string>
+    <string name="android_system_label">"Android Sistemi"</string>
+    <string name="permgrouplab_costMoney">"Size maliyet getiren hizmetler"</string>
+    <string name="permgroupdesc_costMoney">"Uygulamaların size maliyet getirebilecek işlemler yapmasına izin verir."</string>
+    <string name="permgrouplab_messages">"Mesajlarınız"</string>
+    <string name="permgroupdesc_messages">"SMS mesajlarınızı, e-postanızı ve diğer mesajlarınızı okuyup yazın."</string>
+    <string name="permgrouplab_personalInfo">"Kişisel bilgileriniz"</string>
+    <string name="permgroupdesc_personalInfo">"Telefonunuzda depolanan kişilere ve takvime doğrudan erişim."</string>
+    <string name="permgrouplab_location">"Konumunuz"</string>
+    <string name="permgroupdesc_location">"Fiziksel konumunuzu izleyin"</string>
+    <string name="permgrouplab_network">"Ağ iletişimi"</string>
+    <string name="permgroupdesc_network">"Uygulamaların çeşitli ağ özelliklerine erişmesine izin verir."</string>
+    <string name="permgrouplab_accounts">"Google hesaplarınız"</string>
+    <string name="permgroupdesc_accounts">"Kullanılabilir Google hesaplarına erişin."</string>
+    <string name="permgrouplab_hardwareControls">"Donanım denetimleri"</string>
+    <string name="permgroupdesc_hardwareControls">"Telefon donanımına doğrudan erişim."</string>
+    <string name="permgrouplab_phoneCalls">"Telefon çağrıları"</string>
+    <string name="permgroupdesc_phoneCalls">"Telefon görüşmelerini izleyin, kaydedin ve işleyin."</string>
+    <string name="permgrouplab_systemTools">"Sistem araçları"</string>
+    <string name="permgroupdesc_systemTools">"Sisteme alt düzey erişim ve denetimi."</string>
+    <string name="permgrouplab_developmentTools">"Geliştirme araçları"</string>
+    <string name="permgroupdesc_developmentTools">"Yalnızca uygulama geliştiriciler için gerekli özellikler."</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"durum çubuğunu devre dışı bırak veya değiştir"</string>
+    <string name="permdesc_statusBar">"Uygulamanın durum çubuğunu devre dışı bırakmasına veya sistem simgeleri ekleyip kaldırmasına izin verir."</string>
+    <string name="permlab_expandStatusBar">"durum çubuğunu genişlet/daralt"</string>
+    <string name="permdesc_expandStatusBar">"Uygulamanın, durum çubuğunu genişletip daraltmasına izin verir."</string>
+    <string name="permlab_processOutgoingCalls">"giden aramalarda araya gir"</string>
+    <string name="permdesc_processOutgoingCalls">"Uygulamanın, giden çağrıları işlemesine ve aranacak numarayı değiştirmesine izin verir. Kötü amaçlı uygulamalar giden çağrıları izleyebilir, yönlendirebilir veya engelleyebilir."</string>
+    <string name="permlab_receiveSms">"SMS al"</string>
+    <string name="permdesc_receiveSms">"Uygulamanın SMS mesajları alıp işlemesine izin verir. Kötü amaçlı uygulamalar mesajlarınızı izleyebilir veya bunları size göstermeden silebilir."</string>
+    <string name="permlab_receiveMms">"MMS al"</string>
+    <string name="permdesc_receiveMms">"Uygulamanın MMS mesajları almasına ve işlemesine izin verir. Kötü amaçlı uygulamalar mesajlarınızı izleyebilir veya size göstermeden silebilir."</string>
+    <string name="permlab_sendSms">"SMS mesajları gönder"</string>
+    <string name="permdesc_sendSms">"Uygulamaların SMS mesajları göndermesine izin verir. Kötü amaçlı uygulamalar, onayınızı almadan mesaj göndererek size maliyet çıkarabilir."</string>
+    <string name="permlab_readSms">"SMS veya MMS oku"</string>
+    <string name="permdesc_readSms">"Uygulamaların, telefonunuzda veya SIM kartta depolanan SMS mesajlarını okumasına izin verir. Kötü amaçlı uygulamalar gizli mesajlarınızı okuyabilir."</string>
+    <string name="permlab_writeSms">"SMS veya MMS düzenle"</string>
+    <string name="permdesc_writeSms">"Uygulamanın telefonunuzda veya SIM kartta depolanan SMS mesajlarına yazmasına izin verir. Kötü amaçlı uygulamalar mesajlarınızı silebilir."</string>
+    <string name="permlab_receiveWapPush">"WAP al"</string>
+    <string name="permdesc_receiveWapPush">"Uygulamanın WAP mesajları alıp işlemesine izin verir. Kötü amaçlı uygulamalar mesajlarınızı izleyebilir veya bunları size göstermeden silebilir."</string>
+    <string name="permlab_getTasks">"çalışan uygulamaları al"</string>
+    <string name="permdesc_getTasks">"Uygulamaların şu anda ve yakın geçmişte çalışmakta olan işlemler hakkında bilgi almasına izin verir. Kötü amaçlı uygulamaların diğer uygulamalar ile ilgili gizli bilgileri keşfetmesine izin verebilir."</string>
+    <string name="permlab_reorderTasks">"çalışan uygulamaları yeniden sırala"</string>
+    <string name="permdesc_reorderTasks">"Uygulamaların görevleri ön plana ve arka plana taşımasına izin verir. Kötü amaçlı uygulamalar kendilerini sizin denetiminiz dışında zorla ön plana çıkarabilir."</string>
+    <string name="permlab_setDebugApp">"uygulama hata ayıklamayı etkinleştir"</string>
+    <string name="permdesc_setDebugApp">"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">"kullanıcı arayüzü ayarlarınızı değiştirin"</string>
+    <string name="permdesc_changeConfiguration">"Uygulamaların güncel yapılandırmayı; örneğin yerel ayarı veya genel yazı tipi boyutunu değiştirmesine izin verir."</string>
+    <string name="permlab_restartPackages">"diğer uygulamaları yeniden başlat"</string>
+    <string name="permdesc_restartPackages">"Uygulamaların başka uygulamaları zorla yeniden başlatmasına izin verir."</string>
+    <string name="permlab_forceBack">"uygulamayı kapanmaya zorla"</string>
+    <string name="permdesc_forceBack">"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">"sistemin dahili durumunu al"</string>
+    <string name="permdesc_dump">"Uygulamanın dahili sistem durumunu almasına izin verir. Kötü amaçlı uygulamalar, normalde gerekli olmaması gereken çok çeşitli özel ve koruma altındaki bilgiyi alabilir."</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"tüm uygulama başlatma işlemlerini izle ve denetle"</string>
+    <string name="permdesc_runSetActivityWatcher">"Uygulamaların, sistemin etkinlikleri nasıl başlattığını izlemesine ve denetlemesine izin verir. Kötü amaçlı uygulamalar sistemin güvenliğini tamamen tehlikeye atabilir. Bu izin yalnızca program geliştirme amacıyla gereklidir, normal telefon kullanımı için gerekli değildir."</string>
+    <string name="permlab_broadcastPackageRemoved">"paket ile kaldırılan yayını gönder"</string>
+    <string name="permdesc_broadcastPackageRemoved">"Uygulamaların bir uygulama paketinin kaldırıldığında dair bir bildirim yayınlamasına izin verir. Kötü amaçlı uygulamalar bunu çalışan diğer herhangi bir uygulamayı kapatmak için kullanabilir."</string>
+    <string name="permlab_broadcastSmsReceived">"SMS ile alınan yayın gönder"</string>
+    <string name="permdesc_broadcastSmsReceived">"Uygulamaların bir SMS mesajı alındığında dair bir bildirim yayınlamasına izin verir. Kötü amaçlı uygulamalar bu işlevi telefona sahte SMS mesajları göndermek için kullanabilir."</string>
+    <string name="permlab_broadcastWapPush">"WAP-PUSH ile alınan yayın gönder"</string>
+    <string name="permdesc_broadcastWapPush">"Uygulamaların, WAP PUSH mesajının alındığına dair bildirim yayınlamasına izin verir. Kötü amaçlı uygulamalar bu işlevi, sahte MMS alındıları göndermek veya bir web sayfasını sessizce kötü amaçla tasarlanmış başkaları ile değiştirmek için kullanabilir."</string>
+    <string name="permlab_setProcessLimit">"çalışan işlem sayısını sınırla"</string>
+    <string name="permdesc_setProcessLimit">"Uygulamaların, çalışacak maksimum işlem sayısını denetlemesine izin verir. Normal uygulamalar için hiçbir zaman gerekmez."</string>
+    <string name="permlab_setAlwaysFinish">"tüm arka plan uygulamaları kapat"</string>
+    <string name="permdesc_setAlwaysFinish">"Uygulamaların, etkinliklerin arka planda daima tamamlanıp tamamlanmadığını denetlemesine izin verir. Normal uygulamalar için hiçbir zaman gerekli değildir."</string>
+    <string name="permlab_batteryStats">"pil istatistiklerini değiştir"</string>
+    <string name="permdesc_batteryStats">"Toplanan pil istatistiklerinin değiştirilmesine izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
+    <string name="permlab_internalSystemWindow">"yetkisiz pencereleri görüntüle"</string>
+    <string name="permdesc_internalSystemWindow">"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">"sistem düzeyi uyarıları görüntüle"</string>
+    <string name="permdesc_systemAlertWindow">"Uygulamaların sistem uyarı pencereleri göstermesine izin verir. Kötü amaçlı uygulamalar telefonun tüm ekranını işgal edebilir."</string>
+    <string name="permlab_setAnimationScale">"genel animasyon hızını değiştir"</string>
+    <string name="permdesc_setAnimationScale">"Uygulamaların, istedikleri zaman genel animasyon hızını değiştirmesine (animasyonları hızlandırmasına veya yavaşlatmasına) izin verir."</string>
+    <string name="permlab_manageAppTokens">"uygulama simgelerini yönet"</string>
+    <string name="permdesc_manageAppTokens">"Uygulamaların, kendi normal Z sıralamalarını atlayarak kendi simgelerini oluşturup yönetmelerine izin verir. Normal uygulamalar için hiçbir zaman gerekli olmamalıdır."</string>
+    <string name="permlab_injectEvents">"tuşlara bas ve düğmeleri denetle"</string>
+    <string name="permdesc_injectEvents">"Uygulamaların kendi giriş işlemlerini (tuşa basma vb.) başka uygulamalara göndermesine izin verir. Kötü amaçlı uygulamalar bunu telefonun denetimini ele geçirmek için kullanabilir."</string>
+    <string name="permlab_readInputState">"yazdıklarınızı ve yaptığınız işlemleri kaydedin"</string>
+    <string name="permdesc_readInputState">"Uygulamaların, başka bir uygulama ile etkileşim halindeyken (örneğin bir şifre girerken) bile bastığınız tuşları izlemesine izin verir. Normal uygulamalarda hiçbir zaman gerek duyulmamalıdır."</string>
+    <string name="permlab_bindInputMethod">"bir giriş yöntemine bağla"</string>
+    <string name="permdesc_bindInputMethod">"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_setOrientation">"ekran yönünü değiştir"</string>
+    <string name="permdesc_setOrientation">"Uygulamaların ekran yönünü istedikleri zaman değiştirmesine izin verir. Normal uygulamalarda hiçbir zaman gerekmemelidir."</string>
+    <string name="permlab_signalPersistentProcesses">"uygulamalara Linux sinyalleri gönder"</string>
+    <string name="permdesc_signalPersistentProcesses">"Uygulamaların, sağlanan sinyalin tüm kalıcı işlemlere gönderilmesini istemesine izin verir."</string>
+    <string name="permlab_persistentActivity">"uygulamayı her zaman çalıştır"</string>
+    <string name="permdesc_persistentActivity">"Uygulamaların, sistemin başka uygulamalarda kullanamaması için kendi parçalarını kalıcı kılmasına izin verir."</string>
+    <string name="permlab_deletePackages">"uygulamaları sil"</string>
+    <string name="permdesc_deletePackages">"Uygulamaların Android paketlerini silmesine izin verir. Kötü amaçlı uygulamalar bu işlevi önemli uygulamaları silmek için kullanabilir."</string>
+    <string name="permlab_clearAppUserData">"diğer uygulamaların verilerini sil"</string>
+    <string name="permdesc_clearAppUserData">"Uygulamaların kullanıcı verilerini temizlemesine izin verir."</string>
+    <string name="permlab_deleteCacheFiles">"diğer uygulamaların önbelleklerini sil"</string>
+    <string name="permdesc_deleteCacheFiles">"Uygulamaların önbellek dosyalarını silmesine izin verir."</string>
+    <string name="permlab_getPackageSize">"uygulama depolama alanını ölç"</string>
+    <string name="permdesc_getPackageSize">"Uygulamanın kodunu, verilerini ve önbellek boyutunu almasına izin verir"</string>
+    <string name="permlab_installPackages">"doğrudan uygulama yükle"</string>
+    <string name="permdesc_installPackages">"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">"tüm uygulama önbelleği verilerini sil"</string>
+    <string name="permdesc_clearAppCache">"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>
+    <string name="permlab_readLogs">"sistem günlük dosyalarını oku"</string>
+    <string name="permdesc_readLogs">"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">"sahibi tanılama olan kaynakları oku/bunlara yaz"</string>
+    <string name="permdesc_diagnostic">"Uygulamanın tanılama grubundaki bir kaynağa ait herhangi bir kaynağı; örneğin /dev içindeki dosyaları okumasına ve bunlara yazmasına izin verir. Bu işlevin sistem kararlılığını ve güvenliğini olumsuz etkileme olasılığı vardır. Üretici veya operatör tarafından YALNIZCA donanıma özgü tanılama için kullanılmalıdır."</string>
+    <string name="permlab_changeComponentState">"uygulama bileşenlerini etkinleştir veya devre dışı bırak"</string>
+    <string name="permdesc_changeComponentState">"Uygulamaların başka bir uygulamanın bir bileşenini etkinleştirme ayarını değiştirmesine izin verir. Kötü amaçlı uygulamalar bu ayarı telefonun önemli yeteneklerini devre dışı bırakmak için kullanabilir. Bu iznin verilmesi uygulama bileşenlerini kullanılamaz, tutarsız veya kararsız bir duruma sokabileceği için izin verilirken dikkatli olunmalıdır."</string>
+    <string name="permlab_setPreferredApplications">"tercih edilen uygulamaları ayarla"</string>
+    <string name="permdesc_setPreferredApplications">"Uygulamanın tercih ettiğiniz uygulamaları değiştirmesine izin verir. Bu işlem, kötü amaçlı uygulamaların, çalışmakta olan uygulamaları sessizce değiştirerek mevcut uygulamalarınızı aldatıp kişisel bilgilerinizi almasına izin verebilir."</string>
+    <string name="permlab_writeSettings">"genel sistem ayarlarını değiştir"</string>
+    <string name="permdesc_writeSettings">"Uygulamaların sistem ayar verilerini değiştirmesine izin verir. Kötü amaçlı uygulamalar sisteminizin yapılandırmasını bozabilir."</string>
+    <string name="permlab_writeSecureSettings">"güvenli sistem ayarlarını değiştir"</string>
+    <string name="permdesc_writeSecureSettings">"Uygulamaların sistemin güvenlik ayarları verilerini değiştirmesine izin verir. Normal uygulamalarda kullanılmaz."</string>
+    <string name="permlab_writeGservices">"Google hizmetler haritasını değiştir"</string>
+    <string name="permdesc_writeGservices">"Uygulamanın, Google hizmetleri haritasını değiştirmesine izin verir. Normal uygulamalarda kullanılmaz."</string>
+    <string name="permlab_receiveBootCompleted">"açılışta otomatik başlat"</string>
+    <string name="permdesc_receiveBootCompleted">"Uygulamaların, sistem açıldıktan hemen sonra kendini başlatmasına izin verir. Bu işlev, telefonu başlatma süresini uzatabilir ve uygulama, sürekli çalışması nedeniyle telefonun çalışmasını genel olarak yavaşlatabilir."</string>
+    <string name="permlab_broadcastSticky">"sabit yayın gönder"</string>
+    <string name="permdesc_broadcastSticky">"Uygulamaların yayın bittikten sonra da kalan sabit yayınlar göndermesine izin verir. Kötü amaçlı uygulamalar telefonun aşırı miktarda bellek kullanmasına neden olarak telefonu yavaşlatabilir veya telefonun kararsız hale gelmesine neden olabilir."</string>
+    <string name="permlab_readContacts">"kişi verilerini oku"</string>
+    <string name="permdesc_readContacts">"Uygulamaların telefonunuzda depolanan tüm kişi (adres) verilerini okumasına izin verir. Kötü amaçlı uygulamalar bu işlevi verilerinizi başkalarına göndermek için kullanabilir."</string>
+    <string name="permlab_writeContacts">"kişi verileri yaz"</string>
+    <string name="permdesc_writeContacts">"Uygulamaların telefonunuzda depolanan kişi (adres) verilerini değiştirmesine izin verir. Kötü amaçlı uygulamalar bu işlevi kişi verilerinizi silmek veya değiştirmek için kullanabilir."</string>
+    <string name="permlab_writeOwnerData">"sahip verilerini yaz"</string>
+    <string name="permdesc_writeOwnerData">"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">"sahip verilerini oku"</string>
+    <string name="permdesc_readOwnerData">"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">"takvim verilerini oku"</string>
+    <string name="permdesc_readCalendar">"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">"takvim verilerini yaz"</string>
+    <string name="permdesc_writeCalendar">"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>
+    <string name="permlab_accessMockLocation">"test için sahte konum kaynakları"</string>
+    <string name="permdesc_accessMockLocation">"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">"ek konum sağlayıcı komutlarına eriş"</string>
+    <string name="permdesc_accessLocationExtraCommands">"Ek konum sağlayıcı komutlarına erişin. Kötü amaçlı uygulamalar bu işlevi GPS veya diğer konum kaynaklarının işleyişine müdahale etmek için kullanabilir."</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"iyi (GPS) konum"</string>
+    <string name="permdesc_accessFineLocation">"Bulunduğu yerlerde telefondan Küresel Konumlandırma Sistemi gibi hassas konum bulma kaynaklarına erişin. Kötü amaçlı uygulamalar bu işlevi bulunduğunuz yeri belirlemek için kullanabilir ve ek pil gücü tüketebilir."</string>
+    <string name="permlab_accessCoarseLocation">"kesinliksiz (ağ tabanlı) konum"</string>
+    <string name="permdesc_accessCoarseLocation">"Telefonun yaklaşık yerini belirlemek için bulunduğu yerlerde hücresel ağ veritabanı gibi tahmini konum kaynaklarına erişir. Kötü amaçlı uygulamalar, bu işlevi bulunduğunuz yeri yaklaşık olarak belirlemek için kullanabilir."</string>
+    <string name="permlab_accessSurfaceFlinger">"SurfaceFlinger\'a eriş"</string>
+    <string name="permdesc_accessSurfaceFlinger">"Uygulamanın SurfaceFlinger alt düzey özelliklerini kullanmasına izin verir."</string>
+    <string name="permlab_readFrameBuffer">"çerçeve arabelleğini oku"</string>
+    <string name="permdesc_readFrameBuffer">"Kullanılacak uygulamanın çerçeve arabelleğinin içeriğini okumasına izin verir."</string>
+    <string name="permlab_modifyAudioSettings">"ses ayarlarınızı değiştirin"</string>
+    <string name="permdesc_modifyAudioSettings">"Uygulamaların, ses düzeyi ve yönlendirme gibi genel ses ayarlarını değiştirmesine izin verir."</string>
+    <string name="permlab_recordAudio">"ses kaydet"</string>
+    <string name="permdesc_recordAudio">"Uygulamanın, ses kayıt yoluna erişmesine izin verir."</string>
+    <string name="permlab_camera">"resim çek"</string>
+    <string name="permdesc_camera">"Uygulamaların kamera ile resim çekmesine izin verir. Bu işlev herhangi bir zamanda kameranın görmekte olduğu görüntüyü uygulamaların toplamasına izin verir."</string>
+    <string name="permlab_brick">"telefonu tamamen devre dışı bırak"</string>
+    <string name="permdesc_brick">"Uygulamaların tüm telefonu kalıcı olarak devre dışı bırakmasına izin verir. Bu çok tehlikelidir."</string>
+    <string name="permlab_reboot">"telefonu yeniden başlamaya zorla"</string>
+    <string name="permdesc_reboot">"Uygulamanın telefonu yeniden açılmaya zorlamasına izin verir."</string>
+    <string name="permlab_mount_unmount_filesystems">"dosya sistemlerini bağlama ve bağlantısını kesme"</string>
+    <string name="permdesc_mount_unmount_filesystems">"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">"harici depolama birimini biçimlendir"</string>
+    <string name="permdesc_mount_format_filesystems">"Uygulamanın çıkarılabilir depolama birimini biçimlendirmesine izin verir."</string>
+    <string name="permlab_vibrate">"titreşimi denetle"</string>
+    <string name="permdesc_vibrate">"Uygulamanın titreşimi denetlemesine izin verir."</string>
+    <string name="permlab_flashlight">"flaşı denetle"</string>
+    <string name="permdesc_flashlight">"Uygulamaların flaş ışığını denetlemesine izin verir."</string>
+    <string name="permlab_hardware_test">"donanımı test et"</string>
+    <string name="permdesc_hardware_test">"Uygulamanın donanım testi için çeşitli çevre birimlerini denetlemesine izin verir."</string>
+    <string name="permlab_callPhone">"telefon numaralarını doğrudan ara"</string>
+    <string name="permdesc_callPhone">"Uygulamanın müdahaleniz olmadan telefon numaralarını aramasına izin verir. Kötü amaçlı uygulamalar, telefon faturanızda beklenmedik görüşmeler çıkmasına neden olabilir. Bu işlev, uygulamanın acil numara aramasına izin vermez."</string>
+    <string name="permlab_callPrivileged">"herhangi bir telefon numarasını doğrudan ara"</string>
+    <string name="permdesc_callPrivileged">"Uygulamanın, siz müdahale etmeden acil numaralar dahil herhangi bir numarayı aramasına izin verir. Kötü amaçlı uygulamalar acil servisleri gereksiz yere ve yasal olmayan şekilde arayabilir."</string>
+    <string name="permlab_locationUpdates">"konum güncelleme bildirimlerini denetle"</string>
+    <string name="permdesc_locationUpdates">"Radyo ile alınan konum güncelleme bildirimlerini etkinleştirmeye/devreden çıkarmaya izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
+    <string name="permlab_checkinProperties">"erişim giriş özellikleri"</string>
+    <string name="permdesc_checkinProperties">"Kayıt hizmeti tarafından karşıya yüklenen özelliklere okuma/yazma erişimi verir. Normal uygulamalarda kullanılmamalıdır."</string>
+    <string name="permlab_bindGadget">"widget seç"</string>
+    <string name="permdesc_bindGadget">"Uygulamaların sisteme hangi uygulamalar tarafından hangi widget\'ların kullanılabileceğini söylemesine izin verir. Bu izin sayesinde uygulamalar, başka uygulamalara kişisel verilere erişim verebilir. Normal uygulamalarda kullanılmaz."</string>
+    <string name="permlab_modifyPhoneState">"telefon durumunu değiştir"</string>
+    <string name="permdesc_modifyPhoneState">"Uygulamaların cihazın telefon özelliklerini kullanmasına izin verir. Bu izne sahip bir uygulama, size bildirmeden ağ değiştirebilir ve telefon radyosunu kapatıp açabilir."</string>
+    <string name="permlab_readPhoneState">"telefon durumunu oku"</string>
+    <string name="permdesc_readPhoneState">"Uygulamaların cihazın telefon özelliklerine erişmesine izin verir. Bu izne sahip bir uygulama telefonun telefon numarasını, o anda bir çağrı sürmekte olup olmadığını, çağrının bağlanmış olduğu numarayı ve benzerini belirleyebilir."</string>
+    <string name="permlab_wakeLock">"telefonunun uykuya geçmesini önle"</string>
+    <string name="permdesc_wakeLock">"Uygulamaların telefonun uykuya geçmesini önlemesine izin verir."</string>
+    <string name="permlab_devicePower">"telefonu aç veya kapat"</string>
+    <string name="permdesc_devicePower">"Uygulamaların telefonunuzu açmasına veya kapatmasına izin verir."</string>
+    <string name="permlab_factoryTest">"fabrika test modunda çalıştır"</string>
+    <string name="permdesc_factoryTest">"Telefon donanımına tam erişim veren alt düzey bir üretici testi olarak çalıştırılır. Yalnızca telefon üretici test modunda çalışırken kullanılabilir."</string>
+    <string name="permlab_setWallpaper">"duvar kağıdını ayarla"</string>
+    <string name="permdesc_setWallpaper">"Uygulamanın sistem duvar kağıdını ayarlamasına izin verir."</string>
+    <string name="permlab_setWallpaperHints">"duvar kağıdı boyutu ipuçlarını ayarla"</string>
+    <string name="permdesc_setWallpaperHints">"Uygulamanın sistem duvar kağıdı boyutu ipuçlarını ayarlamasına izin verir."</string>
+    <string name="permlab_masterClear">"sistemi fabrika değerlerine sıfırla"</string>
+    <string name="permdesc_masterClear">"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_setTimeZone">"saat dilimini ayarla"</string>
+    <string name="permdesc_setTimeZone">"Uygulamaların telefonun saat dilimini değiştirmesine izin verir."</string>
+    <string name="permlab_getAccounts">"bilinen hesapları keşfet"</string>
+    <string name="permdesc_getAccounts">"Uygulamaların telefonda bilinen hesapların listesini almasına izin verir."</string>
+    <string name="permlab_accessNetworkState">"ağ durumunu görüntüle"</string>
+    <string name="permdesc_accessNetworkState">"Uygulamaların, tüm ağların durumunu görmesine izin verir."</string>
+    <string name="permlab_createNetworkSockets">"tam İnternet erişimi"</string>
+    <string name="permdesc_createNetworkSockets">"Uygulamaların ağ yuvaları oluşturmasına izin verir."</string>
+    <string name="permlab_writeApnSettings">"Erişim Noktası Adı ayarlarını yaz"</string>
+    <string name="permdesc_writeApnSettings">"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">"ağ bağlantısını değiştir"</string>
+    <string name="permdesc_changeNetworkState">"Uygulamaların ağ bağlantı durumunu değiştirmesine izin verir."</string>
+    <string name="permlab_changeBackgroundDataSetting">"arka plan veri kullanımı ayarını değiştir"</string>
+    <string name="permdesc_changeBackgroundDataSetting">"Uygulamaların arka plan veri kullanımı ayarını değiştirmesine izin verir."</string>
+    <string name="permlab_accessWifiState">"Kablosuz durumunu görüntüle"</string>
+    <string name="permdesc_accessWifiState">"Uygulamaların, kablosuz bağlantının durumu ile ilgili bilgileri görüntülemesine izin verir."</string>
+    <string name="permlab_changeWifiState">"Kablosuz durumunu değiştir"</string>
+    <string name="permdesc_changeWifiState">"Uygulamaların kablosuz erişim noktalarına bağlanıp bunlarla bağlantısını kesmesine ve yapılandırılmış kablosuz ağlarda değişiklikler yapmasına izin verir."</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
+    <string name="permlab_bluetoothAdmin">"bluetooth yönetimi"</string>
+    <string name="permdesc_bluetoothAdmin">"Uygulamaların yerel Bluetooth telefonunu yapılandırmasına ve uzak cihazları keşfedip bunlar ile eşleşmesine izin verir."</string>
+    <string name="permlab_bluetooth">"Bluetooth bağlantıları oluştur"</string>
+    <string name="permdesc_bluetooth">"Uygulamaların yerel Bluetooth telefonunun yapılandırmasını görüntülemesine ve eşleşilmiş cihazlar ile bağlantı kurup kabul etmesine izin verir."</string>
+    <string name="permlab_disableKeyguard">"tuş kilidini devre dışı bırak"</string>
+    <string name="permdesc_disableKeyguard">"Uygulamaların tuş kilidini ve ilgili şifreli güvenlik önlemini devre dışı bırakmasına izin verir. Bunun geçerli bir örneği gelen bir çağrı alındığında tuş kilidinin devre dışı bırakılması, sonra çağrı bittiğinde kilidin yeniden devreye sokulmasıdır."</string>
+    <string name="permlab_readSyncSettings">"senk. ayarlarını oku"</string>
+    <string name="permdesc_readSyncSettings">"Uygulamanın, senkronizasyon işlevinin Kişiler için devrede olup olmadığı gibi senkronizasyon ayarlarını okumasına izin verir."</string>
+    <string name="permlab_writeSyncSettings">"senk. ayarlarını yaz"</string>
+    <string name="permdesc_writeSyncSettings">"Uygulamanın, senkronizasyon işlevinin Kişiler için devrede olup olmadığı gibi senkronizasyon ayarlarını değiştirmesine izin verir."</string>
+    <string name="permlab_readSyncStats">"senk. istatistiklerini oku"</string>
+    <string name="permdesc_readSyncStats">"Uygulamaların senk. istatistiklerini; örn. geçmişte yapılmış senkronizasyonları okumasına izin verir."</string>
+    <string name="permlab_subscribedFeedsRead">"abone olunan yayınları oku"</string>
+    <string name="permdesc_subscribedFeedsRead">"Uygulamaların, o anda senkronize olan yayınlar ile ilgili bilgi almasına izin verir."</string>
+    <string name="permlab_subscribedFeedsWrite">"abone olunan yayınları yaz"</string>
+    <string name="permdesc_subscribedFeedsWrite">"Uygulamaların senkronize edilmiş yayınlarınızı değiştirmesine izin verir. Bu ayar, kötü amaçlı bir uygulamanın senkronize edilmiş yayınlarınızı değiştirmesine izin verebilir."</string>
+    <string name="permlab_readDictionary">"kullanıcı tanımlı sözlüğü oku"</string>
+    <string name="permdesc_readDictionary">"Kullanıcının kullanıcı sözlüğünde depolamış olabileceği kişisel kelimeleri, adları ve kelime öbeklerini uygulamaların okumasına izin verir."</string>
+    <string name="permlab_writeDictionary">"kullanıcı tanımlı sözlüğe yaz"</string>
+    <string name="permdesc_writeDictionary">"Uygulamaların kullanıcı sözlüğüne yeni kelimeler yazmasına izin verir."</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
+  <string-array name="phoneTypes">
+    <item>"Ev"</item>
+    <item>"Mobil"</item>
+    <item>"İş"</item>
+    <item>"İş Faks"</item>
+    <item>"Ev Faks"</item>
+    <item>"Çağrı cihazı"</item>
+    <item>"Diğer"</item>
+    <item>"Özel"</item>
+  </string-array>
+  <string-array name="emailAddressTypes">
+    <item>"Ev"</item>
+    <item>"İş"</item>
+    <item>"Diğer"</item>
+    <item>"Özel"</item>
+  </string-array>
+    <string name="mobileEmailTypeName">"Mobil"</string>
+  <string-array name="postalAddressTypes">
+    <item>"Ev"</item>
+    <item>"İş"</item>
+    <item>"Diğer"</item>
+    <item>"Özel"</item>
+  </string-array>
+  <string-array name="imAddressTypes">
+    <item>"Ev"</item>
+    <item>"İş"</item>
+    <item>"Diğer"</item>
+    <item>"Özel"</item>
+  </string-array>
+  <string-array name="organizationTypes">
+    <item>"İş"</item>
+    <item>"Diğer"</item>
+    <item>"Özel"</item>
+  </string-array>
+  <string-array name="imProtocols">
+    <item>"AIM"</item>
+    <item>"Windows Live"</item>
+    <item>"Yahoo"</item>
+    <item>"Skype"</item>
+    <item>"QQ"</item>
+    <item>"Google Talk"</item>
+    <item>"ICQ"</item>
+    <item>"Jabber"</item>
+  </string-array>
+    <string name="keyguard_password_enter_pin_code">"PIN kodunu gir"</string>
+    <string name="keyguard_password_wrong_pin_code">"Yanlış PIN kodu!"</string>
+    <string name="keyguard_label_text">"Kilidi açmak için önce Menü\'ye, sonra 0\'a basın."</string>
+    <string name="emergency_call_dialog_number_for_display">"Acil durum numarası"</string>
+    <string name="lockscreen_carrier_default">"(Hizmet yok)"</string>
+    <string name="lockscreen_screen_locked">"Ekran kilitli."</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"Kilidi açmak veya acil çağrı yapmak için Menü\'ye basın."</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"Kilidi açmak için Menü\'ye basın."</string>
+    <string name="lockscreen_pattern_instructions">"Kilit açmak için deseni çizin"</string>
+    <string name="lockscreen_emergency_call">"Acil durum çağrısı"</string>
+    <string name="lockscreen_pattern_correct">"Doğru!"</string>
+    <string name="lockscreen_pattern_wrong">"Üzgünüz, lütfen yeniden deneyin"</string>
+    <string name="lockscreen_plugged_in">"Şarj oluyor (<xliff:g id="PERCENT">%%</xliff:g><xliff:g id="NUMBER">%d</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
+    <string name="lockscreen_low_battery">"Şarj cihazınızı bağlayın."</string>
+    <string name="lockscreen_missing_sim_message_short">"SIM kart yok."</string>
+    <string name="lockscreen_missing_sim_message">"Telefonda SIM kart yok."</string>
+    <string name="lockscreen_missing_sim_instructions">"Lütfen SIM kart takın."</string>
+    <string name="lockscreen_network_locked_message">"Ağ kilitli"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM kart PUK kilidi devrede."</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"Lütfen Kullanıcı Rehberi\'ne bakın veya Müşteri Hizmetleri\'ne başvurun."</string>
+    <string name="lockscreen_sim_locked_message">"SIM kart kilitli."</string>
+    <string name="lockscreen_sim_unlock_progress_dialog_message">"SIM kart kilidi açılıyor…"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. "\n\n"Lütfen <xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde yeniden deneyin."</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra telefonunuzu Google oturum açma bilgilerinizi kullanarak açmanız istenir."\n\n" Lütfen <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde yeniden deneyin."</string>
+    <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g> saniye içinde yeniden deneyin."</string>
+    <string name="lockscreen_forgot_pattern_button_text">"Deseni unuttunuz mu?"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"Çok fazla sayıda desen denemesi yapıldı!"</string>
+    <string name="lockscreen_glogin_instructions">"Kilidi açmak için Google hesabınızla oturum açın"</string>
+    <string name="lockscreen_glogin_username_hint">"Kullanıcı adı (e-posta)"</string>
+    <string name="lockscreen_glogin_password_hint">"Şifre"</string>
+    <string name="lockscreen_glogin_submit_button">"Oturum aç"</string>
+    <string name="lockscreen_glogin_invalid_input">"Geçersiz kullanıcı adı veya şifre."</string>
+    <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%P</xliff:g>"</string>
+    <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g> <xliff:g id="AMPM">%p</xliff:g>"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
+    <string name="status_bar_no_notifications_title">"Bildirim yok"</string>
+    <string name="status_bar_ongoing_events_title">"Sürüyor"</string>
+    <string name="status_bar_latest_events_title">"Bildirimler"</string>
+    <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="battery_status_charging">"Şarj oluyor…"</string>
+    <string name="battery_low_title">"Lütfen şarj cihazını takın"</string>
+    <string name="battery_low_subtitle">"Pil tükeniyor:"</string>
+    <string name="battery_low_percent_format">"<xliff:g id="NUMBER">%d%%</xliff:g> adetten daha az kaldı."</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
+    <string name="factorytest_failed">"Fabrika testi yapılamadı"</string>
+    <string name="factorytest_not_system">"FACTORY_TEST işlemi yalnızca /system/app dizinine yüklenmiş paketler için desteklenir."</string>
+    <string name="factorytest_no_action">"FACTORY_TEST işlemini sağlayan hiçbir paket bulunamadı."</string>
+    <string name="factorytest_reboot">"Yeniden başlat"</string>
+    <string name="js_dialog_title">"\"<xliff:g id="TITLE">%s</xliff:g>\" adresindeki sayfada şunlar belirtiliyor:"</string>
+    <string name="js_dialog_title_default">"JavaScript"</string>
+    <string name="js_dialog_before_unload">"Bu sayfadan ayrılıyor musunuz?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Devam etmek için Tamam\'ı, sayfada kalmak için İptal\'i tıklatın."</string>
+    <string name="save_password_label">"Onayla"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
+    <string name="save_password_message">"Tarayıcının bu şifreyi anımsamasını istiyor musunuz?"</string>
+    <string name="save_password_notnow">"Şimdi değil"</string>
+    <string name="save_password_remember">"Anımsa"</string>
+    <string name="save_password_never">"Hiçbir zaman"</string>
+    <string name="open_permission_deny">"Bu sayfayı açma izniniz yok."</string>
+    <string name="text_copied">"Metin panoya kopyalandı."</string>
+    <string name="more_item_label">"Diğer"</string>
+    <string name="prepend_shortcut_label">"Menü+"</string>
+    <string name="menu_space_shortcut_label">"boşluk"</string>
+    <string name="menu_enter_shortcut_label">"gir"</string>
+    <string name="menu_delete_shortcut_label">"sil"</string>
+    <string name="search_go">"Ara"</string>
+    <string name="oneMonthDurationPast">"1 ay önce"</string>
+    <string name="beforeOneMonthDurationPast">"1 ay önce"</string>
+  <plurals name="num_seconds_ago">
+    <item quantity="one">"1 saniye önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saniye önce"</item>
+  </plurals>
+  <plurals name="num_minutes_ago">
+    <item quantity="one">"1 dakika önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dakika önce"</item>
+  </plurals>
+  <plurals name="num_hours_ago">
+    <item quantity="one">"1 saat önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saat önce"</item>
+  </plurals>
+  <plurals name="num_days_ago">
+    <item quantity="one">"dün"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> gün önce"</item>
+  </plurals>
+  <plurals name="in_num_seconds">
+    <item quantity="one">"1 saniye içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saniye içinde"</item>
+  </plurals>
+  <plurals name="in_num_minutes">
+    <item quantity="one">"1 dakika içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dakika içinde"</item>
+  </plurals>
+  <plurals name="in_num_hours">
+    <item quantity="one">"1 saat içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saat içinde"</item>
+  </plurals>
+  <plurals name="in_num_days">
+    <item quantity="one">"yarın"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</item>
+  </plurals>
+  <plurals name="abbrev_num_seconds_ago">
+    <item quantity="one">"1 saniye önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saniye önce"</item>
+  </plurals>
+  <plurals name="abbrev_num_minutes_ago">
+    <item quantity="one">"1 dak. önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dakika önce"</item>
+  </plurals>
+  <plurals name="abbrev_num_hours_ago">
+    <item quantity="one">"1 saat önce"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saat önce"</item>
+  </plurals>
+  <plurals name="abbrev_num_days_ago">
+    <item quantity="one">"dün"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> gün önce"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_seconds">
+    <item quantity="one">"1 san. içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saniye içinde"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_minutes">
+    <item quantity="one">"1 dak. içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> dakika içinde"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_hours">
+    <item quantity="one">"1 saat içinde"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> saat içinde"</item>
+  </plurals>
+  <plurals name="abbrev_in_num_days">
+    <item quantity="one">"yarın"</item>
+    <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> gün içinde"</item>
+  </plurals>
+    <string name="preposition_for_date">"%s üzerinde"</string>
+    <string name="preposition_for_time">"saat: %s"</string>
+    <string name="preposition_for_year">"%s içinde"</string>
+    <string name="day">"gün"</string>
+    <string name="days">"gün"</string>
+    <string name="hour">"saat"</string>
+    <string name="hours">"saat"</string>
+    <string name="minute">"dak"</string>
+    <string name="minutes">"dakika"</string>
+    <string name="second">"san."</string>
+    <string name="seconds">"saniye"</string>
+    <string name="week">"hafta"</string>
+    <string name="weeks">"hafta"</string>
+    <string name="year">"yıl"</string>
+    <string name="years">"yıl"</string>
+    <string name="every_weekday">"Hafta içi her gün (Pzt-Cum)"</string>
+    <string name="daily">"Günlük"</string>
+    <string name="weekly">"Her hafta <xliff:g id="DAY">%s</xliff:g> günü"</string>
+    <string name="monthly">"Aylık"</string>
+    <string name="yearly">"Yılda bir"</string>
+    <string name="VideoView_error_title">"Video oynatılamıyor"</string>
+    <string name="VideoView_error_text_invalid_progressive_playback">"Maalesef, bu video cihaza akışla göndermek için uygun değil."</string>
+    <string name="VideoView_error_text_unknown">"Maalesef bu video oynatılamıyor."</string>
+    <string name="VideoView_error_button">"Tamam"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="noon">"öğle"</string>
+    <string name="Noon">"Öğle"</string>
+    <string name="midnight">"geceyarısı"</string>
+    <string name="Midnight">"Gece Yarısı"</string>
+    <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+    <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
+    <string name="selectAll">"Tümünü seç"</string>
+    <string name="selectText">"Metni seç"</string>
+    <string name="stopSelectingText">"Metin seçmeyi durdur"</string>
+    <string name="cut">"Kes"</string>
+    <string name="cutAll">"Tümünü kes"</string>
+    <string name="copy">"Kopyala"</string>
+    <string name="copyAll">"Tümünü kopyala"</string>
+    <string name="paste">"Yapıştır"</string>
+    <string name="copyUrl">"URL\'yi kopyala"</string>
+    <string name="inputMethod">"Giriş Yöntemi"</string>
+    <string name="addToDictionary">"\"%s\" kelimesini sözlüğe ekle"</string>
+    <string name="editTextMenuTitle">"Metin düzenle"</string>
+    <string name="low_internal_storage_view_title">"Yer az"</string>
+    <string name="low_internal_storage_view_text">"Telefonun depolama alanı azalıyor."</string>
+    <string name="ok">"Tamam"</string>
+    <string name="cancel">"İptal"</string>
+    <string name="yes">"Tamam"</string>
+    <string name="no">"İptal"</string>
+    <string name="dialog_alert_title">"Dikkat"</string>
+    <string name="capital_on">"AÇIK"</string>
+    <string name="capital_off">"KAPALI"</string>
+    <string name="whichApplication">"İşlemi şunu kullanarak tamamla"</string>
+    <string name="alwaysUse">"Varsayılan olarak bu işlem için kullan."</string>
+    <string name="clearDefaultHintMsg">"Giriş Ayarları &gt; Uygulamalar &gt; Uygulamaları yönet\'te varsayılanı temizleyin."</string>
+    <string name="chooseActivity">"İşlem seç"</string>
+    <string name="noApplications">"Hiçbir uygulama bu işlemi yapamaz."</string>
+    <string name="aerr_title">"Üzgünüz!"</string>
+    <string name="aerr_application">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması (<xliff:g id="PROCESS">%2$s</xliff:g> işlemi) beklenmedik biçimde durdu. Lütfen yeniden deneyin."</string>
+    <string name="aerr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> işlemi beklenmedik biçimde durdu. Lütfen yeniden deneyin."</string>
+    <string name="anr_title">"Üzgünüz!"</string>
+    <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g> etkinliği (<xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasında) yanıt vermiyor."</string>
+    <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g> etkinliği (<xliff:g id="PROCESS">%2$s</xliff:g> işleminde) yanıt vermiyor."</string>
+    <string name="anr_application_process">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması (<xliff:g id="PROCESS">%2$s</xliff:g> işleminde) yanıt vermiyor."</string>
+    <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> işlemi yanıt vermiyor."</string>
+    <string name="force_close">"Kapanmaya zorla"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
+    <string name="wait">"Bekle"</string>
+    <string name="debug">"Hata ayıkla"</string>
+    <string name="sendText">"Metin için bir işlem seçin"</string>
+    <string name="volume_ringtone">"Zil sesi düzeyi"</string>
+    <string name="volume_music">"Medya ses düzeyi"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"Bluetooth üzerinden çalıyor"</string>
+    <string name="volume_call">"Gelen çağrı ses düzeyi"</string>
+    <string name="volume_bluetooth_call">"Bluetooth gelen çağrı ses düzeyi"</string>
+    <string name="volume_alarm">"Alarm ses düzeyi"</string>
+    <string name="volume_notification">"Bildirim ses düzeyi"</string>
+    <string name="volume_unknown">"Ses"</string>
+    <string name="ringtone_default">"Varsayılan zil sesi"</string>
+    <string name="ringtone_default_with_actual">"Varsayılan zil sesi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_silent">"Sessiz"</string>
+    <string name="ringtone_picker_title">"Zil sesleri"</string>
+    <string name="ringtone_unknown">"Bilinmeyen zil sesi"</string>
+  <plurals name="wifi_available">
+    <item quantity="one">"Kablosuz ağ var"</item>
+    <item quantity="other">"Kablosuz ağlar var"</item>
+  </plurals>
+  <plurals name="wifi_available_detailed">
+    <item quantity="one">"Kullanılabilir kablosuz ağı aç"</item>
+    <item quantity="other">"Kullanılabilir kablosuz ağları aç"</item>
+  </plurals>
+    <string name="select_character">"Karakter ekle"</string>
+    <string name="sms_control_default_app_name">"Bilinmeyen uygulama"</string>
+    <string name="sms_control_title">"SMS mesajları gönderme"</string>
+    <string name="sms_control_message">"Çok sayıda SMS mesajı gönderiliyor. Devam etmek için \"Tamam\"ı, göndermeyi durdurmak için \"İptal\"i seçin."</string>
+    <string name="sms_control_yes">"Tamam"</string>
+    <string name="sms_control_no">"İptal"</string>
+    <string name="date_time_set">"Ayarla"</string>
+    <string name="default_permission_group">"Varsayılan"</string>
+    <string name="no_permissions">"İzin gerektirmez"</string>
+    <string name="perms_hide"><b>"Gizle"</b></string>
+    <string name="perms_show_all"><b>"Tümünü göster"</b></string>
+    <string name="googlewebcontenthelper_loading">"Yükleniyor…"</string>
+    <string name="usb_storage_title">"USB bağlandı"</string>
+    <string name="usb_storage_message">"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">"Bağla"</string>
+    <string name="usb_storage_button_unmount">"Bağlama"</string>
+    <string name="usb_storage_error_message">"SD kartınızı USB depolama birimi için kullanmada bir sorun var."</string>
+    <string name="usb_storage_notification_title">"USB bağlandı"</string>
+    <string name="usb_storage_notification_message">"Bilgisayarınıza/bilgisayarınızdan dosya kopyalamak için seçin."</string>
+    <string name="usb_storage_stop_notification_title">"USB depolama birimini kapat"</string>
+    <string name="usb_storage_stop_notification_message">"USB depolama birimini kapatmak için seçin."</string>
+    <string name="usb_storage_stop_title">"USB depolama birimini kapat"</string>
+    <string name="usb_storage_stop_message">"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">"Kapat"</string>
+    <string name="usb_storage_stop_button_unmount">"İptal"</string>
+    <string name="usb_storage_stop_error_message">"USB depolama birimini kapatırken bir sorunla karşılaştık. USB ana makinesinde bağlantıyı kestiğinizden emin olun, sonra yeniden deneyin."</string>
+    <string name="extmedia_format_title">"SD kartı biçimlendir"</string>
+    <string name="extmedia_format_message">"SD kartı biçimlendirmek istediğinizden emin misiniz? Kartınızdaki tüm veriler yok olacak."</string>
+    <string name="extmedia_format_button_format">"Biçimlendir"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"Giriş Yöntemini Seç"</string>
+    <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
+    <string name="candidates_style"><u>"adaylar"</u></string>
+    <string name="ext_media_checking_notification_title">"SD kart hazırlanıyor"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
+    <string name="ext_media_nofs_notification_title">"Boş SD kart"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
+    <string name="ext_media_unmountable_notification_title">"Hasarlı SD kart"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
+    <string name="ext_media_badremoval_notification_title">"SD kart beklenmedik biçimde çıkarıldı"</string>
+    <string name="ext_media_badremoval_notification_message">"Veri kaybından kaçınmak için SD kartı çıkarmadan önce bağlantısını kesin."</string>
+    <string name="ext_media_safe_unmount_notification_title">"SD kart güvenle çıkarılabilir"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
+    <string name="ext_media_nomedia_notification_title">"SD kart çıkarılmış"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
+    <string name="activity_list_empty">"Eşleşen hiçbir etkinlik bulunamadı"</string>
+    <string name="permlab_pkgUsageStats">"bileşen kullanım istatistiklerini güncelle"</string>
+    <string name="permdesc_pkgUsageStats">"Toplanmış bileşen istatistiklerinin değiştirilmesine izin verir. Normal uygulamalarda kullanılmamalıdır."</string>
+    <string name="tutorial_double_tap_to_zoom_message_short">"Zum denetimi için iki kez dokun"</string>
+    <string name="gadget_host_error_inflating">"Widget\'ı genişletirken hata oluştu"</string>
+    <string name="ime_action_go">"Git"</string>
+    <string name="ime_action_search">"Ara"</string>
+    <string name="ime_action_send">"Gönder"</string>
+    <string name="ime_action_next">"İleri"</string>
+    <string name="ime_action_done">"Bitti"</string>
+    <string name="ime_action_default">"Çalıştır"</string>
+    <string name="dial_number_using">"Numarayı çevir:"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"<xliff:g id="NUMBER">%s</xliff:g>"\n" ile kişi oluştur"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
+    <skip />
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
+    <skip />
+</resources>
diff --git a/core/res/res/values-vi-rVN/donottranslate-cldr.xml b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
index 72ff8b6..6f2d342 100644
--- a/core/res/res/values-vi-rVN/donottranslate-cldr.xml
+++ b/core/res/res/values-vi-rVN/donottranslate-cldr.xml
@@ -133,8 +133,8 @@
     <string name="same_month_md1_time1_md2_time2">%3$s %2$s %5$s - %8$s %7$s %10$s</string>
     <string name="same_year_wday1_md1_time1_wday2_md2_time2">%1$s %3$s %2$s %5$s - %6$s %8$s %7$s %10$s</string>
     <string name="same_month_wday1_md1_time1_wday2_md2_time2">%1$s %3$s %2$s %5$s - %6$s %8$s %7$s %10$s</string>
-    <string name="same_year_mdy1_time1_mdy2_time2">Ngày %3$s tháng %2$s năm %4$s %5$s - 'Ngày %8$s tháng %7$s năm %9$s %10$s</string>
-    <string name="same_month_mdy1_time1_mdy2_time2">Ngày %3$s tháng %2$s năm %4$s %5$s - 'Ngày %8$s tháng %7$s năm %9$s %10$s</string>
+    <string name="same_year_mdy1_time1_mdy2_time2">Ngày %3$s tháng %2$s năm %4$s %5$s - \'Ngày %8$s tháng %7$s năm %9$s %10$s</string>
+    <string name="same_month_mdy1_time1_mdy2_time2">Ngày %3$s tháng %2$s năm %4$s %5$s - \'Ngày %8$s tháng %7$s năm %9$s %10$s</string>
     <string name="same_year_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s %5$s - %6$s, %8$s %7$s %9$s %10$s</string>
     <string name="same_month_wday1_mdy1_time1_wday2_mdy2_time2">%1$s, %3$s %2$s %4$s %5$s - %6$s, %8$s %7$s %9$s %10$s</string>
     <string name="same_month_wday1_mdy1_wday2_mdy2">%1$s, %3$s %2$s %4$s - %6$s, %8$s %7$s %9$s</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 3be8aa0..48c4d38 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -21,6 +21,8 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <!-- no translation found for fileSizeSuffix (7670819340156489359) -->
+    <skip />
     <string name="untitled">"&lt;无标题&gt;"</string>
     <string name="ellipsis">"..."</string>
     <string name="emptyPhoneNumber">"(无电话号码)"</string>
@@ -30,69 +32,110 @@
     <string name="mmiError">"出现连接问题或 MMI 码无效。"</string>
     <string name="serviceEnabled">"服务已启用。"</string>
     <string name="serviceEnabledFor">"已针对以下内容启用了服务:"</string>
-    <string name="serviceDisabled">"服务已被禁用。"</string>
+    <string name="serviceDisabled">"服务已被停用。"</string>
     <string name="serviceRegistered">"注册成功。"</string>
-    <string name="serviceErased">"清除已成功。"</string>
+    <string name="serviceErased">"清除成功。"</string>
     <string name="passwordIncorrect">"密码不正确。"</string>
-    <string name="mmiComplete">"MMI 码已完成。"</string>
-    <string name="badPin">"您键入的旧 PIN 码不正确。"</string>
-    <string name="badPuk">"您键入的 PUK 码不正确。"</string>
-    <string name="mismatchPin">"您输入的 PIN 码不匹配。"</string>
-    <string name="invalidPin">"键入一个 4 到 8 位数的 PIN 码。"</string>
-    <string name="needPuk">"已对 SIM 卡进行 PUK 码锁定。键入 PUK 码将其解锁。"</string>
-    <string name="needPuk2">"键入 PUK2 码以解锁 SIM 卡。"</string>
-    <string name="ClipMmi">"来电者 ID"</string>
-    <string name="ClirMmi">"去电者 ID"</string>
-    <string name="CfMmi">"呼叫转移"</string>
+    <string name="mmiComplete">"MMI 完成。"</string>
+    <string name="badPin">"您输入的旧 PIN 不正确。"</string>
+    <string name="badPuk">"您输入的 PUK 不正确。"</string>
+    <string name="mismatchPin">"您输入的 PIN 码不一致。"</string>
+    <string name="invalidPin">"输入一个 4 至 8 位数的 PIN。"</string>
+    <string name="needPuk">"您的 SIM 卡被 PUK 锁定。请输入 PUK 码进行解锁。"</string>
+    <string name="needPuk2">"输入 PUK2 以解锁 SIM 卡。"</string>
+    <string name="ClipMmi">"收到来电显示"</string>
+    <string name="ClirMmi">"外拨电话显示"</string>
+    <string name="CfMmi">"呼叫转接"</string>
     <string name="CwMmi">"呼叫等待"</string>
     <string name="BaMmi">"呼叫限制"</string>
     <string name="PwdMmi">"密码更改"</string>
     <string name="PinMmi">"PIN 码更改"</string>
-    <string name="CLIRDefaultOnNextCallOn">"呼叫者 ID 默认情况下受限制。下一个呼叫:受限制"</string>
-    <string name="CLIRDefaultOnNextCallOff">"呼叫者 ID 默认情况下受限制。下一个呼叫:不受限制"</string>
-    <string name="CLIRDefaultOffNextCallOn">"呼叫者 ID 默认情况下不受限制。下一个呼叫:受限制"</string>
-    <string name="CLIRDefaultOffNextCallOff">"呼叫者 ID 默认情况下不受限制。下一个呼叫:不受限制"</string>
+    <!-- no translation found for CnipMmi (3110534680557857162) -->
+    <skip />
+    <!-- no translation found for CnirMmi (3062102121430548731) -->
+    <skip />
+    <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+    <skip />
+    <!-- no translation found for RuacMmi (7827887459138308886) -->
+    <skip />
+    <!-- no translation found for CndMmi (3116446237081575808) -->
+    <skip />
+    <!-- no translation found for DndMmi (1265478932418334331) -->
+    <skip />
+    <string name="CLIRDefaultOnNextCallOn">"来电显示默认设置为受限制。下一个呼叫:受限制"</string>
+    <string name="CLIRDefaultOnNextCallOff">"来电显示默认设置为受限制。下一个呼叫:不受限制"</string>
+    <string name="CLIRDefaultOffNextCallOn">"来电显示默认设置为不受限制。下一个呼叫:受限制"</string>
+    <string name="CLIRDefaultOffNextCallOff">"来电显示默认设置为不受限制。下一个呼叫:不受限制"</string>
     <string name="serviceNotProvisioned">"未提供服务。"</string>
-    <string name="CLIRPermanent">"不能更改呼叫者 ID 设置。"</string>
-    <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
-    <skip />
-    <!-- no translation found for RestrictedOnData (8653794784690065540) -->
-    <skip />
-    <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
-    <skip />
-    <!-- no translation found for RestrictedOnNormal (2045364908281990708) -->
-    <skip />
-    <!-- no translation found for RestrictedOnAll (4923139582141626159) -->
-    <skip />
+    <string name="CLIRPermanent">"无法更改来电显示设置。"</string>
+    <string name="RestrictedChangedTitle">"访问受限情况已发生变化"</string>
+    <string name="RestrictedOnData">"数据服务已禁用。"</string>
+    <string name="RestrictedOnEmergency">"紧急服务已禁用。"</string>
+    <string name="RestrictedOnNormal">"语音/短信服务已禁用。"</string>
+    <string name="RestrictedOnAll">"所有语音/短信服务均已禁用。"</string>
     <string name="serviceClassVoice">"语音"</string>
     <string name="serviceClassData">"数据"</string>
     <string name="serviceClassFAX">"传真"</string>
     <string name="serviceClassSMS">"短信"</string>
     <string name="serviceClassDataAsync">"异步"</string>
     <string name="serviceClassDataSync">"同步"</string>
-    <string name="serviceClassPacket">"包"</string>
+    <string name="serviceClassPacket">"封包"</string>
     <string name="serviceClassPAD">"PAD"</string>
-    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未转移呼叫"</string>
+    <!-- no translation found for roamingText0 (7170335472198694945) -->
+    <skip />
+    <!-- no translation found for roamingText1 (5314861519752538922) -->
+    <skip />
+    <!-- no translation found for roamingText2 (8969929049081268115) -->
+    <skip />
+    <!-- no translation found for roamingText3 (5148255027043943317) -->
+    <skip />
+    <!-- no translation found for roamingText4 (8808456682550796530) -->
+    <skip />
+    <!-- no translation found for roamingText5 (7604063252850354350) -->
+    <skip />
+    <!-- no translation found for roamingText6 (2059440825782871513) -->
+    <skip />
+    <!-- no translation found for roamingText7 (7112078724097233605) -->
+    <skip />
+    <!-- no translation found for roamingText8 (5989569778604089291) -->
+    <skip />
+    <!-- no translation found for roamingText9 (7969296811355152491) -->
+    <skip />
+    <!-- no translation found for roamingText10 (3992906999815316417) -->
+    <skip />
+    <!-- no translation found for roamingText11 (4154476854426920970) -->
+    <skip />
+    <!-- no translation found for roamingText12 (1189071119992726320) -->
+    <skip />
+    <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+    <skip />
+    <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:无法转接"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒后转移呼叫 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
-    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未转移呼叫"</string>
-    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未转移呼叫"</string>
+    <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒后拨打 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
+    <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:没有转接"</string>
+    <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:没有转接"</string>
+    <!-- no translation found for fcComplete (3118848230966886575) -->
+    <skip />
+    <!-- no translation found for fcError (3327560126588500777) -->
+    <skip />
     <string name="httpErrorOk">"确定"</string>
-    <string name="httpError">"此网页包含错误。"</string>
-    <string name="httpErrorLookup">"找不到该网址。"</string>
-    <string name="httpErrorUnsupportedAuthScheme">"不支持此站点验证方案。"</string>
-    <string name="httpErrorAuth">"验证失败。"</string>
-    <string name="httpErrorProxyAuth">"通过代理服务器进行验证失败。"</string>
-    <string name="httpErrorConnect">"与服务器的连接失败。"</string>
-    <string name="httpErrorIO">"服务器无法通讯。请稍后重试。"</string>
+    <string name="httpError">"网页包含错误。"</string>
+    <string name="httpErrorLookup">"找不到网址。"</string>
+    <string name="httpErrorUnsupportedAuthScheme">"不支持此网站身份验证方案。"</string>
+    <string name="httpErrorAuth">"身份验证失败。"</string>
+    <string name="httpErrorProxyAuth">"通过代理服务器进行身份验证失败。"</string>
+    <string name="httpErrorConnect">"未能连接到服务器。"</string>
+    <string name="httpErrorIO">"服务器无法通信,请稍后重试。"</string>
     <string name="httpErrorTimeout">"与服务器的连接超时。"</string>
-    <string name="httpErrorRedirectLoop">"该页面包含太多服务器重定向。"</string>
+    <string name="httpErrorRedirectLoop">"网页包含过多服务器重定向。"</string>
     <string name="httpErrorUnsupportedScheme">"不支持该协议。"</string>
-    <string name="httpErrorFailedSslHandshake">"不能建立安全连接。"</string>
-    <string name="httpErrorBadUrl">"网址无效,此页面无法打开。"</string>
-    <string name="httpErrorFile">"此文件无法访问。"</string>
+    <string name="httpErrorFailedSslHandshake">"无法建立安全连接。"</string>
+    <string name="httpErrorBadUrl">"网址无效,此网页无法打开。"</string>
+    <string name="httpErrorFile">"无法访问该文件。"</string>
     <string name="httpErrorFileNotFound">"找不到请求的文件。"</string>
-    <string name="httpErrorTooManyRequests">"正在处理的请求太多。请稍后重试。"</string>
+    <string name="httpErrorTooManyRequests">"正在处理的请求太多,请稍后重试。"</string>
+    <!-- no translation found for certificateSaved (2832076323378077191) -->
+    <skip />
     <string name="contentServiceSync">"同步"</string>
     <string name="contentServiceSyncNotificationTitle">"同步"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"太多<xliff:g id="CONTENT_TYPE">%s</xliff:g>删除项。"</string>
@@ -105,171 +148,191 @@
     <string name="screen_lock">"屏幕锁定"</string>
     <string name="power_off">"关机"</string>
     <string name="shutdown_progress">"正在关机..."</string>
-    <string name="shutdown_confirm">"您的手机会关机。"</string>
-    <string name="no_recent_tasks">"没有最近的应用程序。"</string>
+    <string name="shutdown_confirm">"您的手机会关闭。"</string>
+    <string name="no_recent_tasks">"无最近的应用程序。"</string>
     <string name="global_actions">"手机选项"</string>
     <string name="global_action_lock">"屏幕锁定"</string>
     <string name="global_action_power_off">"关机"</string>
     <string name="global_action_toggle_silent_mode">"静音模式"</string>
-    <string name="global_action_silent_mode_on_status">"声音已关闭"</string>
-    <string name="global_action_silent_mode_off_status">"声音已开启"</string>
+    <string name="global_action_silent_mode_on_status">"声音已“关闭”"</string>
+    <string name="global_action_silent_mode_off_status">"声音已“开启”"</string>
     <string name="global_actions_toggle_airplane_mode">"飞行模式"</string>
     <string name="global_actions_airplane_mode_on_status">"飞行模式已开启"</string>
     <string name="global_actions_airplane_mode_off_status">"飞行模式已关闭"</string>
     <string name="safeMode">"安全模式"</string>
     <string name="android_system_label">"Android 系统"</string>
-    <string name="permgrouplab_costMoney">"需要您支付费用的服务"</string>
-    <string name="permgroupdesc_costMoney">"允许应用程序执行可能需要您支付费用的操作。"</string>
-    <string name="permgrouplab_messages">"您的信息"</string>
-    <string name="permgroupdesc_messages">"阅读并编写您的短信、电子邮件和其他消息。"</string>
+    <string name="permgrouplab_costMoney">"需要您付费的服务"</string>
+    <string name="permgroupdesc_costMoney">"允许应用程序执行可能需要您付费的操作。"</string>
+    <string name="permgrouplab_messages">"您的消息"</string>
+    <string name="permgroupdesc_messages">"读/写短信、电子邮件和其他消息。"</string>
     <string name="permgrouplab_personalInfo">"您的个人信息"</string>
-    <string name="permgroupdesc_personalInfo">"直接访问手机中存储的联系人和日历。"</string>
-    <string name="permgrouplab_location">"您所处的位置"</string>
+    <string name="permgroupdesc_personalInfo">"直接访问手机上存储的联系人和日历。"</string>
+    <string name="permgrouplab_location">"您的位置"</string>
     <string name="permgroupdesc_location">"监视您的物理位置"</string>
-    <string name="permgrouplab_network">"网络通讯"</string>
+    <string name="permgrouplab_network">"网络通信"</string>
     <string name="permgroupdesc_network">"允许应用程序访问各种网络功能。"</string>
     <string name="permgrouplab_accounts">"您的 Google 帐户"</string>
     <string name="permgroupdesc_accounts">"访问可用的 Google 帐户。"</string>
-    <string name="permgrouplab_hardwareControls">"硬件控件"</string>
-    <string name="permgroupdesc_hardwareControls">"直接在手机上访问硬件。"</string>
+    <string name="permgrouplab_hardwareControls">"硬件控制"</string>
+    <string name="permgroupdesc_hardwareControls">"直接访问手机上的硬件。"</string>
     <string name="permgrouplab_phoneCalls">"手机通话"</string>
-    <string name="permgroupdesc_phoneCalls">"监视、记录和处理手机呼叫。"</string>
+    <string name="permgroupdesc_phoneCalls">"监视、记录和处理电话。"</string>
     <string name="permgrouplab_systemTools">"系统工具"</string>
-    <string name="permgroupdesc_systemTools">"对系统进行低级访问和控制。"</string>
+    <string name="permgroupdesc_systemTools">"对系统的低级别访问和控制。"</string>
     <string name="permgrouplab_developmentTools">"开发工具"</string>
-    <string name="permgroupdesc_developmentTools">"只有应用程序开发人员才需要的功能。"</string>
-    <string name="permlab_statusBar">"禁用或修改状态栏"</string>
-    <string name="permdesc_statusBar">"允许应用程序禁用状态栏或者添加和删除系统图标。"</string>
-    <string name="permlab_expandStatusBar">"展开/收拢状态栏"</string>
-    <string name="permdesc_expandStatusBar">"允许应用程序展开或收拢状态栏。"</string>
-    <string name="permlab_processOutgoingCalls">"拦截去电"</string>
-    <string name="permdesc_processOutgoingCalls">"允许应用程序处理去电和更改要拨打的号码。恶意应用程序可能会借此监视、重定向或阻止去电。"</string>
+    <string name="permgroupdesc_developmentTools">"只有应用程序开发人员需要这些功能。"</string>
+    <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+    <skip />
+    <!-- no translation found for permgroupdesc_storage (9203302214915355774) -->
+    <skip />
+    <string name="permlab_statusBar">"停用或修改状态栏"</string>
+    <string name="permdesc_statusBar">"允许应用程序停用状态栏,或者添加和删除系统图标。"</string>
+    <string name="permlab_expandStatusBar">"展开/折叠状态栏"</string>
+    <string name="permdesc_expandStatusBar">"允许应用程序展开或折叠状态栏。"</string>
+    <string name="permlab_processOutgoingCalls">"拦截对外呼叫"</string>
+    <string name="permdesc_processOutgoingCalls">"允许应用程序处理对外呼叫和更改要拨打的号码。恶意应用程序可借此监视、重定向或阻止对外呼叫。"</string>
     <string name="permlab_receiveSms">"接收短信"</string>
-    <string name="permdesc_receiveSms">"允许应用程序接收和处理短信。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。"</string>
+    <string name="permdesc_receiveSms">"允许应用程序接收和处理短信。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。"</string>
     <string name="permlab_receiveMms">"接收彩信"</string>
-    <string name="permdesc_receiveMms">"允许应用程序接收和处理彩信。恶意应用程序可能会借此监视您的信息,或在您尚未看到的情况下就将其删除。"</string>
+    <string name="permdesc_receiveMms">"允许应用程序接收和处理彩信。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。"</string>
     <string name="permlab_sendSms">"发送短信"</string>
-    <string name="permdesc_sendSms">"允许应用程序发送短信。恶意应用程序可能会借此在未经您确认的情况下发送信息从而让您支付费用。"</string>
+    <string name="permdesc_sendSms">"允许应用程序发送短信。恶意应用程序可借此不经您的确认发送信息来让您付费。"</string>
     <string name="permlab_readSms">"读取短信或彩信"</string>
-    <string name="permdesc_readSms">"允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可能会借此读取您的机密信息。"</string>
+    <string name="permdesc_readSms">"允许应用程序读取您的手机或 SIM 卡中存储的短信。恶意应用程序可借此读取您的机密信息。"</string>
     <string name="permlab_writeSms">"编辑短信或彩信"</string>
-    <string name="permdesc_writeSms">"允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可能会借此删除您的信息。"</string>
+    <string name="permdesc_writeSms">"允许应用程序写入手机或 SIM 卡中存储的短信。恶意应用程序可借此删除您的信息。"</string>
     <string name="permlab_receiveWapPush">"接收 WAP"</string>
-    <string name="permdesc_receiveWapPush">"允许应用程序接收和处理 WAP 信息。恶意应用程序可能会借此监视您的信息,或将信息删除,而不向您显示。"</string>
-    <string name="permlab_getTasks">"检索正在运行的应用程序"</string>
-    <string name="permdesc_getTasks">"恶意应用程序可能会借此找到有关其他应用程序的私有信息。恶意应用程序可能会借此发现有关其他应用程序的私有信息。"</string>
+    <string name="permdesc_receiveWapPush">"允许应用程序接收和处理 WAP 消息。恶意应用程序可借此监视您的消息,或者将消息删除而不向您显示。"</string>
+    <string name="permlab_getTasks">"检索所运行的应用程序"</string>
+    <string name="permdesc_getTasks">"允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可借此发现有关其他应用程序的私有信息。"</string>
     <string name="permlab_reorderTasks">"对正在运行的应用程序重新排序"</string>
-    <string name="permdesc_reorderTasks">"允许应用程序将任务移至前端和后台。恶意应用程序可能会借此强行进到前台,而不受您的控制。"</string>
+    <string name="permdesc_reorderTasks">"允许应用程序将任务移至前台和后台。恶意应用程序可借此强行进到前台,而不受您的控制。"</string>
     <string name="permlab_setDebugApp">"启用应用程序调试"</string>
-    <string name="permdesc_setDebugApp">"允许应用程序启动对其他应用程序的调试。恶意应用程序可能会借此终止其他应用程序。"</string>
-    <string name="permlab_changeConfiguration">"更改您的 UI 设置"</string>
-    <string name="permdesc_changeConfiguration">"允许应用程序更改当前配置,例如语言设置或整体的字体大小。"</string>
+    <string name="permdesc_setDebugApp">"允许应用程序启动对其他应用程序的调试。恶意应用程序可借此终止其他应用程序。"</string>
+    <string name="permlab_changeConfiguration">"更改您的用户界面设置"</string>
+    <string name="permdesc_changeConfiguration">"允许应用程序更改当前配置,例如语言区域或整体字号。"</string>
     <string name="permlab_restartPackages">"重新启动其他应用程序"</string>
-    <string name="permdesc_restartPackages">"允许应用程序强制重新启动其他应用程序。"</string>
-    <string name="permlab_forceBack">"强制应用程序关闭"</string>
-    <string name="permdesc_forceBack">"允许应用程序强制前台的任何活动关闭和重新开始。普通应用程序从不需要使用此权限。"</string>
+    <string name="permdesc_restartPackages">"允许应用程序强行重新启动其他应用程序。"</string>
+    <string name="permlab_forceBack">"强行关闭应用程序"</string>
+    <string name="permdesc_forceBack">"允许应用程序强行关闭前台中的任何活动并返回。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_dump">"检索系统内部状态"</string>
-    <string name="permdesc_dump">"允许应用程序检索系统的内部状态。恶意应用程序可能会借此检索通常它们本不需要的各种私有和安全信息。"</string>
-    <string name="permlab_runSetActivityWatcher">"监视和控制所有应用程序启动"</string>
-    <string name="permdesc_runSetActivityWatcher">"允许应用程序监视和控制系统启动活动的方式。恶意应用程序可能会借此彻底损坏系统。此权限仅在开发时才需要,普通的手机应用不需要。"</string>
-    <string name="permlab_broadcastPackageRemoved">"发送包删除的广播"</string>
-    <string name="permdesc_broadcastPackageRemoved">"允许应用程序广播已删除某应用程序包的通知。恶意应用程序可能会借此来终止任何其他正在运行的应用程序。"</string>
-    <string name="permlab_broadcastSmsReceived">"发送短信收到的广播"</string>
-    <string name="permdesc_broadcastSmsReceived">"允许应用程序广播已收到短信的通知。恶意应用程序可能会借此伪造收到的短信。"</string>
-    <string name="permlab_broadcastWapPush">"发送 WAP-PUSH 收到的广播"</string>
-    <string name="permdesc_broadcastWapPush">"允许应用程序播报收到 WAP PUSH 消息的通知。恶意应用程序可能会借此乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
-    <string name="permlab_setProcessLimit">"限制正在运行的进程数"</string>
-    <string name="permdesc_setProcessLimit">"允许应用程序控制运行的进程数上限。普通应用程序从不需要使用此权限。"</string>
+    <string name="permdesc_dump">"允许应用程序检索系统的内部状态。恶意应用程序可借此检索它们通常并不需要的各种私有信息和安全信息。"</string>
+    <!-- no translation found for permlab_shutdown (7185747824038909016) -->
+    <skip />
+    <!-- no translation found for permdesc_shutdown (7046500838746291775) -->
+    <skip />
+    <!-- no translation found for permlab_stopAppSwitches (4138608610717425573) -->
+    <skip />
+    <!-- no translation found for permdesc_stopAppSwitches (3857886086919033794) -->
+    <skip />
+    <string name="permlab_runSetActivityWatcher">"监控所有应用程序的启动"</string>
+    <string name="permdesc_runSetActivityWatcher">"允许应用程序监控系统启动活动的方式。恶意应用程序可借此彻底损坏系统。这一权限只在开发过程中需要,普通的手机操作不需要。"</string>
+    <string name="permlab_broadcastPackageRemoved">"发送已删除包的广播"</string>
+    <string name="permdesc_broadcastPackageRemoved">"允许应用程序广播已删除应用程序包的通知。恶意应用程序可借此终止任何正在运行的其他应用程序。"</string>
+    <string name="permlab_broadcastSmsReceived">"发送可通过短信接收的广播"</string>
+    <string name="permdesc_broadcastSmsReceived">"允许应用程序广播已收到短信的通知。恶意应用程序可借此伪造收到的短信。"</string>
+    <string name="permlab_broadcastWapPush">"发送 WAP 一键接收广播"</string>
+    <string name="permdesc_broadcastWapPush">"允许应用程序广播收到 WAP 一键信息的通知。恶意应用程序可借此乱发彩信或暗中用恶意内容替换任意网页中的内容。"</string>
+    <string name="permlab_setProcessLimit">"限制所运行进程的数量"</string>
+    <string name="permdesc_setProcessLimit">"允许应用程序控制将运行的最大进程数。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_setAlwaysFinish">"关闭所有后台应用程序"</string>
     <string name="permdesc_setAlwaysFinish">"允许应用程序控制活动是否始终是一转至后台就完成。普通应用程序从不需要使用此权限。"</string>
-    <string name="permlab_batteryStats">"修改电池统计信息"</string>
-    <string name="permdesc_batteryStats">"允许修改收集的电池统计信息。普通应用程序不能使用此权限。"</string>
+    <string name="permlab_batteryStats">"修改电池使用情况统计信息"</string>
+    <string name="permdesc_batteryStats">"允许修改收集的电池使用情况统计信息。普通应用程序不能使用此权限。"</string>
+    <!-- no translation found for permlab_backup (470013022865453920) -->
+    <skip />
+    <!-- no translation found for permdesc_backup (2305432853944929371) -->
+    <skip />
     <string name="permlab_internalSystemWindow">"显示未授权的窗口"</string>
-    <string name="permdesc_internalSystemWindow">"允许创建专用于内部系统用户界面的窗口。普通应用程序不能使用此权限。"</string>
+    <string name="permdesc_internalSystemWindow">"允许创建专供内部系统用户界面使用的窗口。普通应用程序不能使用此权限。"</string>
     <string name="permlab_systemAlertWindow">"显示系统级警报"</string>
-    <string name="permdesc_systemAlertWindow">"允许应用程序显示系统警报窗口。恶意应用程序可能会借此掌控整个手机屏幕。"</string>
+    <string name="permdesc_systemAlertWindow">"允许应用程序显示系统警报窗口。恶意应用程序可借此掌控整个手机屏幕。"</string>
     <string name="permlab_setAnimationScale">"修改全局动画速度"</string>
-    <string name="permdesc_setAnimationScale">"允许应用程序随时更改全局动画速度(加快或减慢动画)。"</string>
+    <string name="permdesc_setAnimationScale">"允许应用程序随时更改全局动画速度(加快或放慢动画)。"</string>
     <string name="permlab_manageAppTokens">"管理应用程序令牌"</string>
-    <string name="permdesc_manageAppTokens">"允许应用程序创建和管理自己的令牌,从而绕开其常规的 Z 方向。普通应用程序从不需要使用此权限。"</string>
+    <string name="permdesc_manageAppTokens">"允许应用程序创建和管理自己的令牌,从而绕开正常的 Z 排序方式。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_injectEvents">"按键和控制按钮"</string>
-    <string name="permdesc_injectEvents">"允许应用程序将其自己的输入活动(按键等)提供给其他应用程序。恶意应用程序可能会借此掌控手机。"</string>
-    <string name="permlab_readInputState">"记录您键入的内容和执行的操作"</string>
-    <string name="permdesc_readInputState">"即使在与其他应用程序交互时(例如输入密码),也允许应用程序查看您按的键。普通应用程序从不需要使用此权限。"</string>
-    <string name="permlab_bindInputMethod">"绑定到输入方法"</string>
-    <string name="permdesc_bindInputMethod">"允许持有者绑定到输入方法的顶级接口。普通应用程序从不需要使用此权限。"</string>
-    <string name="permlab_setOrientation">"更改屏幕方向"</string>
+    <string name="permdesc_injectEvents">"允许应用程序将其自己的输入活动(按键等)提供给其他应用程序。恶意应用程序可借此掌控手机。"</string>
+    <string name="permlab_readInputState">"记录您输入的内容和采取的操作"</string>
+    <string name="permdesc_readInputState">"允许应用程序查看您按的键,即使在与其他应用程序交互(例如输入密码)时也不例外。普通应用程序从不需要使用此权限。"</string>
+    <string name="permlab_bindInputMethod">"绑定至输入法"</string>
+    <string name="permdesc_bindInputMethod">"允许手机用户绑定至输入法的顶级界面。普通应用程序从不需要使用此权限。"</string>
+    <string name="permlab_setOrientation">"更改屏幕浏览模式"</string>
     <string name="permdesc_setOrientation">"允许应用程序随时更改屏幕的旋转方向。普通应用程序从不需要使用此权限。"</string>
     <string name="permlab_signalPersistentProcesses">"向应用程序发送 Linux 信号"</string>
-    <string name="permdesc_signalPersistentProcesses">"允许应用程序请求将提供的信号发送给所有持久进程。"</string>
+    <string name="permdesc_signalPersistentProcesses">"允许应用程序请求将提供的信号发送给所有持续的进程。"</string>
     <string name="permlab_persistentActivity">"让应用程序始终运行"</string>
     <string name="permdesc_persistentActivity">"允许应用程序部分持续运行,这样系统便不能将其用于其他应用程序。"</string>
     <string name="permlab_deletePackages">"删除应用程序"</string>
-    <string name="permdesc_deletePackages">"允许应用程序删除 Android 包。恶意应用程序可能会借此删除重要的应用程序。"</string>
+    <string name="permdesc_deletePackages">"允许应用程序删除 Android 包。恶意应用程序可借此删除重要的应用程序。"</string>
     <string name="permlab_clearAppUserData">"删除其他应用程序的数据"</string>
     <string name="permdesc_clearAppUserData">"允许应用程序清除用户数据。"</string>
-    <string name="permlab_deleteCacheFiles">"删除其他应用程序的缓存"</string>
+    <string name="permlab_deleteCacheFiles">"删除其他应用程序缓存"</string>
     <string name="permdesc_deleteCacheFiles">"允许应用程序删除缓存文件。"</string>
     <string name="permlab_getPackageSize">"计算应用程序存储空间"</string>
     <string name="permdesc_getPackageSize">"允许应用程序检索其代码、数据和缓存大小"</string>
     <string name="permlab_installPackages">"直接安装应用程序"</string>
-    <string name="permdesc_installPackages">"允许应用程序安装新的或更新的 Android 包。恶意应用程序可能会借此添加其具有任意权限的新应用程序。"</string>
+    <string name="permdesc_installPackages">"允许应用程序安装新的或更新的 Android 包。恶意应用程序可借此添加具有极大权限的新应用程序。"</string>
     <string name="permlab_clearAppCache">"删除所有应用程序缓存数据"</string>
-    <string name="permdesc_clearAppCache">"允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。通常只限于访问系统进程。"</string>
+    <string name="permdesc_clearAppCache">"允许应用程序通过删除应用程序缓存目录中的文件释放手机存储空间。对系统进程的访问通常受到严格限制。"</string>
     <string name="permlab_readLogs">"读取系统日志文件"</string>
-    <string name="permdesc_readLogs">"允许应用程序从系统的各日志文件中进行读取。这样应用程序可以发现有关您正在通过手机执行的操作的常规信息,但这些信息不应包含任何个人或私有信息。"</string>
-    <string name="permlab_diagnostic">"读取/写入诊断拥有的资源"</string>
-    <string name="permdesc_diagnostic">"允许应用程序读取和写入诊断组拥有的任何资源;例如 /dev 中的文件。这可能会潜在地影响系统稳定性和安全性。此权限只应用于由制造商或操作员执行的硬件特定的诊断。"</string>
-    <string name="permlab_changeComponentState">"启用或禁用应用程序组件"</string>
-    <string name="permdesc_changeComponentState">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可能会借此来禁用重要的手机功能。使用此权限时务必谨慎,因为这可能导致应用程序组件进入不可用、不一致或不稳定的状态。"</string>
-    <string name="permlab_setPreferredApplications">"设置首选的应用程序"</string>
-    <string name="permdesc_setPreferredApplications">"允许应用程序修改首选的应用程序。恶意应用程序可能会借此暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的私有数据。"</string>
+    <string name="permdesc_readLogs">"允许应用程序读取系统的各日志文件。这样应用程序可以发现有关您操作手机的一般信息,但这些信息不应包含任何个人信息或私有信息。"</string>
+    <string name="permlab_diagnostic">"读取/写入诊断所拥有的资源"</string>
+    <string name="permdesc_diagnostic">"允许应用程序读取/写入诊断组所拥有的任何资源;例如,/dev 中的文件。这可能会影响系统稳定性和安全性。此权限只应由制造商或运营商用于硬件特定的诊断。"</string>
+    <string name="permlab_changeComponentState">"启用或停用应用程序组件"</string>
+    <string name="permdesc_changeComponentState">"允许应用程序更改是否启用其他应用程序的组件。恶意应用程序可借此停用重要的手机功能。使用此权限时务必谨慎,因为这可能导致应用程序组件进入不可用、不一致或不稳定的状态。"</string>
+    <string name="permlab_setPreferredApplications">"设置首选应用程序"</string>
+    <string name="permdesc_setPreferredApplications">"允许应用程序修改首选的应用程序。这样恶意应用程序可能会暗中更改运行的应用程序,从而骗过您的现有应用程序来收集您的私有数据。"</string>
     <string name="permlab_writeSettings">"修改全局系统设置"</string>
-    <string name="permdesc_writeSettings">"允许应用程序修改系统的设置数据。恶意应用程序可能会借此破坏您的系统配置。"</string>
+    <string name="permdesc_writeSettings">"允许应用程序修改系统的设置数据。恶意应用程序可借此破坏您的系统配置。"</string>
     <string name="permlab_writeSecureSettings">"修改安全系统设置"</string>
     <string name="permdesc_writeSecureSettings">"允许应用程序修改系统安全设置数据。普通应用程序不能使用此权限。"</string>
     <string name="permlab_writeGservices">"修改 Google 服务地图"</string>
     <string name="permdesc_writeGservices">"允许应用程序修改 Google 服务地图。普通应用程序不能使用此权限。"</string>
-    <string name="permlab_receiveBootCompleted">"引导时自动启动"</string>
-    <string name="permdesc_receiveBootCompleted">"允许应用程序在系统完成引导后即自行启动。这样会加长启动手机所需的时间,而且如果应用程序一直运行,会降低手机的整体速度。"</string>
+    <string name="permlab_receiveBootCompleted">"开机时自动启动"</string>
+    <string name="permdesc_receiveBootCompleted">"允许应用程序在系统完成启动后即自行启动。这样会延长手机的启动时间,而且如果应用程序一直运行,会降低手机的整体速度。"</string>
     <string name="permlab_broadcastSticky">"发送顽固广播"</string>
-    <string name="permdesc_broadcastSticky">"允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会借此使手机使用太多内存,从而降低其速度和稳定性。"</string>
-    <string name="permlab_readContacts">"读取联系数据"</string>
-    <string name="permdesc_readContacts">"允许应用程序读取您手机中存储的所有联系(地址)数据。恶意应用程序可能会借此将您的数据发送给其他人。"</string>
+    <string name="permdesc_broadcastSticky">"允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会借此使手机耗用太多内存,从而降低其速度或稳定性。"</string>
+    <string name="permlab_readContacts">"读取联系人数据"</string>
+    <string name="permdesc_readContacts">"允许应用程序读取您手机上存储的所有联系人(地址)数据。恶意应用程序可借此将您的数据发送给其他人。"</string>
     <string name="permlab_writeContacts">"写入联系数据"</string>
-    <string name="permdesc_writeContacts">"允许应用程序修改您手机中存储的联系(地址)数据。恶意应用程序可能会借此清除或修改您的联系数据。"</string>
-    <string name="permlab_writeOwnerData">"写入所有者数据"</string>
-    <string name="permdesc_writeOwnerData">"允许应用程序修改您手机中存储的手机所有者数据。恶意应用程序可能会借此清除或修改所有者数据。"</string>
-    <string name="permlab_readOwnerData">"读取所有者数据"</string>
-    <string name="permdesc_readOwnerData">"允许应用程序读取您手机中存储的手机所有者数据。恶意应用程序可能会借此读取手机所有者数据。"</string>
+    <string name="permdesc_writeContacts">"允许应用程序修改您手机上存储的联系人(地址)数据。恶意应用程序可借此清除或修改您的联系人数据。"</string>
+    <string name="permlab_writeOwnerData">"写入拥有者数据"</string>
+    <string name="permdesc_writeOwnerData">"允许应用程序修改您手机上存储的手机拥有者数据。恶意应用程序可借此清除或修改拥有者数据。"</string>
+    <string name="permlab_readOwnerData">"读取拥有者数据"</string>
+    <string name="permdesc_readOwnerData">"允许应用程序读取您手机上存储的手机拥有者数据。恶意应用程序可借此读取手机拥有者数据。"</string>
     <string name="permlab_readCalendar">"读取日历数据"</string>
-    <string name="permdesc_readCalendar">"允许应用程序读取您手机中存储的所有日历活动。恶意应用程序可能会借此将您的日历活动发送给其他人。"</string>
+    <string name="permdesc_readCalendar">"允许应用程序读取您手机上存储的所有日历活动。恶意应用程序可借此将您的日历活动发送给其他人。"</string>
     <string name="permlab_writeCalendar">"写入日历数据"</string>
-    <string name="permdesc_writeCalendar">"允许应用程序修改您手机中存储的日历活动。恶意应用程序可能会借此清除或修改您的日历数据。"</string>
-    <string name="permlab_accessMockLocation">"用于测试的模仿位置源"</string>
-    <string name="permdesc_accessMockLocation">"创建用于测试的模仿位置源。恶意应用程序可能会借此替代真正的位置源(例如 GPS 或网络提供商)返回的位置和/或状态。"</string>
-    <string name="permlab_accessLocationExtraCommands">"访问额外的位置提供程序命令"</string>
-    <string name="permdesc_accessLocationExtraCommands">"访问额外的位置提供程序命令。恶意应用程序可能会借此干扰 GPS 或其他位置源的操作。"</string>
-    <string name="permlab_accessFineLocation">"精准 (GPS) 位置"</string>
-    <string name="permdesc_accessFineLocation">"访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会借此确定您所处的位置,并可能消耗额外的电池电量。"</string>
-    <string name="permlab_accessCoarseLocation">"粗略(基于网络的)位置"</string>
-    <string name="permdesc_accessCoarseLocation">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可能会借此来确定您的大体位置。"</string>
+    <string name="permdesc_writeCalendar">"允许应用程序修改您手机上存储的日历活动。恶意应用程序可借此清除或修改您的日历数据。"</string>
+    <string name="permlab_accessMockLocation">"用于测试的模拟位置源"</string>
+    <string name="permdesc_accessMockLocation">"创建用于测试的模拟位置源。恶意应用程序可借此替代真正的位置源(如 GPS 或网络提供商)返回的位置和/或状态。"</string>
+    <string name="permlab_accessLocationExtraCommands">"允许访问额外的位置提供命令"</string>
+    <string name="permdesc_accessLocationExtraCommands">"访问额外的位置提供程序命令。恶意应用程序可借此干扰 GPS 或其他位置源的运作。"</string>
+    <!-- no translation found for permlab_installLocationProvider (6578101199825193873) -->
+    <skip />
+    <!-- no translation found for permdesc_installLocationProvider (5449175116732002106) -->
+    <skip />
+    <string name="permlab_accessFineLocation">"精准位置 (GPS)"</string>
+    <string name="permdesc_accessFineLocation">"访问精准的位置源,例如手机上的全球定位系统(如果适用)。恶意应用程序可能借此确定您所处的位置,并消耗额外的电池电量。"</string>
+    <string name="permlab_accessCoarseLocation">"粗略位置(所在网络)"</string>
+    <string name="permdesc_accessCoarseLocation">"访问粗略的位置源(例如蜂窝网络数据库)以确定手机的大体位置(如果适用)。恶意应用程序可借此确定您所处的大体位置。"</string>
     <string name="permlab_accessSurfaceFlinger">"访问 SurfaceFlinger"</string>
-    <string name="permdesc_accessSurfaceFlinger">"允许应用程序使用 SurfaceFlinger 低级功能。"</string>
+    <string name="permdesc_accessSurfaceFlinger">"允许应用程序使用 SurfaceFlinger 低级别功能。"</string>
     <string name="permlab_readFrameBuffer">"读取帧缓冲区"</string>
-    <string name="permdesc_readFrameBuffer">"允许应用程序使用(读取)帧缓冲区中的内容。"</string>
+    <string name="permdesc_readFrameBuffer">"允许应用程序读取帧缓冲区的内容。"</string>
     <string name="permlab_modifyAudioSettings">"更改您的音频设置"</string>
-    <string name="permdesc_modifyAudioSettings">"允许应用程序修改全局音频设置,例如音量和路由。"</string>
+    <string name="permdesc_modifyAudioSettings">"允许应用程序修改全局音频设置,如音量和路由。"</string>
     <string name="permlab_recordAudio">"录音"</string>
     <string name="permdesc_recordAudio">"允许应用程序访问录音路径。"</string>
     <string name="permlab_camera">"拍照"</string>
-    <string name="permdesc_camera">"允许应用程序通过相机拍照。这样应用程序可随时收集相机正在拍摄的图片。"</string>
-    <string name="permlab_brick">"永久禁用手机"</string>
-    <string name="permdesc_brick">"允许应用程序永久禁用整个手机,这是很危险的。"</string>
-    <string name="permlab_reboot">"强制手机重新引导"</string>
-    <string name="permdesc_reboot">"允许应用程序强制手机重新引导。"</string>
-    <string name="permlab_mount_unmount_filesystems">"装载和卸载文件系统"</string>
-    <string name="permdesc_mount_unmount_filesystems">"允许应用程序装载和卸载文件系统以进行可移动存储。"</string>
+    <string name="permdesc_camera">"允许应用程序使用相机拍照。此权限允许应用程序随时收集相机看到的图片。"</string>
+    <string name="permlab_brick">"永久停用手机"</string>
+    <string name="permdesc_brick">"允许应用程序永久停用整个手机,这非常危险。"</string>
+    <string name="permlab_reboot">"强行重新启动手机"</string>
+    <string name="permdesc_reboot">"允许应用程序强行重新启动手机。"</string>
+    <string name="permlab_mount_unmount_filesystems">"安装和卸载文件系统"</string>
+    <string name="permdesc_mount_unmount_filesystems">"允许应用程序安装和卸载可移动存储器的文件系统。"</string>
     <string name="permlab_mount_format_filesystems">"格式化外部存储设备"</string>
     <string name="permdesc_mount_format_filesystems">"允许应用程序格式化可移除的存储设备。"</string>
     <string name="permlab_vibrate">"控制振动器"</string>
@@ -277,103 +340,112 @@
     <string name="permlab_flashlight">"控制闪光灯"</string>
     <string name="permdesc_flashlight">"允许应用程序控制闪光灯。"</string>
     <string name="permlab_hardware_test">"测试硬件"</string>
-    <string name="permdesc_hardware_test">"允许应用程序控制各外围设备以进行硬件测试。"</string>
-    <string name="permlab_callPhone">"直接呼叫电话号码"</string>
-    <string name="permdesc_callPhone">"允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可能会借此在您的电话帐单上产生意外呼叫。请注意,此权限不允许应用程序呼叫紧急电话号码。"</string>
+    <string name="permdesc_hardware_test">"允许应用程序控制各种用于硬件测试的外围设备。"</string>
+    <string name="permlab_callPhone">"直接拨打电话号码"</string>
+    <string name="permdesc_callPhone">"允许应用程序在没有您干预的情况下呼叫电话号码。恶意应用程序可借此在您的话费单上产生意外通话费。请注意,此权限不允许应用程序呼叫紧急电话号码。"</string>
     <string name="permlab_callPrivileged">"直接呼叫任何电话号码"</string>
-    <string name="permdesc_callPrivileged">"允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可能会借此对紧急服务拨打骚扰电话和非法电话。"</string>
+    <string name="permdesc_callPrivileged">"允许应用程序在没有您干预的情况下呼叫任何电话号码(包括紧急电话号码)。恶意应用程序可借此对紧急服务拨打骚扰电话和非法电话。"</string>
     <string name="permlab_locationUpdates">"控制位置更新通知"</string>
-    <string name="permdesc_locationUpdates">"允许启用/禁用来自收音机的位置更新通知。普通应用程序不能使用此权限。"</string>
+    <string name="permdesc_locationUpdates">"允许启用/停用收音机的位置更新通知。普通应用程序不能使用此权限。"</string>
     <string name="permlab_checkinProperties">"访问检入属性"</string>
     <string name="permdesc_checkinProperties">"允许对检入服务上传的属性进行读/写访问。普通应用程序不能使用此权限。"</string>
     <string name="permlab_bindGadget">"选择窗口小部件"</string>
     <string name="permdesc_bindGadget">"允许应用程序告诉系统哪个应用程序可以使用哪些窗口小部件。具有该权限的应用程序可以允许其他应用程序访问个人数据。普通应用程序不适合使用此权限。"</string>
     <string name="permlab_modifyPhoneState">"修改手机状态"</string>
-    <string name="permdesc_modifyPhoneState">"允许应用程序控制设备的手机功能。具有此权限的应用程序可能会切换网络,打开和关闭手机收音机以及类似操作,而不会通知您。"</string>
+    <string name="permdesc_modifyPhoneState">"允许应用程序控制设备的手机功能。具有此权限的应用程序可切换网络、打开和关闭手机收音机等,而不通知您。"</string>
     <string name="permlab_readPhoneState">"读取手机状态"</string>
-    <string name="permdesc_readPhoneState">"允许应用程序访问设备的电话功能。具有此权限的应用程序可确定此电话的电话号码、是否在进行通话以及通话对方的号码等。"</string>
+    <string name="permdesc_readPhoneState">"允许应用程序访问设备的手机功能。具有此权限的应用程序可确定此手机的号码、是否在通话以及通话对方的号码等。"</string>
     <string name="permlab_wakeLock">"防止手机休眠"</string>
     <string name="permdesc_wakeLock">"允许应用程序防止手机进入休眠状态。"</string>
     <string name="permlab_devicePower">"开机或关机"</string>
     <string name="permdesc_devicePower">"允许应用程序打开或关闭手机。"</string>
     <string name="permlab_factoryTest">"在出厂测试模式下运行"</string>
-    <string name="permdesc_factoryTest">"作为一项低级制造商测试来运行,从而允许对手机硬件进行完全访问。此权限仅当手机在制造商测试模式下运行时才可用。"</string>
+    <string name="permdesc_factoryTest">"作为低级别制造商测试运行,以允许完全访问手机硬件。此权限只有当手机在制造商测试模式下运行时才可用。"</string>
     <string name="permlab_setWallpaper">"设置壁纸"</string>
     <string name="permdesc_setWallpaper">"允许应用程序设置系统壁纸。"</string>
-    <string name="permlab_setWallpaperHints">"大体设置壁纸大小"</string>
-    <string name="permdesc_setWallpaperHints">"允许应用程序大体设置系统壁纸大小。"</string>
-    <string name="permlab_masterClear">"将系统重设为出厂默认值"</string>
-    <string name="permdesc_masterClear">"允许应用程序将系统完全重设为其出厂设置,即清除所有数据、配置和安装的应用程序。"</string>
+    <string name="permlab_setWallpaperHints">"设置壁纸大小提示"</string>
+    <string name="permdesc_setWallpaperHints">"允许应用程序设置系统壁纸大小提示。"</string>
+    <string name="permlab_masterClear">"将系统重置为出厂时的默认设置"</string>
+    <string name="permdesc_masterClear">"允许应用程序将系统完全重置为出厂设置,即清除所有数据、配置和安装的应用程序。"</string>
     <string name="permlab_setTimeZone">"设置时区"</string>
     <string name="permdesc_setTimeZone">"允许应用程序更改手机的时区。"</string>
     <string name="permlab_getAccounts">"发现已知帐户"</string>
     <string name="permdesc_getAccounts">"允许应用程序获取手机已知的帐户列表。"</string>
     <string name="permlab_accessNetworkState">"查看网络状态"</string>
     <string name="permdesc_accessNetworkState">"允许应用程序查看所有网络的状态。"</string>
-    <string name="permlab_createNetworkSockets">"完全的互联网访问"</string>
+    <string name="permlab_createNetworkSockets">"不受限制的互联网访问权限"</string>
     <string name="permdesc_createNetworkSockets">"允许应用程序创建网络套接字。"</string>
-    <string name="permlab_writeApnSettings">"写入“接入点名称”设置"</string>
+    <string name="permlab_writeApnSettings">"写入接入点名称设置"</string>
     <string name="permdesc_writeApnSettings">"允许应用程序修改 APN 设置,例如任何 APN 的代理和端口。"</string>
-    <string name="permlab_changeNetworkState">"更改网络连接性"</string>
-    <string name="permdesc_changeNetworkState">"允许应用程序更改状态网络连接性。"</string>
+    <string name="permlab_changeNetworkState">"更改网络连接"</string>
+    <string name="permdesc_changeNetworkState">"允许应用程序更改网络连接状态。"</string>
     <string name="permlab_changeBackgroundDataSetting">"更改背景数据使用设置"</string>
     <string name="permdesc_changeBackgroundDataSetting">"允许应用程序更改背景数据使用设置。"</string>
     <string name="permlab_accessWifiState">"查看 Wi-Fi 状态"</string>
     <string name="permdesc_accessWifiState">"允许应用程序查看有关 Wi-Fi 状态的信息。"</string>
     <string name="permlab_changeWifiState">"更改 Wi-Fi 状态"</string>
-    <string name="permdesc_changeWifiState">"允许应用程序连接至 Wi-Fi 接入点以及与 Wi-Fi 接入点断开连接,并允许应用程序对配置的 Wi-Fi 网络进行更改。"</string>
+    <string name="permdesc_changeWifiState">"允许应用程序连接到 Wi-Fi 接入点以及与 Wi-Fi 接入点断开连接,并对配置的 Wi-Fi 网络进行更改。"</string>
+    <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+    <skip />
+    <!-- no translation found for permdesc_changeWifiMulticastState (8199464507656067553) -->
+    <skip />
     <string name="permlab_bluetoothAdmin">"蓝牙管理"</string>
-    <string name="permdesc_bluetoothAdmin">"允许应用程序配置本地蓝牙手机以及发现远程设备并与其配对。"</string>
+    <string name="permdesc_bluetoothAdmin">"允许应用程序配置本地蓝牙手机,以及查找远程设备并与之配对。"</string>
     <string name="permlab_bluetooth">"创建蓝牙连接"</string>
-    <string name="permdesc_bluetooth">"允许应用程序查看本地蓝牙手机的配置以及建立和接受与配对设备的连接。"</string>
-    <string name="permlab_disableKeyguard">"禁用键锁"</string>
-    <string name="permdesc_disableKeyguard">"允许应用程序禁用键锁和任何关联的密码安全措施。这种情况的一个恰当示例就是这样一个手机:当收到来电时禁用键锁,当通话结束后再重新启用键锁。"</string>
+    <string name="permdesc_bluetooth">"允许应用程序查看本地蓝牙手机的配置,以及建立和接受与配对设备的连接。"</string>
+    <string name="permlab_disableKeyguard">"停用键锁"</string>
+    <string name="permdesc_disableKeyguard">"允许应用程序停用键锁和任何关联的密码安全设置。这种情况的一个恰当示例就是这样一个手机:在接听来电时停用键锁,在通话结束后重新启用键锁。"</string>
     <string name="permlab_readSyncSettings">"读取同步设置"</string>
-    <string name="permdesc_readSyncSettings">"允许应用程序读取同步设置,例如是否为“联系人”启用同步。"</string>
+    <string name="permdesc_readSyncSettings">"允许应用程序读取同步设置,例如是否针对联系人启用同步。"</string>
     <string name="permlab_writeSyncSettings">"写入同步设置"</string>
-    <string name="permdesc_writeSyncSettings">"允许应用程序修改同步设置,例如是否针对“联系人”启用同步。"</string>
+    <string name="permdesc_writeSyncSettings">"允许应用程序修改同步设置,例如是否针对联系人启用同步。"</string>
     <string name="permlab_readSyncStats">"读取同步统计信息"</string>
-    <string name="permdesc_readSyncStats">"允许应用程序读取同步统计信息;例如已发生的同步的历史记录。"</string>
+    <string name="permdesc_readSyncStats">"允许应用程序读取同步统计信息;例如已发生的同步历史记录。"</string>
     <string name="permlab_subscribedFeedsRead">"读取订阅的供稿"</string>
-    <string name="permdesc_subscribedFeedsRead">"允许应用程序获取有关当前同步的供稿的详情。"</string>
+    <string name="permdesc_subscribedFeedsRead">"允许应用程序获取有关当前同步的供稿的详细信息。"</string>
     <string name="permlab_subscribedFeedsWrite">"写入订阅的供稿"</string>
-    <string name="permdesc_subscribedFeedsWrite">"允许应用程序修改您当前同步的供稿。这样恶意程序可以更改您同步的供稿。"</string>
+    <string name="permdesc_subscribedFeedsWrite">"允许应用程序修改您当前同步的供稿。恶意应用程序可借此更改您同步的供稿。"</string>
     <string name="permlab_readDictionary">"读取用户定义的词典"</string>
     <string name="permdesc_readDictionary">"允许应用程序读取用户在用户词典中存储的任意私有字词、名称和短语。"</string>
     <string name="permlab_writeDictionary">"写入用户定义的词典"</string>
     <string name="permdesc_writeDictionary">"允许应用程序向用户词典中写入新词。"</string>
+    <!-- no translation found for permlab_sdcardWrite (8079403759001777291) -->
+    <skip />
+    <!-- no translation found for permdesc_sdcardWrite (6643963204976471878) -->
+    <skip />
   <string-array name="phoneTypes">
-    <item>"家庭"</item>
+    <item>"住宅电话"</item>
     <item>"手机"</item>
-    <item>"工作"</item>
-    <item>"工作传真"</item>
-    <item>"家庭传真"</item>
+    <item>"单位电话"</item>
+    <item>"单位传真"</item>
+    <item>"住宅传真"</item>
     <item>"寻呼机"</item>
-    <item>"其他"</item>
-    <item>"自定义"</item>
+    <item>"其他电话"</item>
+    <item>"自定义电话"</item>
   </string-array>
   <string-array name="emailAddressTypes">
-    <item>"家庭"</item>
-    <item>"工作"</item>
-    <item>"其他"</item>
-    <item>"自定义"</item>
+    <item>"住宅邮箱"</item>
+    <item>"单位邮箱"</item>
+    <item>"其他邮箱"</item>
+    <item>"自定义邮箱"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"手机"</string>
   <string-array name="postalAddressTypes">
-    <item>"家庭"</item>
-    <item>"工作"</item>
-    <item>"其他"</item>
-    <item>"自定义"</item>
+    <item>"住宅地址"</item>
+    <item>"单位地址"</item>
+    <item>"其他地址"</item>
+    <item>"自定义地址"</item>
   </string-array>
   <string-array name="imAddressTypes">
-    <item>"家庭"</item>
-    <item>"工作"</item>
-    <item>"其他"</item>
-    <item>"自定义"</item>
+    <item>"住宅聊天工具"</item>
+    <item>"单位聊天工具"</item>
+    <item>"其他聊天工具"</item>
+    <item>"自定义聊天工具"</item>
   </string-array>
   <string-array name="organizationTypes">
-    <item>"工作"</item>
-    <item>"其他"</item>
-    <item>"自定义"</item>
+    <item>"单位"</item>
+    <item>"其他组织"</item>
+    <item>"自定义组织"</item>
   </string-array>
   <string-array name="imProtocols">
     <item>"AIM"</item>
@@ -387,32 +459,33 @@
   </string-array>
     <string name="keyguard_password_enter_pin_code">"输入 PIN 码"</string>
     <string name="keyguard_password_wrong_pin_code">"PIN 码不正确!"</string>
-    <string name="keyguard_label_text">"要解锁,请按“菜单”,然后按 0。"</string>
+    <string name="keyguard_label_text">"要解锁,请先按 MENU 再按 0。"</string>
     <string name="emergency_call_dialog_number_for_display">"紧急电话号码"</string>
     <string name="lockscreen_carrier_default">"(无服务)"</string>
     <string name="lockscreen_screen_locked">"屏幕已锁定。"</string>
-    <string name="lockscreen_instructions_when_pattern_enabled">"按“菜单”解锁或拨打紧急电话。"</string>
-    <string name="lockscreen_instructions_when_pattern_disabled">"按“菜单”解锁。"</string>
+    <string name="lockscreen_instructions_when_pattern_enabled">"按 MENU 解锁或拨打紧急电话。"</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"按 MENU 解锁。"</string>
     <string name="lockscreen_pattern_instructions">"绘制解锁图案"</string>
-    <string name="lockscreen_emergency_call">"紧急电话"</string>
+    <string name="lockscreen_emergency_call">"紧急呼叫"</string>
     <string name="lockscreen_pattern_correct">"正确!"</string>
     <string name="lockscreen_pattern_wrong">"很抱歉,请重试"</string>
     <string name="lockscreen_plugged_in">"正在充电 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"连接您的充电器。"</string>
     <string name="lockscreen_missing_sim_message_short">"没有 SIM 卡。"</string>
     <string name="lockscreen_missing_sim_message">"手机中无 SIM 卡。"</string>
     <string name="lockscreen_missing_sim_instructions">"请插入 SIM 卡。"</string>
     <string name="lockscreen_network_locked_message">"网络已锁定"</string>
-    <string name="lockscreen_sim_puk_locked_message">"已对 SIM 卡进行 PUK 码锁定。"</string>
-    <!-- no translation found for lockscreen_sim_puk_locked_instructions (635967534992394321) -->
-    <skip />
-    <string name="lockscreen_sim_locked_message">"SIM 卡已被锁定。"</string>
+    <string name="lockscreen_sim_puk_locked_message">"SIM 卡被 PUK 锁定。"</string>
+    <string name="lockscreen_sim_puk_locked_instructions">"请参阅《用户指南》或联系客服人员。"</string>
+    <string name="lockscreen_sim_locked_message">"SIM 卡被锁定。"</string>
     <string name="lockscreen_sim_unlock_progress_dialog_message">"正在解锁 SIM 卡..."</string>
-    <string name="lockscreen_too_many_failed_attempts_dialog_message">"您 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了您的解锁图案。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
-    <string name="lockscreen_failed_attempts_almost_glogin">"您已错误地绘制了您的解锁图案 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统会要求您使用您的 Google 登录帐户解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
+    <string name="lockscreen_too_many_failed_attempts_dialog_message">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。"\n\n"请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
+    <string name="lockscreen_failed_attempts_almost_glogin">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统会要求您使用自己的 Google 登录信息解锁手机。"\n\n"请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
     <string name="lockscreen_too_many_failed_attempts_countdown">"<xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
     <string name="lockscreen_forgot_pattern_button_text">"忘记了图案?"</string>
-    <string name="lockscreen_glogin_too_many_attempts">"图案尝试次数太多!"</string>
+    <string name="lockscreen_glogin_too_many_attempts">"图案尝试次数过多!"</string>
     <string name="lockscreen_glogin_instructions">"要解除锁定,请使用您的 Google 帐户登录"</string>
     <string name="lockscreen_glogin_username_hint">"用户名(电子邮件)"</string>
     <string name="lockscreen_glogin_password_hint">"密码"</string>
@@ -420,31 +493,42 @@
     <string name="lockscreen_glogin_invalid_input">"用户名或密码无效。"</string>
     <string name="hour_ampm">"<xliff:g id="AMPM">%P</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
     <string name="hour_cap_ampm">"<xliff:g id="AMPM">%p</xliff:g><xliff:g id="HOUR">%-l</xliff:g>点"</string>
-    <string name="status_bar_clear_all_button">"清除通知"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"无通知"</string>
-    <string name="status_bar_ongoing_events_title">"正在进行的"</string>
+    <string name="status_bar_ongoing_events_title">"正在进行"</string>
     <string name="status_bar_latest_events_title">"通知"</string>
     <string name="battery_status_text_percent_format">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
     <string name="battery_status_charging">"正在充电..."</string>
     <string name="battery_low_title">"请连接充电器"</string>
     <string name="battery_low_subtitle">"电量在减少:"</string>
     <string name="battery_low_percent_format">"剩余电量不足 <xliff:g id="NUMBER">%d%%</xliff:g>。"</string>
+    <!-- no translation found for battery_low_why (7655196144309694753) -->
+    <skip />
     <string name="factorytest_failed">"出厂测试失败"</string>
-    <string name="factorytest_not_system">"只有在 /system/app 中安装的包支持 FACTORY_TEST 操作。"</string>
+    <string name="factorytest_not_system">"只有 /system/app 中安装的包支持 FACTORY_TEST 操作。"</string>
     <string name="factorytest_no_action">"未发现支持 FACTORY_TEST 操作的包。"</string>
-    <string name="factorytest_reboot">"重新引导"</string>
+    <string name="factorytest_reboot">"重新启动"</string>
     <string name="js_dialog_title">"“<xliff:g id="TITLE">%s</xliff:g>”处的页面表明:"</string>
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"是否从该页面导航至它处?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"选择“确定”继续,或选择“取消”留在当前页面。"</string>
     <string name="save_password_label">"确认"</string>
+    <!-- no translation found for permlab_readHistoryBookmarks (1284843728203412135) -->
+    <skip />
+    <!-- no translation found for permdesc_readHistoryBookmarks (4981489815467617191) -->
+    <skip />
+    <!-- no translation found for permlab_writeHistoryBookmarks (9009434109836280374) -->
+    <skip />
+    <!-- no translation found for permdesc_writeHistoryBookmarks (945571990357114950) -->
+    <skip />
     <string name="save_password_message">"是否希望浏览器记住此密码?"</string>
-    <string name="save_password_notnow">"暂不保存"</string>
+    <string name="save_password_notnow">"此时不保存密码"</string>
     <string name="save_password_remember">"记住"</string>
     <string name="save_password_never">"从不"</string>
-    <string name="open_permission_deny">"您无权打开此页面。"</string>
-    <string name="text_copied">"文本已复制到剪贴板。"</string>
+    <string name="open_permission_deny">"您无权打开此网页。"</string>
+    <string name="text_copied">"文字已复制到剪贴板。"</string>
     <string name="more_item_label">"更多"</string>
-    <string name="prepend_shortcut_label">"“菜单”+"</string>
+    <string name="prepend_shortcut_label">"MENU+"</string>
     <string name="menu_space_shortcut_label">"空格"</string>
     <string name="menu_enter_shortcut_label">"Enter 键"</string>
     <string name="menu_delete_shortcut_label">"删除"</string>
@@ -516,8 +600,8 @@
     <item quantity="other">"<xliff:g id="COUNT">%d</xliff:g> 天后"</item>
   </plurals>
     <string name="preposition_for_date">"在 %s"</string>
-    <string name="preposition_for_time">"在 %s"</string>
-    <string name="preposition_for_year">"%s 年内"</string>
+    <string name="preposition_for_time">"在%s"</string>
+    <string name="preposition_for_year">"%s 年"</string>
     <string name="day">"天"</string>
     <string name="days">"天"</string>
     <string name="hour">"小时"</string>
@@ -530,77 +614,75 @@
     <string name="weeks">"周"</string>
     <string name="year">"年"</string>
     <string name="years">"年"</string>
-    <string name="every_weekday">"每个工作日(周一到周五)"</string>
+    <string name="every_weekday">"每个工作日(周一至周五)"</string>
     <string name="daily">"每天"</string>
     <string name="weekly">"每周的<xliff:g id="DAY">%s</xliff:g>"</string>
     <string name="monthly">"每月"</string>
     <string name="yearly">"每年"</string>
     <string name="VideoView_error_title">"无法播放视频"</string>
     <string name="VideoView_error_text_invalid_progressive_playback">"抱歉,该视频不适合在此设备上播放。"</string>
-    <string name="VideoView_error_text_unknown">"很抱歉,此视频不能播放。"</string>
+    <string name="VideoView_error_text_unknown">"很抱歉,无法播放此视频。"</string>
     <string name="VideoView_error_button">"确定"</string>
-    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
+    <string name="relative_time">"<xliff:g id="DATE">%1$s</xliff:g>,<xliff:g id="TIME">%2$s</xliff:g>"</string>
     <string name="noon">"中午"</string>
     <string name="Noon">"中午"</string>
     <string name="midnight">"午夜"</string>
     <string name="Midnight">"午夜"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"全选"</string>
-    <string name="selectText">"选择文本"</string>
-    <string name="stopSelectingText">"停止选择文本"</string>
+    <string name="selectText">"选择文字"</string>
+    <string name="stopSelectingText">"停止选择文字"</string>
     <string name="cut">"剪切"</string>
     <string name="cutAll">"全部剪切"</string>
     <string name="copy">"复制"</string>
     <string name="copyAll">"全部复制"</string>
     <string name="paste">"粘贴"</string>
     <string name="copyUrl">"复制网址"</string>
-    <string name="inputMethod">"输入方法"</string>
+    <string name="inputMethod">"输入法"</string>
     <string name="addToDictionary">"将“%s”添加到词典"</string>
-    <string name="editTextMenuTitle">"编辑文本"</string>
-    <string name="low_internal_storage_view_title">"存储空间不足"</string>
-    <string name="low_internal_storage_view_text">"手机存储空间在减少。"</string>
-    <string name="ok">"正常"</string>
+    <string name="editTextMenuTitle">"编辑文字"</string>
+    <string name="low_internal_storage_view_title">"空间不足"</string>
+    <string name="low_internal_storage_view_text">"手机存储空间正在减少。"</string>
+    <string name="ok">"确定"</string>
     <string name="cancel">"取消"</string>
-    <string name="yes">"正常"</string>
+    <string name="yes">"确定"</string>
     <string name="no">"取消"</string>
     <string name="dialog_alert_title">"注意事项"</string>
     <string name="capital_on">"开启"</string>
     <string name="capital_off">"关闭"</string>
     <string name="whichApplication">"使用以下内容完成操作"</string>
     <string name="alwaysUse">"默认用于执行此操作。"</string>
-    <string name="clearDefaultHintMsg">"通过“主页设置”&gt;“应用程序”&gt;“管理应用程序”清除默认值。"</string>
-    <string name="chooseActivity">"选择操作"</string>
+    <string name="clearDefaultHintMsg">"清除“主屏幕设置”&gt;“应用程序”&gt;“管理应用程序”中的默认设置。"</string>
+    <string name="chooseActivity">"选择一项操作"</string>
     <string name="noApplications">"没有应用程序可执行此操作。"</string>
     <string name="aerr_title">"很抱歉!"</string>
-    <string name="aerr_application">"应用程序<xliff:g id="APPLICATION">%1$s</xliff:g>(在进程 <xliff:g id="PROCESS">%2$s</xliff:g> 中)已意外停止。请重试。"</string>
-    <string name="aerr_process">"进程 <xliff:g id="PROCESS">%1$s</xliff:g> 已意外停止。请重试。"</string>
+    <string name="aerr_application">"应用程序<xliff:g id="APPLICATION">%1$s</xliff:g>(进程 <xliff:g id="PROCESS">%2$s</xliff:g>)意外停止,请重试。"</string>
+    <string name="aerr_process">"进程 <xliff:g id="PROCESS">%1$s</xliff:g> 已意外停止,请重试。"</string>
     <string name="anr_title">"很抱歉!"</string>
-    <string name="anr_activity_application">"活动<xliff:g id="ACTIVITY">%1$s</xliff:g>(在应用程序 <xliff:g id="APPLICATION">%2$s</xliff:g> 中)无响应。"</string>
-    <string name="anr_activity_process">"活动<xliff:g id="ACTIVITY">%1$s</xliff:g>(在进程 <xliff:g id="PROCESS">%2$s</xliff:g> 中)无响应。"</string>
-    <string name="anr_application_process">"应用程序<xliff:g id="APPLICATION">%1$s</xliff:g>(在进程 <xliff:g id="PROCESS">%2$s</xliff:g> 中)无响应。"</string>
-    <string name="anr_process">"进程 <xliff:g id="PROCESS">%1$s</xliff:g> 无响应。"</string>
-    <string name="force_close">"强制关闭"</string>
+    <string name="anr_activity_application">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动(在 <xliff:g id="APPLICATION">%2$s</xliff:g>应用程序中)无响应。"</string>
+    <string name="anr_activity_process">"<xliff:g id="ACTIVITY">%1$s</xliff:g>活动(在<xliff:g id="PROCESS">%2$s</xliff:g>进程中)无响应。"</string>
+    <string name="anr_application_process">"<xliff:g id="APPLICATION">%1$s</xliff:g>应用程序(在<xliff:g id="PROCESS">%2$s</xliff:g>进程中)无响应。"</string>
+    <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g>进程无响应。"</string>
+    <string name="force_close">"强行关闭"</string>
+    <!-- no translation found for report (4060218260984795706) -->
+    <skip />
     <string name="wait">"等待"</string>
     <string name="debug">"调试"</string>
-    <string name="sendText">"选择一个文本操作"</string>
-    <string name="volume_ringtone">"响铃音量"</string>
+    <string name="sendText">"选择要对文字执行的操作"</string>
+    <string name="volume_ringtone">"铃声音量"</string>
     <string name="volume_music">"媒体音量"</string>
-    <string name="volume_music_hint_playing_through_bluetooth">"正通过蓝牙播放"</string>
-    <string name="volume_call">"来电音量"</string>
+    <string name="volume_music_hint_playing_through_bluetooth">"通过蓝牙播放"</string>
+    <string name="volume_call">"通话音量"</string>
     <string name="volume_bluetooth_call">"使用蓝牙时的通话音量"</string>
-    <string name="volume_alarm">"警告音量"</string>
+    <string name="volume_alarm">"闹钟音量"</string>
     <string name="volume_notification">"通知音量"</string>
     <string name="volume_unknown">"音量"</string>
-    <string name="ringtone_default">"默认的手机铃声"</string>
-    <string name="ringtone_default_with_actual">"默认的手机铃声(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
+    <string name="ringtone_default">"默认铃声"</string>
+    <string name="ringtone_default_with_actual">"默认铃声(<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
     <string name="ringtone_silent">"静音"</string>
     <string name="ringtone_picker_title">"铃声"</string>
-    <string name="ringtone_unknown">"未知手机铃声"</string>
+    <string name="ringtone_unknown">"未知铃声"</string>
   <plurals name="wifi_available">
     <item quantity="one">"有可用的 Wi-Fi 网络"</item>
     <item quantity="other">"有可用的 Wi-Fi 网络"</item>
@@ -610,7 +692,7 @@
     <item quantity="other">"打开可用的 Wi-Fi 网络"</item>
   </plurals>
     <string name="select_character">"插入字符"</string>
-    <string name="sms_control_default_app_name">"未知应用程序"</string>
+    <string name="sms_control_default_app_name">"未知的应用程序"</string>
     <string name="sms_control_title">"正在发送短信"</string>
     <string name="sms_control_message">"正在发送大量短信。选择“确定”继续,或选择“取消”停止发送。"</string>
     <string name="sms_control_yes">"确定"</string>
@@ -622,12 +704,12 @@
     <string name="perms_show_all"><b>"全部显示"</b></string>
     <string name="googlewebcontenthelper_loading">"正在载入..."</string>
     <string name="usb_storage_title">"USB 已连接"</string>
-    <string name="usb_storage_message">"您已通过 USB 将手机连接至计算机。如果要在计算机和手机的 SD 卡之间复制文件,请选择“装载”。"</string>
-    <string name="usb_storage_button_mount">"装载"</string>
-    <string name="usb_storage_button_unmount">"不装载"</string>
+    <string name="usb_storage_message">"您已通过 USB 将手机连接至计算机。如果要在计算机和手机的 SD 卡之间复制文件,请选择“安装”。"</string>
+    <string name="usb_storage_button_mount">"安装"</string>
+    <string name="usb_storage_button_unmount">"不安装"</string>
     <string name="usb_storage_error_message">"使用 SD 卡进行 USB 存储时出现问题。"</string>
     <string name="usb_storage_notification_title">"USB 已连接"</string>
-    <string name="usb_storage_notification_message">"选择以将文件复制到计算机或从计算机复制文件。"</string>
+    <string name="usb_storage_notification_message">"选择以将文件复制到计算机/从计算机复制文件。"</string>
     <string name="usb_storage_stop_notification_title">"关闭 USB 存储设备"</string>
     <string name="usb_storage_stop_notification_message">"选中以关闭 USB 存储设备。"</string>
     <string name="usb_storage_stop_title">"关闭 USB 存储设备"</string>
@@ -638,22 +720,31 @@
     <string name="extmedia_format_title">"格式化 SD 卡"</string>
     <string name="extmedia_format_message">"您确定要格式化 SD 卡?卡上的所有数据都会丢失。"</string>
     <string name="extmedia_format_button_format">"格式化"</string>
-    <string name="select_input_method">"选择输入方法"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
+    <string name="select_input_method">"选择输入法"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"候选"</u></string>
     <string name="ext_media_checking_notification_title">"正在准备 SD 卡"</string>
-    <string name="ext_media_checking_notification_message">"检查是否有错误"</string>
+    <!-- no translation found for ext_media_checking_notification_message (8287319882926737053) -->
+    <skip />
     <string name="ext_media_nofs_notification_title">"空 SD 卡"</string>
-    <string name="ext_media_nofs_notification_message">"SD 卡为空或使用不支持的文件系统。"</string>
+    <!-- no translation found for ext_media_nofs_notification_message (3817704088027829380) -->
+    <skip />
     <string name="ext_media_unmountable_notification_title">"SD 卡受损"</string>
-    <string name="ext_media_unmountable_notification_message">"SD 卡受损。您可能需要重新格式化您的卡。"</string>
+    <!-- no translation found for ext_media_unmountable_notification_message (6902531775948238989) -->
+    <skip />
     <string name="ext_media_badremoval_notification_title">"SD 卡被意外拔除"</string>
     <string name="ext_media_badremoval_notification_message">"先卸载 SD 卡再拔除,以避免数据丢失。"</string>
     <string name="ext_media_safe_unmount_notification_title">"SD 卡已安全移除"</string>
-    <string name="ext_media_safe_unmount_notification_message">"现在可以安全移除 SD 卡。"</string>
+    <!-- no translation found for ext_media_safe_unmount_notification_message (568841278138377604) -->
+    <skip />
     <string name="ext_media_nomedia_notification_title">"已移除 SD 卡"</string>
-    <string name="ext_media_nomedia_notification_message">"SD 卡已移除。请插入新 SD 卡来增加您的设备存储空间。"</string>
+    <!-- no translation found for ext_media_nomedia_notification_message (3870120652983659641) -->
+    <skip />
     <string name="activity_list_empty">"找不到匹配的活动"</string>
     <string name="permlab_pkgUsageStats">"更新组件使用情况统计"</string>
     <string name="permdesc_pkgUsageStats">"允许修改收集的组件使用情况统计。普通应用程序不能使用此权限。"</string>
@@ -665,8 +756,10 @@
     <string name="ime_action_next">"下一步"</string>
     <string name="ime_action_done">"完成"</string>
     <string name="ime_action_default">"执行"</string>
-    <!-- no translation found for dial_number_using (5789176425167573586) -->
+    <string name="dial_number_using">"拨打电话"\n"<xliff:g id="NUMBER">%s</xliff:g>"</string>
+    <string name="create_contact_using">"创建电话号码为"\n"<xliff:g id="NUMBER">%s</xliff:g> 的联系人"</string>
+    <!-- no translation found for accessibility_compound_button_selected (5612776946036285686) -->
     <skip />
-    <!-- no translation found for create_contact_using (4947405226788104538) -->
+    <!-- no translation found for accessibility_compound_button_unselected (8864512895673924091) -->
     <skip />
 </resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8cace66..0f9c423 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -21,6 +21,7 @@
     <string name="gigabyteShort">"GB"</string>
     <string name="terabyteShort">"TB"</string>
     <string name="petabyteShort">"PB"</string>
+    <string name="fileSizeSuffix">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string>
     <string name="untitled">"(未命名)"</string>
     <string name="ellipsis">"..."</string>
     <string name="emptyPhoneNumber">"(沒有電話號碼)"</string>
@@ -48,6 +49,12 @@
     <string name="BaMmi">"通話限制"</string>
     <string name="PwdMmi">"變更密碼"</string>
     <string name="PinMmi">"PIN 已變更"</string>
+    <string name="CnipMmi">"顯示來電號碼"</string>
+    <string name="CnirMmi">"隱藏發話號碼"</string>
+    <string name="ThreeWCMmi">"三方通話"</string>
+    <string name="RuacMmi">"拒接不想接聽的騷擾電話"</string>
+    <string name="CndMmi">"顯示發話號碼"</string>
+    <string name="DndMmi">"勿干擾"</string>
     <string name="CLIRDefaultOnNextCallOn">"預設不顯示本機號碼,下一通電話也不顯示。"</string>
     <string name="CLIRDefaultOnNextCallOff">"預設不顯示本機號碼,但下一通電話顯示。"</string>
     <string name="CLIRDefaultOffNextCallOn">"預設顯示本機號碼,但下一通電話不顯示。"</string>
@@ -67,11 +74,27 @@
     <string name="serviceClassDataSync">"同步處理"</string>
     <string name="serviceClassPacket">"封包"</string>
     <string name="serviceClassPAD">"按鍵"</string>
+    <string name="roamingText0">"漫遊指示開啟"</string>
+    <string name="roamingText1">"漫遊指示關閉"</string>
+    <string name="roamingText2">"漫遊指示閃爍"</string>
+    <string name="roamingText3">"超出鄰近範圍"</string>
+    <string name="roamingText4">"超出建築物範圍"</string>
+    <string name="roamingText5">"漫遊 - 偏好系統"</string>
+    <string name="roamingText6">"漫遊 - 可用系統"</string>
+    <string name="roamingText7">"漫遊 - 聯盟合作夥伴"</string>
+    <string name="roamingText8">"漫遊 - Google Premium 合作夥伴"</string>
+    <string name="roamingText9">"漫遊 - 完整服務功能"</string>
+    <string name="roamingText10">"漫遊 - 部份服務功能"</string>
+    <string name="roamingText11">"漫遊橫幅開啟"</string>
+    <string name="roamingText12">"漫遊橫幅關閉"</string>
+    <string name="roamingTextSearching">"正在搜尋服務"</string>
     <string name="cfTemplateNotForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
     <string name="cfTemplateForwarded">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateForwardedTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:<xliff:g id="TIME_DELAY">{2}</xliff:g> 秒後 <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
     <string name="cfTemplateRegistered">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
     <string name="cfTemplateRegisteredTime">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>:未轉接"</string>
+    <string name="fcComplete">"功能碼輸入完成。"</string>
+    <string name="fcError">"連線發生問題或功能碼無效。"</string>
     <string name="httpErrorOk">"確定"</string>
     <string name="httpError">"網頁內容錯誤。"</string>
     <string name="httpErrorLookup">"找不到網址。"</string>
@@ -88,6 +111,7 @@
     <string name="httpErrorFile">"無法存取此檔案。"</string>
     <string name="httpErrorFileNotFound">"找不到要求的檔案。"</string>
     <string name="httpErrorTooManyRequests">"太多執行要求。請稍後再試一次。"</string>
+    <string name="certificateSaved">"憑證已儲存在系統的金鑰存放區。"</string>
     <string name="contentServiceSync">"同步處理"</string>
     <string name="contentServiceSyncNotificationTitle">"同步處理"</string>
     <string name="contentServiceTooManyDeletesNotificationDesc">"同時刪除太多 <xliff:g id="CONTENT_TYPE">%s</xliff:g>。"</string>
@@ -133,6 +157,8 @@
     <string name="permgroupdesc_systemTools">"系統低階存取與控制。"</string>
     <string name="permgrouplab_developmentTools">"開發工具"</string>
     <string name="permgroupdesc_developmentTools">"只有開發者需要此功能。"</string>
+    <string name="permgrouplab_storage">"儲存"</string>
+    <string name="permgroupdesc_storage">"存取 SD 卡。"</string>
     <string name="permlab_statusBar">"停用或變更狀態列"</string>
     <string name="permdesc_statusBar">"允許應用程式停用狀態列或新增、移除系統圖示。"</string>
     <string name="permlab_expandStatusBar">"展開/收攏狀態列"</string>
@@ -165,6 +191,10 @@
     <string name="permdesc_forceBack">"允許應用程式強制關閉在前端運作的活動並返回。一般應用程式不需要此功能。"</string>
     <string name="permlab_dump">"接收系統內部狀態"</string>
     <string name="permdesc_dump">"允許應用程式取得系統內部狀態。請注意:惡意程式可能利用此功能,不當取得私人或安全性資料。"</string>
+    <string name="permlab_shutdown">"部分關機"</string>
+    <string name="permdesc_shutdown">"讓活動管理員進入關機狀態,而不執行完整的關機程序。"</string>
+    <string name="permlab_stopAppSwitches">"防止切換應用程式"</string>
+    <string name="permdesc_stopAppSwitches">"防止使用者切換到其他應用程式。"</string>
     <string name="permlab_runSetActivityWatcher">"監視控制所有應用程式啟動狀態。"</string>
     <string name="permdesc_runSetActivityWatcher">"允許應用程式監控管理系統啟動活動。請注意:惡意程式可能因此癱瘓整個系統。此權限只在開發時需要,一般手機使用不需要此權限。"</string>
     <string name="permlab_broadcastPackageRemoved">"傳送程式已移除廣播"</string>
@@ -179,6 +209,8 @@
     <string name="permdesc_setAlwaysFinish">"允許應用程式控制哪些活動在被移到背景執行時,儘速結束。一般應用程式不需要此功能。"</string>
     <string name="permlab_batteryStats">"編輯電池狀態"</string>
     <string name="permdesc_batteryStats">"允許修改電池狀態。一般應用程式不會使用此功能。"</string>
+    <string name="permlab_backup">"控制系統備份與還原"</string>
+    <string name="permdesc_backup">"允許應用程式控制系統備份與還原機制,但一般應用程式不會使用此功能。"</string>
     <string name="permlab_internalSystemWindow">"顯示未授權視窗"</string>
     <string name="permdesc_internalSystemWindow">"允許內部系統使用介面建立視窗。一般應用程式不會使用此功能。"</string>
     <string name="permlab_systemAlertWindow">"顯示系統警示"</string>
@@ -245,6 +277,8 @@
     <string name="permdesc_accessMockLocation">"建立模擬位置來源以供測試。請注意:惡意程式可能利用此功能覆寫 GPS 或電信業者傳回的位置及/或狀態。"</string>
     <string name="permlab_accessLocationExtraCommands">"接收額外的位置提供者指令"</string>
     <string name="permdesc_accessLocationExtraCommands">"存取額外位置提供者命令。請注意:惡意程式可能利用此功能干擾 GPS 或其他位置來源。"</string>
+    <string name="permlab_installLocationProvider">"准許安裝位置提供者"</string>
+    <string name="permdesc_installLocationProvider">"建立虛構的位置來源以供測試。請注意:惡意應用程式可能利用此選項覆寫由真實位置來源 (例如 GPS 或網路供應商) 所傳回的位置及/或狀態,或者監控您的位置並將之提供給外部來源。"</string>
     <string name="permlab_accessFineLocation">"精確定位 (GPS)"</string>
     <string name="permdesc_accessFineLocation">"接收精確的位置來源 (例如:手機 GPS)。請注意:惡意程式可能使用此功能得知您的位置,並可能消耗額外電源。"</string>
     <string name="permlab_accessCoarseLocation">"約略位置 (以網路為基準)"</string>
@@ -317,6 +351,8 @@
     <string name="permdesc_accessWifiState">"允許應用程式檢視 Wi-Fi 狀態資訊。"</string>
     <string name="permlab_changeWifiState">"變更 Wi-Fi 狀態"</string>
     <string name="permdesc_changeWifiState">"允許應用程式與 Wi-Fi 存取點連線或中斷連線,並可變更 Wi-Fi 網路設定。"</string>
+    <string name="permlab_changeWifiMulticastState">"允許接收 Wi-Fi 多點傳播封包"</string>
+    <string name="permdesc_changeWifiMulticastState">"允許應用程式接收並非指定傳送給您裝置的封包,這在您發現附近有服務可使用時很有用,但消耗的電力比非多點傳播模式還要多。"</string>
     <string name="permlab_bluetoothAdmin">"藍牙管理"</string>
     <string name="permdesc_bluetoothAdmin">"允許應用程式設定本機藍牙電話,以及偵測與配對其他遠端裝置。"</string>
     <string name="permlab_bluetooth">"建立藍牙連線"</string>
@@ -337,6 +373,8 @@
     <string name="permdesc_readDictionary">"允許應用程式讀取使用者儲存在使用者字典內的任何私人字詞、名稱和詞組。"</string>
     <string name="permlab_writeDictionary">"寫入使用者定義的字典"</string>
     <string name="permdesc_writeDictionary">"允許應用程式將新字詞寫入使用者的字典。"</string>
+    <string name="permlab_sdcardWrite">"修改/刪除 SD 卡的內容"</string>
+    <string name="permdesc_sdcardWrite">"允許應用程式寫入 SD 卡。"</string>
   <string-array name="phoneTypes">
     <item>"住家電話"</item>
     <item>"行動電話"</item>
@@ -353,6 +391,7 @@
     <item>"其他信箱"</item>
     <item>"自訂"</item>
   </string-array>
+    <string name="mobileEmailTypeName">"行動裝置"</string>
   <string-array name="postalAddressTypes">
     <item>"住家"</item>
     <item>"公司"</item>
@@ -382,17 +421,19 @@
   </string-array>
     <string name="keyguard_password_enter_pin_code">"輸入 PIN 碼"</string>
     <string name="keyguard_password_wrong_pin_code">"PIN 碼錯誤!"</string>
-    <string name="keyguard_label_text">"如要解鎖,請按 [選單],然後按 [0]。"</string>
+    <string name="keyguard_label_text">"如要解鎖,請按 Menu 鍵,然後按 0。"</string>
     <string name="emergency_call_dialog_number_for_display">"緊急電話號碼"</string>
     <string name="lockscreen_carrier_default">"(沒有服務)"</string>
     <string name="lockscreen_screen_locked">"螢幕已鎖定。"</string>
     <string name="lockscreen_instructions_when_pattern_enabled">"按下 [選單] 解鎖或撥打緊急電話。"</string>
-    <string name="lockscreen_instructions_when_pattern_disabled">"按下 [選單] 解鎖。"</string>
+    <string name="lockscreen_instructions_when_pattern_disabled">"按下 Menu 鍵解鎖。"</string>
     <string name="lockscreen_pattern_instructions">"畫出解鎖圖形"</string>
     <string name="lockscreen_emergency_call">"緊急電話"</string>
     <string name="lockscreen_pattern_correct">"正確!"</string>
     <string name="lockscreen_pattern_wrong">"很抱歉,請再試一次"</string>
     <string name="lockscreen_plugged_in">"正在充電 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <!-- no translation found for lockscreen_charged (4938930459620989972) -->
+    <skip />
     <string name="lockscreen_low_battery">"請連接充電器。"</string>
     <string name="lockscreen_missing_sim_message_short">"沒有 SIM  卡。"</string>
     <string name="lockscreen_missing_sim_message">"手機未插入 SIM 卡。"</string>
@@ -414,7 +455,8 @@
     <string name="lockscreen_glogin_invalid_input">"使用者名稱或密碼錯誤。"</string>
     <string name="hour_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
     <string name="hour_cap_ampm">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
-    <string name="status_bar_clear_all_button">"清除通知"</string>
+    <!-- no translation found for status_bar_clear_all_button (7774721344716731603) -->
+    <skip />
     <string name="status_bar_no_notifications_title">"沒有通知"</string>
     <string name="status_bar_ongoing_events_title">"進行中"</string>
     <string name="status_bar_latest_events_title">"通知"</string>
@@ -423,6 +465,7 @@
     <string name="battery_low_title">"請連接充電器"</string>
     <string name="battery_low_subtitle">"電池電量即將不足:"</string>
     <string name="battery_low_percent_format">"電池電量不到 <xliff:g id="NUMBER">%d%%</xliff:g>。"</string>
+    <string name="battery_low_why">"原因"</string>
     <string name="factorytest_failed">"出廠測試失敗"</string>
     <string name="factorytest_not_system">"只有安裝在 /system/app 裡的程式才能支援 FACTORY_TEST 操作。"</string>
     <string name="factorytest_no_action">"找不到提供 FACTORY_TEST 的程式。"</string>
@@ -431,6 +474,10 @@
     <string name="js_dialog_title_default">"JavaScript"</string>
     <string name="js_dialog_before_unload">"離開此頁?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n" 選取 [確定] 離開此頁;或 [取消] 留在此頁。"</string>
     <string name="save_password_label">"確認"</string>
+    <string name="permlab_readHistoryBookmarks">"讀取瀏覽器的記錄與書籤"</string>
+    <string name="permdesc_readHistoryBookmarks">"允許應用程式讀取瀏覽器曾經造訪過的所有網址,以及瀏覽器的所有書籤。"</string>
+    <string name="permlab_writeHistoryBookmarks">"寫入瀏覽器的記錄與書籤"</string>
+    <string name="permdesc_writeHistoryBookmarks">"允許應用程式修改儲存在電話上的瀏覽記錄或書籤。請注意:惡意應用程式可能會使用此選項來清除或修改您瀏覽器的資料。"</string>
     <string name="save_password_message">"是否記憶此密碼?"</string>
     <string name="save_password_notnow">"現在不要"</string>
     <string name="save_password_remember">"記住"</string>
@@ -538,10 +585,6 @@
     <string name="Noon">"中午"</string>
     <string name="midnight">"午夜"</string>
     <string name="Midnight">"午夜"</string>
-    <!-- no translation found for month (7026169712234774086) -->
-    <skip />
-    <!-- no translation found for abbrev_month (3131032032850777433) -->
-    <skip />
     <string name="elapsed_time_short_format_mm_ss">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
     <string name="elapsed_time_short_format_h_mm_ss">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
     <string name="selectAll">"全部選取"</string>
@@ -579,6 +622,7 @@
     <string name="anr_application_process">"應用程式 <xliff:g id="APPLICATION">%1$s</xliff:g> (程序:<xliff:g id="PROCESS">%2$s</xliff:g>) 無回應。"</string>
     <string name="anr_process">"<xliff:g id="PROCESS">%1$s</xliff:g> 程序無回應。"</string>
     <string name="force_close">"強制關閉"</string>
+    <string name="report">"回報"</string>
     <string name="wait">"等待"</string>
     <string name="debug">"偵錯"</string>
     <string name="sendText">"訊息傳送方式"</string>
@@ -632,22 +676,26 @@
     <string name="extmedia_format_title">"將 SD 卡格式化"</string>
     <string name="extmedia_format_message">"確定要將 SD 卡格式化嗎?該 SD 卡中的所有資料將會遺失。"</string>
     <string name="extmedia_format_button_format">"格式化"</string>
+    <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+    <skip />
+    <!-- no translation found for adb_active_notification_message (4661997077344501389) -->
+    <skip />
     <string name="select_input_method">"選取輸入法"</string>
     <string name="fast_scroll_alphabet">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="fast_scroll_numeric_alphabet">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="candidates_style"><u>"待選項目"</u></string>
     <string name="ext_media_checking_notification_title">"正在準備 SD 卡"</string>
-    <string name="ext_media_checking_notification_message">"正在檢查錯誤"</string>
+    <string name="ext_media_checking_notification_message">"正在檢查錯誤。"</string>
     <string name="ext_media_nofs_notification_title">"SD 卡為空白"</string>
-    <string name="ext_media_nofs_notification_message">"SD 卡為空白或使用不支援的檔案系統。"</string>
+    <string name="ext_media_nofs_notification_message">"SD 卡內無檔案系統,或檔案系統不受支援。"</string>
     <string name="ext_media_unmountable_notification_title">"SD 卡已損壞"</string>
-    <string name="ext_media_unmountable_notification_message">"SD 卡已損壞。您可能需要將 SD 卡重新格式化。"</string>
+    <string name="ext_media_unmountable_notification_message">"SD 卡已毀損,您可能必須予以重新格式化。"</string>
     <string name="ext_media_badremoval_notification_title">"SD 卡未正常移除"</string>
     <string name="ext_media_badremoval_notification_message">"請先卸載 SD 卡,再將其移除,以免資料遺失。"</string>
     <string name="ext_media_safe_unmount_notification_title">"可安全移除 SD 卡"</string>
-    <string name="ext_media_safe_unmount_notification_message">"現在可以安全移除 SD 卡。"</string>
+    <string name="ext_media_safe_unmount_notification_message">"您現在可以安全地移除 SD 卡。"</string>
     <string name="ext_media_nomedia_notification_title">"已移除 SD 卡"</string>
-    <string name="ext_media_nomedia_notification_message">"已移除 SD 卡。請插入新的 SD 卡來增加裝置的儲存容量。"</string>
+    <string name="ext_media_nomedia_notification_message">"SD 卡已移除,請插入新的 SD 卡。"</string>
     <string name="activity_list_empty">"找不到符合的活動"</string>
     <string name="permlab_pkgUsageStats">"更新元件使用統計資料"</string>
     <string name="permdesc_pkgUsageStats">"允許修改收集到的元件使用統計資料。一般應用程式不會使用此功能。"</string>
@@ -661,4 +709,6 @@
     <string name="ime_action_default">"執行"</string>
     <string name="dial_number_using">"使用 <xliff:g id="NUMBER">%s</xliff:g>"\n"撥號"</string>
     <string name="create_contact_using">"建立手機號碼為 <xliff:g id="NUMBER">%s</xliff:g>"\n"的聯絡人"</string>
+    <string name="accessibility_compound_button_selected">"已勾選"</string>
+    <string name="accessibility_compound_button_unselected">"未勾選"</string>
 </resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 6f2a5d3..fd78f83 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2888,6 +2888,14 @@
              attribute.</i> -->
         <attr name="searchSettingsDescription" format="string" />
 
+        <!-- If provided and <code>true</code>, URLs entered in the search dialog while searching
+             within this activity would be detected and treated as URLs (show a 'go' button in the
+             keyboard and invoke the browser directly when user launches the URL instead of passing
+             the URL to the activity). If set to <code>false</code> any URLs entered are treated as
+             normal query text.
+             The default value is <code>false</code>. <i>Optional attribute.</i>. -->
+        <attr name="autoUrlDetect" format="boolean" />
+
     </declare-styleable>
 
     <!-- In order to process special action keys during search, you must define them using
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 7571e24..9dc483c 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -887,11 +887,12 @@
         <attr name="largeScreens" format="boolean" />
     </declare-styleable>
 
-    <!-- The <code>expandable</code> specifies if this package supports screen metrics
-         other than 320x480 dip.
-         <p>This appears as a child tag of the
+    <!-- Private tag to declare system protected broadcast actions.
+
+         <p>This appears as a child tag of the root
          {@link #AndroidManifest manifest} tag. -->
-    <declare-styleable name="AndroidManifestExpandable" parent="AndroidManifest">
+    <declare-styleable name="AndroidManifestProtectedBroadcast" parent="AndroidManifest">
+        <attr name="name" />
     </declare-styleable>
 
     <!-- The <code>provider</code> tag declares a
@@ -953,6 +954,20 @@
         <attr name="pathPattern" format="string" />
     </declare-styleable>
     
+    <!-- Attributes that can be supplied in an AndroidManifest.xml
+         <code>path-permission</code> tag, a child of the
+         {@link #AndroidManifestProvider provider} tag, describing a permission
+         that allows access to a specific path in the provider.  This tag can be
+         specified multiple time to supply multiple paths. -->
+    <declare-styleable name="AndroidManifestPathPermission"  parent="AndroidManifestProvider">
+        <attr name="path" />
+        <attr name="pathPrefix" />
+        <attr name="pathPattern" />
+        <attr name="permission" />
+        <attr name="readPermission" />
+        <attr name="writePermission" />
+    </declare-styleable>
+    
     <!-- The <code>service</code> tag declares a
          {@link android.app.Service} class that is available
          as part of the package's application components, implementing
diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml
index d284d0f..0fd6861 100644
--- a/core/res/res/values/colors.xml
+++ b/core/res/res/values/colors.xml
@@ -68,13 +68,13 @@
     <color name="darker_gray">#aaa</color>
 
     <!-- For security permissions -->
-    <color name="perms_dangerous_grp_color">#ffd57e</color>
-    <color name="perms_dangerous_perm_color">#ddb66a</color>
-    <color name="perms_normal_grp_color">#eeeeee</color>
-    <color name="perms_normal_perm_color">#c0c0c0</color>
+    <color name="perms_dangerous_grp_color">#dd6826</color>
+    <color name="perms_dangerous_perm_color">#dd6826</color>
     
     <!-- For search-related UIs -->
-    <color name="search_url_text">#7fa87f</color>
+    <color name="search_url_text_normal">#7fa87f</color>
+    <color name="search_url_text_selected">@android:color/black</color>
+    <color name="search_url_text_pressed">@android:color/black</color>
     <color name="search_widget_corpus_item_background">@android:color/lighter_gray</color>
 
 </resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 32c6937..871c651 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1125,6 +1125,7 @@
   <public type="attr" name="progressBarStyleLargeInverse" /> 
   <public type="attr" name="searchSettingsDescription" />
   <public type="attr" name="textColorPrimaryInverseDisableOnly" />
+  <public type="attr" name="autoUrlDetect" />
 
   <public-padding type="attr" name="donut_resource_pad" end="0x0101029f" />
 
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 7d235ec..8eda12e 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -348,7 +348,8 @@
     </style>
 
     <style name="Widget.TextView.ListSeparator.White">
-        <item name="android:textColor">?textColorSecondaryInverse</item>
+        <item name="android:textColor">?textColorPrimaryInverse</item>
+        <item name="android:background">@android:drawable/light_header</item>
     </style>
 
     <style name="Widget.EditText">
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index be836eb..e3fffb7 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -325,6 +325,32 @@
         <item name="android:windowContentOverlay">@null</item>
         <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
         <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
+
+        <item name="textAppearance">@android:style/TextAppearance</item>
+        <item name="textAppearanceInverse">@android:style/TextAppearance.Inverse</item>
+
+        <item name="textColorPrimary">@android:color/primary_text_dark</item>
+        <item name="textColorSecondary">@android:color/secondary_text_dark</item>
+        <item name="textColorTertiary">@android:color/tertiary_text_dark</item>
+        <item name="textColorPrimaryInverse">@android:color/primary_text_light</item>
+        <item name="textColorSecondaryInverse">@android:color/secondary_text_light</item>
+        <item name="textColorTertiaryInverse">@android:color/tertiary_text_light</item>
+        <item name="textColorPrimaryDisableOnly">@android:color/primary_text_dark_disable_only</item>
+        <item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_light_disable_only</item>
+        <item name="textColorPrimaryNoDisable">@android:color/primary_text_dark_nodisable</item>
+        <item name="textColorSecondaryNoDisable">@android:color/secondary_text_dark_nodisable</item>
+        <item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_light_nodisable</item>
+        <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item>
+        <item name="textColorHint">@android:color/hint_foreground_dark</item>
+        <item name="textColorHintInverse">@android:color/hint_foreground_light</item>
+        <item name="textColorSearchUrl">@android:color/search_url_text</item>
+
+        <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
+        <item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item>
+        <item name="textAppearanceSmall">@android:style/TextAppearance.Small</item>
+        <item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item>
+        <item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item>
+        <item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item>
     </style>
 
     <!-- Default theme for alert dialog windows, which is used by the
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 0bd3276..a3579c7 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -143,8 +143,6 @@
     <!-- This is a list of all the libraries available for application
          code to link against. -->
 
-    <library name="android.awt"
-            file="/system/framework/android.awt.jar" />
     <library name="android.test.runner"
             file="/system/framework/android.test.runner.jar" />
     <library name="com.android.im.plugin"
diff --git a/data/sounds/AudioPackage2.mk b/data/sounds/AudioPackage2.mk
index aea3f0b..649787e 100644
--- a/data/sounds/AudioPackage2.mk
+++ b/data/sounds/AudioPackage2.mk
@@ -23,7 +23,7 @@
 	$(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
 	$(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
 	$(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
-	$(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/Silence.ogg \
+	$(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/notifications/Silence.ogg \
 	$(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
 	$(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
 	$(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
diff --git a/data/sounds/OriginalAudio.mk b/data/sounds/OriginalAudio.mk
index 8c8fc32..fc1e921 100644
--- a/data/sounds/OriginalAudio.mk
+++ b/data/sounds/OriginalAudio.mk
@@ -22,7 +22,7 @@
 	$(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \
 	$(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \
 	$(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \
-	$(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/Silence.ogg \
+	$(LOCAL_PATH)/Silence.ogg:system/media/audio/ringtones/notifications/Silence.ogg \
 	$(LOCAL_PATH)/newwavelabs/BeatPlucker.ogg:system/media/audio/ringtones/BeatPlucker.ogg \
 	$(LOCAL_PATH)/newwavelabs/BentleyDubs.ogg:system/media/audio/ringtones/BentleyDubs.ogg \
 	$(LOCAL_PATH)/newwavelabs/BirdLoop.ogg:system/media/audio/ringtones/BirdLoop.ogg \
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index e2e93eb..df659ef 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -18,6 +18,7 @@
 
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.DisplayMetrics;
 
 import java.io.OutputStream;
 import java.nio.Buffer;
@@ -31,8 +32,6 @@
      *
      * @see Bitmap#getDensityScale()
      * @see Bitmap#setDensityScale(float)
-     *
-     * @hide pending API council approval
      */
     public static final float DENSITY_SCALE_UNKNOWN = -1.0f;
 
@@ -84,11 +83,9 @@
      * @see #setDensityScale(float)
      * @see #isAutoScalingEnabled()
      * @see #setAutoScalingEnabled(boolean)
-     * @see android.util.DisplayMetrics#DEFAULT_DENSITY
+     * @see android.util.DisplayMetrics#DENSITY_DEFAULT
      * @see android.util.DisplayMetrics#density
      * @see #DENSITY_SCALE_UNKNOWN
-     *
-     * @hide pending API council approval
      */
     public float getDensityScale() {
         return mDensityScale;
@@ -106,11 +103,9 @@
      * @see #getDensityScale()
      * @see #isAutoScalingEnabled()
      * @see #setAutoScalingEnabled(boolean)
-     * @see android.util.DisplayMetrics#DEFAULT_DENSITY
+     * @see android.util.DisplayMetrics#DENSITY_DEFAULT
      * @see android.util.DisplayMetrics#density
      * @see #DENSITY_SCALE_UNKNOWN
-     *
-     * @hide pending API council approval
      */
     public void setDensityScale(float densityScale) {
         mDensityScale = densityScale;
@@ -132,8 +127,6 @@
      * @see #setAutoScalingEnabled(boolean)
      * @see #getDensityScale()
      * @see #setDensityScale(float)
-     *
-     * @hide pending API council approval
      */
     public boolean isAutoScalingEnabled() {
         return mAutoScaling;
@@ -150,8 +143,6 @@
      * the bitmap will never be automatically scaled at drawing time.</p>
      *
      * @param autoScalingEnabled True to scale the bitmap at drawing time, false otherwise.
-     *
-     * @hide pending API council approval
      */
     public void setAutoScalingEnabled(boolean autoScalingEnabled) {
         mAutoScaling = autoScalingEnabled;
@@ -465,8 +456,8 @@
 
         // The new bitmap was created from a known bitmap source so assume that
         // they use the same density scale
-        bitmap.setDensityScale(source.getDensityScale());
-        bitmap.setAutoScalingEnabled(source.isAutoScalingEnabled());
+        bitmap.mDensityScale = source.mDensityScale;
+        bitmap.mAutoScaling = source.mAutoScaling;
 
         return bitmap;
     }
@@ -615,26 +606,60 @@
      * Convenience method that returns the width of this bitmap divided
      * by the density scale factor.
      *
+     * @param canvas The Canvas the bitmap will be drawn to.
      * @return The scaled width of this bitmap, according to the density scale factor.
-     *
-     * @hide pending API council approval
      */
-    public int getScaledWidth() {
-        final float scale = getDensityScale();
-        return scale == DENSITY_SCALE_UNKNOWN ? getWidth() : (int) (getWidth() / scale);
+    public int getScaledWidth(Canvas canvas) {
+        final float scale = mDensityScale;
+        if (!mAutoScaling || scale < 0) {
+            return getWidth();
+        }
+        return (int)(getWidth() * canvas.getDensityScale() / scale);
     }
 
     /**
      * Convenience method that returns the height of this bitmap divided
      * by the density scale factor.
      *
+     * @param canvas The Canvas the bitmap will be drawn to.
      * @return The scaled height of this bitmap, according to the density scale factor.
-     *
-     * @hide pending API council approval
      */
-    public int getScaledHeight() {
-        final float scale = getDensityScale();
-        return scale == DENSITY_SCALE_UNKNOWN ? getWidth() : (int) (getHeight() / scale);
+    public int getScaledHeight(Canvas canvas) {
+        final float scale = mDensityScale;
+        if (!mAutoScaling || scale < 0) {
+            return getHeight();
+        }
+        return (int)(getHeight() * canvas.getDensityScale() / scale);
+    }
+
+    /**
+     * Convenience method that returns the width of this bitmap divided
+     * by the density scale factor.
+     *
+     * @param metrics The target display metrics.
+     * @return The scaled width of this bitmap, according to the density scale factor.
+     */
+    public int getScaledWidth(DisplayMetrics metrics) {
+        final float scale = mDensityScale;
+        if (!mAutoScaling || scale < 0) {
+            return getWidth();
+        }
+        return (int)(getWidth() * metrics.density / scale);
+    }
+
+    /**
+     * Convenience method that returns the height of this bitmap divided
+     * by the density scale factor.
+     *
+     * @param metrics The target display metrics.
+     * @return The scaled height of this bitmap, according to the density scale factor.
+     */
+    public int getScaledHeight(DisplayMetrics metrics) {
+        final float scale = mDensityScale;
+        if (!mAutoScaling || scale < 0) {
+            return getHeight();
+        }
+        return (int)(getHeight() * metrics.density / scale);
     }
 
     /**
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index e5a9aab..76abaa2 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -81,10 +81,8 @@
         /**
          * The desired pixel density of the bitmap.
          *
-         * @see android.util.DisplayMetrics#DEFAULT_DENSITY
+         * @see android.util.DisplayMetrics#DENSITY_DEFAULT
          * @see android.util.DisplayMetrics#density
-         *
-         * @hide pending API council approval
          */
         public int inDensity;
 
@@ -97,8 +95,6 @@
          * a non-scaled version of the bitmap. In this case,
          * {@link android.graphics.Bitmap#setAutoScalingEnabled(boolean)} can be used
          * to properly scale the bitmap at drawing time.</p>
-         *
-         * @hide pending API council approval
          */
         public boolean inScaled;
 
@@ -129,6 +125,19 @@
         public boolean inInputShareable;
 
         /**
+         * Normally bitmap allocations count against the dalvik heap, which
+         * means they help trigger GCs when a lot have been allocated. However,
+         * in rare cases, the caller may want to allocate the bitmap outside of
+         * that heap. To request that, set inNativeAlloc to true. In these
+         * rare instances, it is solely up to the caller to ensure that OOM is
+         * managed explicitly by calling bitmap.recycle() as soon as such a
+         * bitmap is no longer needed.
+         *
+         * @hide pending API council approval
+         */
+        public boolean inNativeAlloc;
+
+        /**
          * The resulting width of the bitmap, set independent of the state of
          * inJustDecodeBounds. However, if there is an error trying to decode,
          * outWidth will be set to -1.
@@ -225,8 +234,6 @@
     /**
      * Decode a new Bitmap from an InputStream. This InputStream was obtained from
      * resources, which we pass to be able to scale the bitmap accordingly.
-     *
-     * @hide
      */
     public static Bitmap decodeStream(Resources res, TypedValue value, InputStream is,
             Rect pad, Options opts) {
@@ -238,15 +245,19 @@
         Bitmap bm = decodeStream(is, pad, opts);
 
         if (bm != null && res != null && value != null) {
+            final int density = value.density;
+            if (density == TypedValue.DENSITY_NONE) {
+                return bm;
+            }
+            
             byte[] np = bm.getNinePatchChunk();
             final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np);
 
-            final int density = value.density;
             if (opts.inDensity == 0) {
                 opts.inDensity = density == TypedValue.DENSITY_DEFAULT ?
-                        DisplayMetrics.DEFAULT_DENSITY : density;
+                        DisplayMetrics.DENSITY_DEFAULT : density;
             }
-            float scale = opts.inDensity / (float) DisplayMetrics.DEFAULT_DENSITY;
+            float scale = opts.inDensity / (float) DisplayMetrics.DENSITY_DEFAULT;
 
             if (opts.inScaled || isNinePatch) {
                 bm.setDensityScale(1.0f);
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 4498e1a..da73597 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -184,8 +184,6 @@
      *
      * @see #setDensityScale(float)
      * @see Bitmap#getDensityScale() 
-     *
-     * @hide pending API council approval
      */
     public float getDensityScale() {
         if (mBitmap != null) {
@@ -205,8 +203,6 @@
      *
      * @see #getDensityScale()
      * @see Bitmap#setDensityScale(float) 
-     *
-     * @hide pending API council approval
      */
     public void setDensityScale(float densityScale) {
         if (mBitmap != null) {
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index d24194f..6677a35 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -278,10 +278,15 @@
         if (name.equals("padding")) {
             TypedArray a = r.obtainAttributes(attrs,
                     com.android.internal.R.styleable.ShapeDrawablePadding);
-            setPadding(a.getInt(com.android.internal.R.styleable.ShapeDrawablePadding_left, 0),
-                       a.getInt(com.android.internal.R.styleable.ShapeDrawablePadding_top, 0),
-                       a.getInt(com.android.internal.R.styleable.ShapeDrawablePadding_right, 0),
-                       a.getInt(com.android.internal.R.styleable.ShapeDrawablePadding_bottom, 0));
+            setPadding(
+                    a.getDimensionPixelOffset(
+                            com.android.internal.R.styleable.ShapeDrawablePadding_left, 0),
+                    a.getDimensionPixelOffset(
+                            com.android.internal.R.styleable.ShapeDrawablePadding_top, 0),
+                    a.getDimensionPixelOffset(
+                            com.android.internal.R.styleable.ShapeDrawablePadding_right, 0),
+                    a.getDimensionPixelOffset(
+                            com.android.internal.R.styleable.ShapeDrawablePadding_bottom, 0));
             a.recycle();
             return true;
         }
diff --git a/include/ui/Camera.h b/include/ui/Camera.h
index e3544ab..afb07b5 100644
--- a/include/ui/Camera.h
+++ b/include/ui/Camera.h
@@ -18,6 +18,7 @@
 #ifndef ANDROID_HARDWARE_CAMERA_H
 #define ANDROID_HARDWARE_CAMERA_H
 
+#include <utils/Timers.h>
 #include <ui/ICameraClient.h>
 
 namespace android {
@@ -94,6 +95,7 @@
 public:
     virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
     virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr) = 0;
+    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
 };
 
 class Camera : public BnCameraClient, public IBinder::DeathRecipient
@@ -155,6 +157,7 @@
     // ICameraClient interface
     virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
     virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr);
+    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
 
     sp<ICamera>         remote();
 
diff --git a/include/ui/CameraHardwareInterface.h b/include/ui/CameraHardwareInterface.h
index 73036f0..822b4a8 100644
--- a/include/ui/CameraHardwareInterface.h
+++ b/include/ui/CameraHardwareInterface.h
@@ -28,7 +28,7 @@
 typedef void (*preview_callback)(const sp<IMemory>& mem, void* user);
 
 /** Callback for startRecord() */
-typedef void (*recording_callback)(const sp<IMemory>& mem, void* user);
+typedef void (*recording_callback)(nsecs_t timestamp, const sp<IMemory>& mem, void* user);
 
 /** Callback for takePicture() */
 typedef void (*shutter_callback)(void* user);
diff --git a/include/ui/ICameraClient.h b/include/ui/ICameraClient.h
index c4bdd07..1001c71 100644
--- a/include/ui/ICameraClient.h
+++ b/include/ui/ICameraClient.h
@@ -21,6 +21,7 @@
 #include <utils/IInterface.h>
 #include <utils/Parcel.h>
 #include <utils/IMemory.h>
+#include <utils/Timers.h>
 
 namespace android {
 
@@ -31,7 +32,7 @@
 
     virtual void            notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
     virtual void            dataCallback(int32_t msgType, const sp<IMemory>& data) = 0;
-
+    virtual void            dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) = 0;
 };
 
 // ----------------------------------------------------------------------------
diff --git a/include/utils/ResourceTypes.h b/include/utils/ResourceTypes.h
index 93bca4a..3819335 100644
--- a/include/utils/ResourceTypes.h
+++ b/include/utils/ResourceTypes.h
@@ -825,7 +825,8 @@
     };
     
     enum {
-        DENSITY_ANY = 0
+        DENSITY_DEFAULT = 0,
+        DENSITY_NONE = 0xffff
     };
     
     union {
diff --git a/include/utils/String8.h b/include/utils/String8.h
index c49faf6..ecc5774 100644
--- a/include/utils/String8.h
+++ b/include/utils/String8.h
@@ -29,11 +29,107 @@
 
 // ---------------------------------------------------------------------------
 
+extern "C" {
+
+typedef uint32_t char32_t;
+
+size_t strlen32(const char32_t *);
+size_t strnlen32(const char32_t *, size_t);
+
+/*
+ * Returns the length of "src" when "src" is valid UTF-8 string.
+ * Returns 0 if src is NULL, 0-length string or non UTF-8 string.
+ * This function should be used to determine whether "src" is valid UTF-8
+ * characters with valid unicode codepoints. "src" must be null-terminated.
+ *
+ * If you are going to use other GetUtf... functions defined in this header
+ * with string which may not be valid UTF-8 with valid codepoint (form 0 to
+ * 0x10FFFF), you should use this function before calling others, since the
+ * other functions do not check whether the string is valid UTF-8 or not.
+ *
+ * If you do not care whether "src" is valid UTF-8 or not, you should use
+ * strlen() as usual, which should be much faster.
+ */
+size_t utf8_length(const char *src);
+
+/*
+ * Returns the UTF-32 length of "src".
+ */
+size_t utf32_length(const char *src, size_t src_len);
+
+/*
+ * Returns the UTF-8 length of "src".
+ */
+size_t utf8_length_from_utf32(const char32_t *src, size_t src_len);
+
+/*
+ * Returns the unicode value at "index".
+ * Returns -1 when the index is invalid (equals to or more than "src_len").
+ * If returned value is positive, it is able to be converted to char32_t, which
+ * is unsigned. Then, if "next_index" is not NULL, the next index to be used is
+ * stored in "next_index". "next_index" can be NULL.
+ */
+int32_t utf32_at(const char *src, size_t src_len,
+                 size_t index, size_t *next_index);
+
+/*
+ * Stores a UTF-32 string converted from "src" in "dst", if "dst_length" is not
+ * large enough to store the string, the part of the "src" string is stored
+ * into "dst".
+ * Returns the size actually used for storing the string.
+ * "dst" is not null-terminated when dst_len is fully used (like strncpy).
+ */
+size_t utf8_to_utf32(const char* src, size_t src_len,
+                     char32_t* dst, size_t dst_len);
+
+/*
+ * Stores a UTF-8 string converted from "src" in "dst", if "dst_length" is not
+ * large enough to store the string, the part of the "src" string is stored
+ * into "dst" as much as possible. See the examples for more detail.
+ * Returns the size actually used for storing the string.
+ * dst" is not null-terminated when dst_len is fully used (like strncpy).
+ *
+ * Example 1
+ * "src" == \u3042\u3044 (\xE3\x81\x82\xE3\x81\x84)
+ * "src_len" == 2
+ * "dst_len" >= 7
+ * ->
+ * Returned value == 6
+ * "dst" becomes \xE3\x81\x82\xE3\x81\x84\0
+ * (note that "dst" is null-terminated)
+ *
+ * Example 2
+ * "src" == \u3042\u3044 (\xE3\x81\x82\xE3\x81\x84)
+ * "src_len" == 2
+ * "dst_len" == 5
+ * ->
+ * Returned value == 3
+ * "dst" becomes \xE3\x81\x82\0
+ * (note that "dst" is null-terminated, but \u3044 is not stored in "dst"
+ * since "dst" does not have enough size to store the character)
+ *
+ * Example 3
+ * "src" == \u3042\u3044 (\xE3\x81\x82\xE3\x81\x84)
+ * "src_len" == 2
+ * "dst_len" == 6
+ * ->
+ * Returned value == 6
+ * "dst" becomes \xE3\x81\x82\xE3\x81\x84
+ * (note that "dst" is NOT null-terminated, like strncpy)
+ */
+size_t utf32_to_utf8(const char32_t* src, size_t src_len,
+                     char* dst, size_t dst_len);
+
+}
+
+// ---------------------------------------------------------------------------
+
 namespace android {
 
 class TextOutput;
 
-//! This is a string holding UTF-8 characters.
+//! This is a string holding UTF-8 characters. Does not allow the value more
+// than 0x10FFFF, which is not valid unicode codepoint.
 class String8
 {
 public:
@@ -45,7 +141,8 @@
     explicit                    String8(const String16& o);
     explicit                    String8(const char16_t* o);
     explicit                    String8(const char16_t* o, size_t numChars);
-    
+    explicit                    String8(const char32_t* o);
+    explicit                    String8(const char32_t* o, size_t numChars);
                                 ~String8();
     
     inline  const char*         string() const;
@@ -59,11 +156,20 @@
             status_t            setTo(const char* other);
             status_t            setTo(const char* other, size_t numChars);
             status_t            setTo(const char16_t* other, size_t numChars);
-    
+            status_t            setTo(const char32_t* other,
+                                      size_t length);
+
             status_t            append(const String8& other);
             status_t            append(const char* other);
             status_t            append(const char* other, size_t numChars);
 
+            // Note that this function takes O(N) time to calculate the value.
+            // No cache value is stored.
+            size_t              getUtf32Length() const;
+            int32_t             getUtf32At(size_t index,
+                                           size_t *next_index) const;
+            size_t              getUtf32(char32_t* dst, size_t dst_len) const;
+
     inline  String8&            operator=(const String8& other);
     inline  String8&            operator=(const char* other);
     
@@ -103,7 +209,7 @@
             void                toLower(size_t start, size_t numChars);
             void                toUpper();
             void                toUpper(size_t start, size_t numChars);
-            
+
     /*
      * These methods operate on the string as if it were a path name.
      */
@@ -346,7 +452,7 @@
     return mString;
 }
 
-}; // namespace android
+}  // namespace android
 
 // ---------------------------------------------------------------------------
 
diff --git a/keystore/java/android/security/CertTool.java b/keystore/java/android/security/CertTool.java
index 26d22ae..c96cd4f 100644
--- a/keystore/java/android/security/CertTool.java
+++ b/keystore/java/android/security/CertTool.java
@@ -16,11 +16,19 @@
 
 package android.security;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+
 import android.content.Context;
 import android.content.Intent;
 import android.security.Keystore;
 import android.text.TextUtils;
-
+import android.util.Log;
 
 /**
  * The CertTool class provides the functions to list the certs/keys,
@@ -41,12 +49,12 @@
     public static final String KEY_NAMESPACE = "namespace";
     public static final String KEY_DESCRIPTION = "description";
 
-    private static final String TAG = "CertTool";
+    public static final String TITLE_CA_CERT = "CA Certificate";
+    public static final String TITLE_USER_CERT = "User Certificate";
+    public static final String TITLE_PKCS12_KEYSTORE = "PKCS12 Keystore";
+    public static final String TITLE_PRIVATE_KEY = "Private Key";
 
-    private static final String TITLE_CA_CERT = "CA Certificate";
-    private static final String TITLE_USER_CERT = "User Certificate";
-    private static final String TITLE_PKCS12_KEYSTORE = "PKCS12 Keystore";
-    private static final String TITLE_PRIVATE_KEY = "Private Key";
+    private static final String TAG = "CertTool";
     private static final String UNKNOWN = "Unknown";
     private static final String ISSUER_NAME = "Issuer Name:";
     private static final String DISTINCT_NAME = "Distinct Name:";
@@ -58,6 +66,11 @@
     private static final String KEYNAME_DELIMITER = "_";
     private static final Keystore sKeystore = Keystore.getInstance();
 
+    private native int getPkcs12Handle(byte[] data, String password);
+    private native String getPkcs12Certificate(int handle);
+    private native String getPkcs12PrivateKey(int handle);
+    private native String popPkcs12CertificateStack(int handle);
+    private native void freePkcs12Handle(int handle);
     private native String generateCertificateRequest(int bits, String subject);
     private native boolean isPkcs12Keystore(byte[] data);
     private native int generateX509Certificate(byte[] data);
@@ -130,10 +143,35 @@
         intent.putExtra(KEY_NAMESPACE + "1", namespace);
     }
 
+    public int addPkcs12Keystore(byte[] p12Data, String password,
+            String keyname) {
+        int handle, i = 0;
+        String pemData;
+        Log.i("CertTool", "addPkcs12Keystore()");
+
+        if ((handle = getPkcs12Handle(p12Data, password)) == 0) return -1;
+        if ((pemData = getPkcs12Certificate(handle)) != null) {
+            sKeystore.put(USER_CERTIFICATE, keyname, pemData);
+        }
+        if ((pemData = getPkcs12PrivateKey(handle)) != null) {
+            sKeystore.put(USER_KEY, keyname, pemData);
+        }
+        while ((pemData = this.popPkcs12CertificateStack(handle)) != null) {
+            if (i++ > 0) {
+                sKeystore.put(CA_CERTIFICATE, keyname + i, pemData);
+            } else {
+                sKeystore.put(CA_CERTIFICATE, keyname, pemData);
+            }
+        }
+        freePkcs12Handle(handle);
+        return 0;
+    }
+
     public synchronized void addCertificate(byte[] data, Context context) {
         int handle;
         Intent intent = null;
 
+        Log.i("CertTool", "addCertificate()");
         if (isPkcs12Keystore(data)) {
             intent = prepareIntent(TITLE_PKCS12_KEYSTORE, data, USER_KEY,
                     UNKNOWN, UNKNOWN);
diff --git a/keystore/jni/cert.c b/keystore/jni/cert.c
index cc36b84..0db28fd 100644
--- a/keystore/jni/cert.c
+++ b/keystore/jni/cert.c
@@ -136,30 +136,126 @@
     return ret_code;
 }
 
-int is_pkcs12(const char *buf, int bufLen)
+PKCS12 *get_p12_handle(const char *buf, int bufLen)
 {
-    int ret = 0;
     BIO *bp = NULL;
     PKCS12  *p12 = NULL;
 
-    if (!buf || bufLen < 1) goto err;
+    if (!buf || (bufLen < 1) || (buf[0] != 48)) goto err;
 
     bp = BIO_new(BIO_s_mem());
     if (!bp) goto err;
 
-    if (buf[0] != 48) goto err; // it is not DER.
-
     if (!BIO_write(bp, buf, bufLen)) goto err;
 
-    if ((p12 = d2i_PKCS12_bio(bp, NULL)) != NULL) {
-        PKCS12_free(p12);
-        ret = 1;
-    }
+    p12 = d2i_PKCS12_bio(bp, NULL);
+
 err:
     if (bp) BIO_free(bp);
+    return p12;
+}
+
+PKCS12_KEYSTORE *get_pkcs12_keystore_handle(const char *buf, int bufLen,
+                                            const char *passwd)
+{
+    PKCS12_KEYSTORE *p12store = NULL;
+    EVP_PKEY *pkey = NULL;
+    X509 *cert = NULL;
+    STACK_OF(X509) *certs = NULL;
+    PKCS12  *p12 = get_p12_handle(buf, bufLen);
+
+    if (p12 == NULL) return NULL;
+    if (!PKCS12_parse(p12, passwd, &pkey, &cert, &certs)) {
+        LOGE("Can not parse PKCS12 content");
+        PKCS12_free(p12);
+        return NULL;
+    }
+    if ((p12store = malloc(sizeof(PKCS12_KEYSTORE))) == NULL) {
+        if (cert) X509_free(cert);
+        if (pkey) EVP_PKEY_free(pkey);
+        if (certs) sk_X509_free(certs);
+    }
+    p12store->p12 = p12;
+    p12store->pkey = pkey;
+    p12store->cert = cert;
+    p12store->certs = certs;
+    return p12store;
+}
+
+void free_pkcs12_keystore(PKCS12_KEYSTORE *p12store)
+{
+    if (p12store != NULL) {
+        if (p12store->cert) X509_free(p12store->cert);
+        if (p12store->pkey) EVP_PKEY_free(p12store->pkey);
+        if (p12store->certs) sk_X509_free(p12store->certs);
+        free(p12store);
+    }
+}
+
+int is_pkcs12(const char *buf, int bufLen)
+{
+    int ret = 0;
+    PKCS12  *p12 = get_p12_handle(buf, bufLen);
+    if (p12 != NULL) ret = 1;
+    PKCS12_free(p12);
     return ret;
 }
 
+static int convert_to_pem(void *data, int is_cert, char *buf, int size)
+{
+    int len = 0;
+    BIO *bio = NULL;
+
+    if (data == NULL) return -1;
+
+    if ((bio = BIO_new(BIO_s_mem())) == NULL) goto err;
+    if (is_cert) {
+        if ((len = PEM_write_bio_X509(bio, (X509*)data)) == 0) {
+            goto err;
+        }
+    } else {
+        if ((len = PEM_write_bio_PrivateKey(bio, (EVP_PKEY *)data, NULL,
+                                            NULL, 0, NULL, NULL)) == 0) {
+            goto err;
+        }
+    }
+    if (len < size && (len = BIO_read(bio, buf, size - 1)) > 0) {
+        buf[len] = 0;
+    }
+err:
+    if (bio) BIO_free(bio);
+    return (len == 0) ? -1 : 0;
+}
+
+int get_pkcs12_certificate(PKCS12_KEYSTORE *p12store, char *buf, int size)
+{
+    if ((p12store != NULL) && (p12store->cert != NULL)) {
+        return convert_to_pem((void*)p12store->cert, 1, buf, size);
+    }
+    return -1;
+}
+
+int get_pkcs12_private_key(PKCS12_KEYSTORE *p12store, char *buf, int size)
+{
+    if ((p12store != NULL) && (p12store->pkey != NULL)) {
+        return convert_to_pem((void*)p12store->pkey, 0, buf, size);
+    }
+    return -1;
+}
+
+int pop_pkcs12_certs_stack(PKCS12_KEYSTORE *p12store, char *buf, int size)
+{
+    X509 *cert = NULL;
+
+    if ((p12store != NULL) && (p12store->certs != NULL) &&
+        ((cert = sk_X509_pop(p12store->certs)) != NULL)) {
+        int ret = convert_to_pem((void*)cert, 1, buf, size);
+        X509_free(cert);
+        return ret;
+    }
+    return -1;
+}
+
 X509* parse_cert(const char *buf, int bufLen)
 {
     X509 *cert = NULL;
diff --git a/keystore/jni/cert.h b/keystore/jni/cert.h
index a9807b1..aaa7602 100644
--- a/keystore/jni/cert.h
+++ b/keystore/jni/cert.h
@@ -41,6 +41,13 @@
     int key_len;
 } PKEY_STORE;
 
+typedef struct {
+    PKCS12  *p12;
+    EVP_PKEY *pkey;
+    X509 *cert;
+    STACK_OF(X509) *certs;
+} PKCS12_KEYSTORE;
+
 #define PKEY_STORE_free(x) { \
     if(x.pkey) EVP_PKEY_free(x.pkey); \
     if(x.public_key) free(x.public_key); \
@@ -49,8 +56,14 @@
 #define nelem(x) (sizeof (x) / sizeof *(x))
 
 int gen_csr(int bits, const char *organizations, char reply[REPLY_MAX]);
+PKCS12_KEYSTORE *get_pkcs12_keystore_handle(const char *buf, int bufLen,
+                                            const char *passwd);
+int get_pkcs12_certificate(PKCS12_KEYSTORE *p12store, char *buf, int size);
+int get_pkcs12_private_key(PKCS12_KEYSTORE *p12store, char *buf, int size);
+int pop_pkcs12_certs_stack(PKCS12_KEYSTORE *p12store, char *buf, int size);
+void free_pkcs12_keystore(PKCS12_KEYSTORE *p12store);
 int is_pkcs12(const char *buf, int bufLen);
-X509*    parse_cert(const char *buf, int bufLen);
+X509 *parse_cert(const char *buf, int bufLen);
 int get_cert_name(X509 *cert, char *buf, int size);
 int get_issuer_name(X509 *cert, char *buf, int size);
 int is_ca_cert(X509 *cert);
diff --git a/keystore/jni/certtool.c b/keystore/jni/certtool.c
index fabf5cd..1ae8dab 100644
--- a/keystore/jni/certtool.c
+++ b/keystore/jni/certtool.c
@@ -19,10 +19,13 @@
 #include <string.h>
 #include <jni.h>
 #include <cutils/log.h>
+#include <openssl/pkcs12.h>
 #include <openssl/x509v3.h>
 
 #include "cert.h"
 
+typedef int PKCS12_KEYSTORE_FUNC(PKCS12_KEYSTORE *store, char *buf, int size);
+
 jstring
 android_security_CertTool_generateCertificateRequest(JNIEnv* env,
                                                      jobject thiz,
@@ -42,12 +45,88 @@
                                            jobject thiz,
                                            jbyteArray data)
 {
-    char buf[REPLY_MAX];
     int len = (*env)->GetArrayLength(env, data);
 
-    if (len > REPLY_MAX) return 0;
-    (*env)->GetByteArrayRegion(env, data, 0, len, (jbyte*)buf);
-    return (jboolean) is_pkcs12(buf, len);
+    if (len > 0) {
+        PKCS12 *handle = NULL;
+        char buf[len];
+
+        (*env)->GetByteArrayRegion(env, data, 0, len, (jbyte*)buf);
+        return (jboolean)is_pkcs12(buf, len);
+    } else {
+        return 0;
+    }
+}
+
+jint
+android_security_CertTool_getPkcs12Handle(JNIEnv* env,
+                                          jobject thiz,
+                                          jbyteArray data,
+                                          jstring jPassword)
+{
+    jboolean bIsCopy;
+    int len = (*env)->GetArrayLength(env, data);
+    const char* passwd = (*env)->GetStringUTFChars(env, jPassword , &bIsCopy);
+
+    if (len > 0) {
+        PKCS12_KEYSTORE *handle = NULL;
+        char buf[len];
+
+        (*env)->GetByteArrayRegion(env, data, 0, len, (jbyte*)buf);
+        handle = get_pkcs12_keystore_handle(buf, len, passwd);
+        (*env)->ReleaseStringUTFChars(env, jPassword, passwd);
+        return (jint)handle;
+    } else {
+        return 0;
+    }
+}
+
+jstring call_pkcs12_ks_func(PKCS12_KEYSTORE_FUNC *func,
+                            JNIEnv* env,
+                            jobject thiz,
+                            jint phandle)
+{
+    char buf[REPLY_MAX];
+
+    if (phandle == 0) return NULL;
+    if (func((PKCS12_KEYSTORE*)phandle, buf, sizeof(buf)) == 0) {
+        return (*env)->NewStringUTF(env, buf);
+    }
+    return NULL;
+}
+
+jstring
+android_security_CertTool_getPkcs12Certificate(JNIEnv* env,
+                                               jobject thiz,
+                                               jint phandle)
+{
+    return call_pkcs12_ks_func((PKCS12_KEYSTORE_FUNC *)get_pkcs12_certificate,
+                               env, thiz, phandle);
+}
+
+jstring
+android_security_CertTool_getPkcs12PrivateKey(JNIEnv* env,
+                                              jobject thiz,
+                                              jint phandle)
+{
+    return call_pkcs12_ks_func((PKCS12_KEYSTORE_FUNC *)get_pkcs12_private_key,
+                               env, thiz, phandle);
+}
+
+jstring
+android_security_CertTool_popPkcs12CertificateStack(JNIEnv* env,
+                                                    jobject thiz,
+                                                    jint phandle)
+{
+    return call_pkcs12_ks_func((PKCS12_KEYSTORE_FUNC *)pop_pkcs12_certs_stack,
+                               env, thiz, phandle);
+}
+
+void android_security_CertTool_freePkcs12Handle(JNIEnv* env,
+                                                jobject thiz,
+                                                jint handle)
+{
+    if (handle != 0) free_pkcs12_keystore((PKCS12_KEYSTORE*)handle);
 }
 
 jint
@@ -117,6 +196,16 @@
         (void*)android_security_CertTool_generateCertificateRequest},
     {"isPkcs12Keystore", "([B)Z",
         (void*)android_security_CertTool_isPkcs12Keystore},
+    {"getPkcs12Handle", "([BLjava/lang/String;)I",
+        (void*)android_security_CertTool_getPkcs12Handle},
+    {"getPkcs12Certificate", "(I)Ljava/lang/String;",
+        (void*)android_security_CertTool_getPkcs12Certificate},
+    {"getPkcs12PrivateKey", "(I)Ljava/lang/String;",
+        (void*)android_security_CertTool_getPkcs12PrivateKey},
+    {"popPkcs12CertificateStack", "(I)Ljava/lang/String;",
+        (void*)android_security_CertTool_popPkcs12CertificateStack},
+    {"freePkcs12Handle", "(I)V",
+        (void*)android_security_CertTool_freePkcs12Handle},
     {"generateX509Certificate", "([B)I",
         (void*)android_security_CertTool_generateX509Certificate},
     {"isCaCertificate", "(I)Z",
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 8a19fbd..f5bdeda 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -738,12 +738,13 @@
 
 bool AudioFlinger::isMusicActive() const
 {
+    Mutex::Autolock _l(mLock);
  #ifdef WITH_A2DP
      if (isA2dpEnabled()) {
-         return mA2dpMixerThread->isMusicActive();
+         return mA2dpMixerThread->isMusicActive_l();
      }
  #endif
-    return mHardwareMixerThread->isMusicActive();
+    return mHardwareMixerThread->isMusicActive_l();
 }
 
 status_t AudioFlinger::setParameter(const char* key, const char* value)
@@ -1444,7 +1445,8 @@
     return mStreamTypes[stream].mute;
 }
 
-bool AudioFlinger::MixerThread::isMusicActive() const
+// isMusicActive_l() must be called with AudioFlinger::mLock held
+bool AudioFlinger::MixerThread::isMusicActive_l() const
 {
     size_t count = mActiveTracks.size();
     for (size_t i = 0 ; i < count ; ++i) {
@@ -2030,7 +2032,10 @@
     inBuffer.i16 = data;
     
     if (mCblk->user == 0) {
-        if (mOutputMixerThread->isMusicActive()) {
+        mOutputMixerThread->mAudioFlinger->mLock.lock();
+        bool isMusicActive = mOutputMixerThread->isMusicActive_l();
+        mOutputMixerThread->mAudioFlinger->mLock.unlock();
+        if (isMusicActive) {
             mCblk->forceReady = 1;
             LOGV("OutputTrack::start() force ready");
         } else if (mCblk->frameCount > frames){
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 8e47b29..634934e 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -463,7 +463,7 @@
         virtual     float       streamVolume(int stream) const;
         virtual     bool        streamMute(int stream) const;
 
-                    bool        isMusicActive() const;
+                    bool        isMusicActive_l() const;
         
                     
                     sp<Track>   createTrack_l(
diff --git a/libs/surfaceflinger/Android.mk b/libs/surfaceflinger/Android.mk
index 9272983..ec5aa3f 100644
--- a/libs/surfaceflinger/Android.mk
+++ b/libs/surfaceflinger/Android.mk
@@ -15,7 +15,6 @@
     LayerBitmap.cpp \
     LayerDim.cpp \
     LayerOrientationAnim.cpp \
-    LayerOrientationAnimRotate.cpp \
     OrientationAnimation.cpp \
     SurfaceFlinger.cpp \
     Tokenizer.cpp \
diff --git a/libs/surfaceflinger/LayerOrientationAnim.cpp b/libs/surfaceflinger/LayerOrientationAnim.cpp
index 3e4035e..79e5328 100644
--- a/libs/surfaceflinger/LayerOrientationAnim.cpp
+++ b/libs/surfaceflinger/LayerOrientationAnim.cpp
@@ -46,10 +46,7 @@
 // Animation...
 const float DURATION = ms2ns(200);
 const float BOUNCES_PER_SECOND = 0.5f;
-//const float BOUNCES_AMPLITUDE = 1.0f/16.0f;
-const float BOUNCES_AMPLITUDE = 0;
 const float DIM_TARGET = 0.40f;
-//#define INTERPOLATED_TIME(_t)   ((_t)*(_t))
 #define INTERPOLATED_TIME(_t)   (_t)
 
 // ---------------------------------------------------------------------------
@@ -64,14 +61,8 @@
       mTextureName(-1), mTextureNameIn(-1)
 {
     // blur that texture. 
-    mStartTime = systemTime();
-    mFinishTime = 0;
     mOrientationCompleted = false;
-    mFirstRedraw = false;
-    mLastNormalizedTime = 0;
     mNeedsBlending = false;
-    mAlphaInLerp.set(1.0f, DIM_TARGET);
-    mAlphaOutLerp.set(0.5f, 1.0f);
 }
 
 LayerOrientationAnim::~LayerOrientationAnim()
@@ -117,108 +108,37 @@
 
 void LayerOrientationAnim::onOrientationCompleted()
 {
-    mFinishTime = systemTime();
-    mOrientationCompleted = true;
-    mFirstRedraw = true;
-    mNeedsBlending = true;
-    mFlinger->invalidateLayerVisibility(this);
+    mAnim->onAnimationFinished();
 }
 
 void LayerOrientationAnim::onDraw(const Region& clip) const
 {
-    const nsecs_t now = systemTime();
-    float alphaIn, alphaOut;
+    float alphaIn =  DIM_TARGET;
     
-    if (mOrientationCompleted) {
-        if (mFirstRedraw) {
-            mFirstRedraw = false;
-            
-            // make a copy of what's on screen
-            copybit_image_t image;
-            mBitmapOut.getBitmapSurface(&image);
-            const DisplayHardware& hw(graphicPlane(0).displayHardware());
-            hw.copyBackToImage(image);
-
-            // and erase the screen for this round
-            glDisable(GL_BLEND);
-            glDisable(GL_DITHER);
-            glDisable(GL_SCISSOR_TEST);
-            glClearColor(0,0,0,0);
-            glClear(GL_COLOR_BUFFER_BIT);
-            
-            // FIXME: code below is gross
-            mNeedsBlending = false;
-            LayerOrientationAnim* self(const_cast<LayerOrientationAnim*>(this));
-            mFlinger->invalidateLayerVisibility(self);
-        }
-
-        // make sure pick-up where we left off
-        const float duration = DURATION * mLastNormalizedTime;
-        const float normalizedTime = (float(now - mFinishTime) / duration);
-        if (normalizedTime <= 1.0f) {
-            const float interpolatedTime = INTERPOLATED_TIME(normalizedTime);
-            alphaIn = mAlphaInLerp.getOut();
-            alphaOut = mAlphaOutLerp(interpolatedTime);
-        } else {
-            mAnim->onAnimationFinished();
-            alphaIn = mAlphaInLerp.getOut();
-            alphaOut = mAlphaOutLerp.getOut();
-        }
-    } else {
-        const float normalizedTime = float(now - mStartTime) / DURATION;
-        if (normalizedTime <= 1.0f) {
-            mLastNormalizedTime = normalizedTime;
-            const float interpolatedTime = INTERPOLATED_TIME(normalizedTime);
-            alphaIn = mAlphaInLerp(interpolatedTime);
-            alphaOut = 0.0f;
-        } else {
-            mLastNormalizedTime = 1.0f;
-            const float to_seconds = DURATION / seconds(1);
-            alphaIn = mAlphaInLerp.getOut();
-            if (BOUNCES_AMPLITUDE > 0.0f) {
-                const float phi = BOUNCES_PER_SECOND * 
-                        (((normalizedTime - 1.0f) * to_seconds)*M_PI*2);
-                if (alphaIn > 1.0f) alphaIn = 1.0f;
-                else if (alphaIn < 0.0f) alphaIn = 0.0f;
-                alphaIn += BOUNCES_AMPLITUDE * (1.0f - cosf(phi));
-            }
-            alphaOut = 0.0f;
-        }
-        mAlphaOutLerp.setIn(alphaIn);
+    // clear screen
+    // TODO: with update on demand, we may be able 
+    // to not erase the screen at all during the animation 
+    if (!mOrientationCompleted) {
+        glDisable(GL_BLEND);
+        glDisable(GL_DITHER);
+        glDisable(GL_SCISSOR_TEST);
+        glClearColor(0,0,0,0);
+        glClear(GL_COLOR_BUFFER_BIT);
     }
-    drawScaled(1.0f, alphaIn, alphaOut);
-}
-
-void LayerOrientationAnim::drawScaled(float scale, float alphaIn, float alphaOut) const
-{
+    
     copybit_image_t dst;
     const GraphicPlane& plane(graphicPlane(0));
     const DisplayHardware& hw(plane.displayHardware());
     hw.getDisplaySurface(&dst);
 
-    // clear screen
-    // TODO: with update on demand, we may be able 
-    // to not erase the screen at all during the animation 
-    if (!mOrientationCompleted) {
-        if (scale==1.0f && (alphaIn>=1.0f || alphaOut>=1.0f)) {
-            // we don't need to erase the screen in that case
-        } else {
-            glDisable(GL_BLEND);
-            glDisable(GL_DITHER);
-            glDisable(GL_SCISSOR_TEST);
-            glClearColor(0,0,0,0);
-            glClear(GL_COLOR_BUFFER_BIT);
-        }
-    }
-    
     copybit_image_t src;
     mBitmapIn.getBitmapSurface(&src);
 
     copybit_image_t srcOut;
     mBitmapOut.getBitmapSurface(&srcOut);
 
-    const int w = dst.w*scale; 
-    const int h = dst.h*scale; 
+    const int w = dst.w; 
+    const int h = dst.h; 
     const int xc = uint32_t(dst.w-w)/2;
     const int yc = uint32_t(dst.h-h)/2;
     const copybit_rect_t drect = { xc, yc, xc+w, yc+h }; 
@@ -237,13 +157,7 @@
             copybit->set_parameter(copybit, COPYBIT_BLUR, COPYBIT_ENABLE);
             copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, int(alphaIn*255));
             err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it);
-        }
-
-        if (!err && alphaOut > 0.0f) {
-            region_iterator it(reg);
             copybit->set_parameter(copybit, COPYBIT_BLUR, COPYBIT_DISABLE);
-            copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, int(alphaOut*255));
-            err = copybit->stretch(copybit, &dst, &srcOut, &drect, &srect, &it);
         }
         LOGE_IF(err != NO_ERROR, "copybit failed (%s)", strerror(err));
     }
@@ -258,7 +172,6 @@
         t.data = (GGLubyte*)(intptr_t(src.base) + src.offset);
 
         Transform tr;
-        tr.set(scale,0,0,scale);
         tr.set(xc, yc);
         
         // FIXME: we should not access mVertices and mDrawingState like that,
@@ -285,18 +198,6 @@
             self.mDrawingState.alpha = int(alphaIn*255);
             drawWithOpenGL(reg, mTextureNameIn, t);
         }
-
-        if (alphaOut > 0.0f) {
-            t.data = (GGLubyte*)(intptr_t(srcOut.base) + srcOut.offset);
-            if (UNLIKELY(mTextureName == -1LU)) {
-                mTextureName = createTexture();
-                GLuint w=0, h=0;
-                const Region dirty(Rect(t.width, t.height));
-                loadTexture(dirty, mTextureName, t, w, h);
-            }
-            self.mDrawingState.alpha = int(alphaOut*255);
-            drawWithOpenGL(reg, mTextureName, t);
-        }
     }
 }
 
diff --git a/libs/surfaceflinger/LayerOrientationAnim.h b/libs/surfaceflinger/LayerOrientationAnim.h
index 365c6ae..12b6f1c 100644
--- a/libs/surfaceflinger/LayerOrientationAnim.h
+++ b/libs/surfaceflinger/LayerOrientationAnim.h
@@ -64,45 +64,13 @@
     virtual bool needsBlending() const;
     virtual bool isSecure() const       { return false; }
 private:
-    void drawScaled(float scale, float alphaIn, float alphaOut) const;
-
-    class Lerp {
-        float in;
-        float outMinusIn;
-    public:
-        Lerp() : in(0), outMinusIn(0) { }
-        Lerp(float in, float out) : in(in), outMinusIn(out-in) { }
-        float getIn() const { return in; };
-        float getOut() const { return in + outMinusIn; }
-        void set(float in, float out) { 
-            this->in = in; 
-            this->outMinusIn = out-in; 
-        }
-        void setIn(float in) { 
-            this->in = in; 
-        }
-        void setOut(float out) { 
-            this->outMinusIn = out - this->in; 
-        }
-        float operator()(float t) const { 
-            return outMinusIn*t + in; 
-        }
-    };
-    
     OrientationAnimation* mAnim;
     LayerBitmap mBitmapIn;
     LayerBitmap mBitmapOut;
-    nsecs_t mStartTime;
-    nsecs_t mFinishTime;
     bool mOrientationCompleted;
-    mutable bool mFirstRedraw;
-    mutable float mLastNormalizedTime;
     mutable GLuint  mTextureName;
     mutable GLuint  mTextureNameIn;
     mutable bool mNeedsBlending;
-    
-    mutable Lerp mAlphaInLerp;
-    mutable Lerp mAlphaOutLerp;
 };
 
 // ---------------------------------------------------------------------------
diff --git a/libs/surfaceflinger/LayerOrientationAnimRotate.cpp b/libs/surfaceflinger/LayerOrientationAnimRotate.cpp
deleted file mode 100644
index 89ffb19..0000000
--- a/libs/surfaceflinger/LayerOrientationAnimRotate.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * 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.
- */
-
-#define LOG_TAG "SurfaceFlinger"
-
-#include <stdlib.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <utils/Errors.h>
-#include <utils/Log.h>
-
-#include <core/SkBitmap.h>
-
-#include <ui/EGLDisplaySurface.h>
-
-#include "LayerBase.h"
-#include "LayerOrientationAnim.h"
-#include "LayerOrientationAnimRotate.h"
-#include "SurfaceFlinger.h"
-#include "DisplayHardware/DisplayHardware.h"
-#include "OrientationAnimation.h"
-
-namespace android {
-// ---------------------------------------------------------------------------
-
-const uint32_t LayerOrientationAnimRotate::typeInfo = LayerBase::typeInfo | 0x100;
-const char* const LayerOrientationAnimRotate::typeID = "LayerOrientationAnimRotate";
-
-// ---------------------------------------------------------------------------
-
-const float ROTATION = M_PI * 0.5f;
-const float ROTATION_FACTOR = 1.0f; // 1.0 or 2.0
-const float DURATION = ms2ns(200);
-const float BOUNCES_PER_SECOND = 0.8;
-const float BOUNCES_AMPLITUDE = (5.0f/180.f) * M_PI;
-
-LayerOrientationAnimRotate::LayerOrientationAnimRotate(
-        SurfaceFlinger* flinger, DisplayID display, 
-        OrientationAnimation* anim, 
-        const LayerBitmap& bitmap,
-        const LayerBitmap& bitmapIn)
-    : LayerOrientationAnimBase(flinger, display), mAnim(anim), 
-      mBitmap(bitmap), mBitmapIn(bitmapIn), 
-      mTextureName(-1), mTextureNameIn(-1)
-{
-    mStartTime = systemTime();
-    mFinishTime = 0;
-    mOrientationCompleted = false;
-    mFirstRedraw = false;
-    mLastNormalizedTime = 0;
-    mLastAngle = 0;
-    mLastScale = 0;
-    mNeedsBlending = false;
-    const GraphicPlane& plane(graphicPlane(0));
-    mOriginalTargetOrientation = plane.getOrientation(); 
-}
-
-LayerOrientationAnimRotate::~LayerOrientationAnimRotate()
-{
-    if (mTextureName != -1U) {
-        LayerBase::deletedTextures.add(mTextureName);
-    }
-    if (mTextureNameIn != -1U) {
-        LayerBase::deletedTextures.add(mTextureNameIn);
-    }
-}
-
-bool LayerOrientationAnimRotate::needsBlending() const 
-{
-    return mNeedsBlending; 
-}
-
-Point LayerOrientationAnimRotate::getPhysicalSize() const
-{
-    const GraphicPlane& plane(graphicPlane(0));
-    const DisplayHardware& hw(plane.displayHardware());
-    return Point(hw.getWidth(), hw.getHeight());
-}
-
-void LayerOrientationAnimRotate::validateVisibility(const Transform&)
-{
-    const Layer::State& s(drawingState());
-    const Transform tr(s.transform);
-    const Point size(getPhysicalSize());
-    uint32_t w = size.x;
-    uint32_t h = size.y;
-    mTransformedBounds = tr.makeBounds(w, h);
-    mLeft = tr.tx();
-    mTop  = tr.ty();
-    transparentRegionScreen.clear();
-    mTransformed = true;
-    mCanUseCopyBit = false;
-}
-
-void LayerOrientationAnimRotate::onOrientationCompleted()
-{
-    mFinishTime = systemTime();
-    mOrientationCompleted = true;
-    mFirstRedraw = true;
-    mNeedsBlending = true;
-    mFlinger->invalidateLayerVisibility(this);
-}
-
-void LayerOrientationAnimRotate::onDraw(const Region& clip) const
-{
-    // Animation...
-
-    const nsecs_t now = systemTime();
-    float angle, scale, alpha;
-    
-    if (mOrientationCompleted) {
-        if (mFirstRedraw) {
-            // make a copy of what's on screen
-            copybit_image_t image;
-            mBitmapIn.getBitmapSurface(&image);
-            const DisplayHardware& hw(graphicPlane(0).displayHardware());
-            hw.copyBackToImage(image);
-            
-            // FIXME: code below is gross
-            mFirstRedraw = false; 
-            mNeedsBlending = false;
-            LayerOrientationAnimRotate* self(const_cast<LayerOrientationAnimRotate*>(this));
-            mFlinger->invalidateLayerVisibility(self);
-        }
-
-        // make sure pick-up where we left off
-        const float duration = DURATION * mLastNormalizedTime;
-        const float normalizedTime = (float(now - mFinishTime) / duration);
-        if (normalizedTime <= 1.0f) {
-            const float squaredTime = normalizedTime*normalizedTime;
-            angle = (ROTATION*ROTATION_FACTOR - mLastAngle)*squaredTime + mLastAngle;
-            scale = (1.0f - mLastScale)*squaredTime + mLastScale;
-            alpha = normalizedTime;
-        } else {
-            mAnim->onAnimationFinished();
-            angle = ROTATION;
-            alpha = 1.0f;
-            scale = 1.0f;
-        }
-    } else {
-        // FIXME: works only for portrait framebuffers
-        const Point size(getPhysicalSize());
-        const float TARGET_SCALE = size.x * (1.0f / size.y);
-        const float normalizedTime = float(now - mStartTime) / DURATION;
-        if (normalizedTime <= 1.0f) {
-            mLastNormalizedTime = normalizedTime;
-            const float squaredTime = normalizedTime*normalizedTime;
-            angle = ROTATION * squaredTime;
-            scale = (TARGET_SCALE - 1.0f)*squaredTime + 1.0f;
-            alpha = 0;
-        } else {
-            mLastNormalizedTime = 1.0f;
-            angle = ROTATION;
-            if (BOUNCES_AMPLITUDE) {
-                const float to_seconds = DURATION / seconds(1);
-                const float phi = BOUNCES_PER_SECOND * 
-                (((normalizedTime - 1.0f) * to_seconds)*M_PI*2);
-                angle += BOUNCES_AMPLITUDE * sinf(phi);
-            }
-            scale = TARGET_SCALE;
-            alpha = 0;
-        }
-        mLastAngle = angle;
-        mLastScale = scale;
-    }
-    drawScaled(angle, scale, alpha);
-}
-
-void LayerOrientationAnimRotate::drawScaled(float f, float s, float alpha) const
-{
-    copybit_image_t dst;
-    const GraphicPlane& plane(graphicPlane(0));
-    const DisplayHardware& hw(plane.displayHardware());
-    hw.getDisplaySurface(&dst);
-
-    // clear screen
-    // TODO: with update on demand, we may be able 
-    // to not erase the screen at all during the animation 
-    glDisable(GL_BLEND);
-    glDisable(GL_DITHER);
-    glDisable(GL_SCISSOR_TEST);
-    glClearColor(0,0,0,0);
-    glClear(GL_COLOR_BUFFER_BIT);
-    
-    const int w = dst.w; 
-    const int h = dst.h; 
-
-    copybit_image_t src;
-    mBitmap.getBitmapSurface(&src);
-    const copybit_rect_t srect = { 0, 0, src.w, src.h };
-
-
-    GGLSurface t;
-    t.version = sizeof(GGLSurface);
-    t.width  = src.w;
-    t.height = src.h;
-    t.stride = src.w;
-    t.vstride= src.h;
-    t.format = src.format;
-    t.data = (GGLubyte*)(intptr_t(src.base) + src.offset);
-
-    if (!mOriginalTargetOrientation) {
-        f = -f;
-    }
-
-    Transform tr;
-    tr.set(f, w*0.5f, h*0.5f);
-    tr.scale(s, w*0.5f, h*0.5f);
-
-    // FIXME: we should not access mVertices and mDrawingState like that,
-    // but since we control the animation, we know it's going to work okay.
-    // eventually we'd need a more formal way of doing things like this.
-    LayerOrientationAnimRotate& self(const_cast<LayerOrientationAnimRotate&>(*this));
-    tr.transform(self.mVertices[0], 0, 0);
-    tr.transform(self.mVertices[1], 0, src.h);
-    tr.transform(self.mVertices[2], src.w, src.h);
-    tr.transform(self.mVertices[3], src.w, 0);
-
-    if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
-        // Too slow to do this in software
-        self.mDrawingState.flags |= ISurfaceComposer::eLayerFilter;
-    }
-
-    if (UNLIKELY(mTextureName == -1LU)) {
-        mTextureName = createTexture();
-        GLuint w=0, h=0;
-        const Region dirty(Rect(t.width, t.height));
-        loadTexture(dirty, mTextureName, t, w, h);
-    }
-    self.mDrawingState.alpha = 255; //-int(alpha*255);
-    const Region clip(Rect( srect.l, srect.t, srect.r, srect.b ));
-    drawWithOpenGL(clip, mTextureName, t);
-    
-    if (alpha > 0) {
-        const float sign = (!mOriginalTargetOrientation) ? 1.0f : -1.0f;
-        tr.set(f + sign*(M_PI * 0.5f * ROTATION_FACTOR), w*0.5f, h*0.5f);
-        tr.scale(s, w*0.5f, h*0.5f);
-        tr.transform(self.mVertices[0], 0, 0);
-        tr.transform(self.mVertices[1], 0, src.h);
-        tr.transform(self.mVertices[2], src.w, src.h);
-        tr.transform(self.mVertices[3], src.w, 0);
-
-        copybit_image_t src;
-        mBitmapIn.getBitmapSurface(&src);
-        t.data = (GGLubyte*)(intptr_t(src.base) + src.offset);
-        if (UNLIKELY(mTextureNameIn == -1LU)) {
-            mTextureNameIn = createTexture();
-            GLuint w=0, h=0;
-            const Region dirty(Rect(t.width, t.height));
-            loadTexture(dirty, mTextureNameIn, t, w, h);
-        }
-        self.mDrawingState.alpha = int(alpha*255);
-        const Region clip(Rect( srect.l, srect.t, srect.r, srect.b ));
-        drawWithOpenGL(clip, mTextureNameIn, t);
-    }
-}
-
-// ---------------------------------------------------------------------------
-
-}; // namespace android
diff --git a/libs/surfaceflinger/LayerOrientationAnimRotate.h b/libs/surfaceflinger/LayerOrientationAnimRotate.h
deleted file mode 100644
index 5fbbd42..0000000
--- a/libs/surfaceflinger/LayerOrientationAnimRotate.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef ANDROID_LAYER_ORIENTATION_ANIM_ROTATE_H
-#define ANDROID_LAYER_ORIENTATION_ANIM_ROTATE_H
-
-#include <stdint.h>
-#include <sys/types.h>
-#include <utils/threads.h>
-#include <utils/Parcel.h>
-
-#include "LayerBase.h"
-#include "LayerBitmap.h"
-
-namespace android {
-
-// ---------------------------------------------------------------------------
-class OrientationAnimation;
-
-class LayerOrientationAnimRotate : public LayerOrientationAnimBase
-{
-public:    
-    static const uint32_t typeInfo;
-    static const char* const typeID;
-    virtual char const* getTypeID() const { return typeID; }
-    virtual uint32_t getTypeInfo() const { return typeInfo; }
-    
-    LayerOrientationAnimRotate(SurfaceFlinger* flinger, DisplayID display,
-                        OrientationAnimation* anim, 
-                        const LayerBitmap& zoomOut,
-                        const LayerBitmap& zoomIn);
-        virtual ~LayerOrientationAnimRotate();
-
-            void onOrientationCompleted();
-
-    virtual void onDraw(const Region& clip) const;
-    virtual Point getPhysicalSize() const;
-    virtual void validateVisibility(const Transform& globalTransform);
-    virtual bool needsBlending() const;
-    virtual bool isSecure() const       { return false; }
-private:
-    void drawScaled(float angle, float scale, float alpha) const;
-    
-    OrientationAnimation* mAnim;
-    LayerBitmap mBitmap;
-    LayerBitmap mBitmapIn;
-    nsecs_t mStartTime;
-    nsecs_t mFinishTime;
-    bool mOrientationCompleted;
-    int mOriginalTargetOrientation;
-    mutable bool mFirstRedraw;
-    mutable float mLastNormalizedTime;
-    mutable float mLastAngle;
-    mutable float mLastScale;
-    mutable GLuint  mTextureName;
-    mutable GLuint  mTextureNameIn;
-    mutable bool mNeedsBlending;
-};
-
-// ---------------------------------------------------------------------------
-
-}; // namespace android
-
-#endif // ANDROID_LAYER_ORIENTATION_ANIM_ROTATE_H
diff --git a/libs/surfaceflinger/OrientationAnimation.cpp b/libs/surfaceflinger/OrientationAnimation.cpp
index 70eec8d..12c0eef 100644
--- a/libs/surfaceflinger/OrientationAnimation.cpp
+++ b/libs/surfaceflinger/OrientationAnimation.cpp
@@ -21,7 +21,6 @@
 #include <limits.h>
 
 #include "LayerOrientationAnim.h"
-#include "LayerOrientationAnimRotate.h"
 #include "OrientationAnimation.h"
 #include "SurfaceFlinger.h"
 #include "VRamHeap.h"
@@ -112,13 +111,8 @@
 
     LayerOrientationAnimBase* l;
     
-    if (mType & 0x80) {
-        l = new LayerOrientationAnimRotate(
-                mFlinger.get(), 0, this, bitmap, bitmapIn);
-    } else {
-        l = new LayerOrientationAnim(
-                mFlinger.get(), 0, this, bitmap, bitmapIn);
-    }
+    l = new LayerOrientationAnim(
+            mFlinger.get(), 0, this, bitmap, bitmapIn);
 
     l->initStates(w, h, 0);
     l->setLayer(INT_MAX-1);
@@ -137,7 +131,7 @@
         return true;
         
     }
-    mLayerOrientationAnim->invalidate();
+    //mLayerOrientationAnim->invalidate();
     return false;
 }
 
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp
index ef4a8ea..fb25663 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -1236,6 +1236,13 @@
 {
     LayerBaseClient* layer = 0;
     sp<LayerBaseClient::Surface> surfaceHandle;
+
+    if (int32_t(w|h) < 0) {
+        LOGE("createSurface() failed, w or h is negative (w=%d, h=%d)",
+                int(w), int(h));
+        return surfaceHandle;
+    }
+    
     Mutex::Autolock _l(mStateLock);
     Client* const c = mClientsMap.valueFor(clientId);
     if (UNLIKELY(!c)) {
diff --git a/libs/ui/Camera.cpp b/libs/ui/Camera.cpp
index 975594f..5015379 100644
--- a/libs/ui/Camera.cpp
+++ b/libs/ui/Camera.cpp
@@ -310,6 +310,19 @@
     }
 }
 
+// callback from camera service when timestamped frame is ready
+void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
+{
+    sp<CameraListener> listener;
+    {
+        Mutex::Autolock _l(mLock);
+        listener = mListener;
+    }
+    if (listener != NULL) {
+        listener->postDataTimestamp(timestamp, msgType, dataPtr);
+    }
+}
+
 void Camera::binderDied(const wp<IBinder>& who) {
     LOGW("ICamera died");
     notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
diff --git a/libs/ui/ICameraClient.cpp b/libs/ui/ICameraClient.cpp
index c6cf75c..59a6cf2 100644
--- a/libs/ui/ICameraClient.cpp
+++ b/libs/ui/ICameraClient.cpp
@@ -27,6 +27,7 @@
 enum {
     NOTIFY_CALLBACK = IBinder::FIRST_CALL_TRANSACTION,
     DATA_CALLBACK,
+    DATA_CALLBACK_TIMESTAMP,
 };
 
 class BpCameraClient: public BpInterface<ICameraClient>
@@ -60,6 +61,17 @@
         remote()->transact(DATA_CALLBACK, data, &reply, IBinder::FLAG_ONEWAY);
     }
 
+    // generic data callback from camera service to app with image data
+    void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& imageData)
+    {
+        LOGV("dataCallback");
+        Parcel data, reply;
+        data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());
+        data.writeInt64(timestamp);
+        data.writeInt32(msgType);
+        data.writeStrongBinder(imageData->asBinder());
+        remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY);
+    }
 };
 
 IMPLEMENT_META_INTERFACE(CameraClient, "android.hardware.ICameraClient");
@@ -86,13 +98,22 @@
             return NO_ERROR;
         } break;
         case DATA_CALLBACK: {
-            LOGV("RAW_CALLBACK");
+            LOGV("DATA_CALLBACK");
             CHECK_INTERFACE(ICameraClient, data, reply);
             int32_t msgType = data.readInt32();
             sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder());
             dataCallback(msgType, imageData);
             return NO_ERROR;
         } break;
+        case DATA_CALLBACK_TIMESTAMP: {
+            LOGV("DATA_CALLBACK_TIMESTAMP");
+            CHECK_INTERFACE(ICameraClient, data, reply);
+            nsecs_t timestamp = data.readInt64();
+            int32_t msgType = data.readInt32();
+            sp<IMemory> imageData = interface_cast<IMemory>(data.readStrongBinder());
+            dataCallbackTimestamp(timestamp, msgType, imageData);
+            return NO_ERROR;
+        } break;
         default:
             return BBinder::onTransact(code, data, reply, flags);
     }
diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp
index 109f28d..98d450b 100644
--- a/libs/utils/ResourceTypes.cpp
+++ b/libs/utils/ResourceTypes.cpp
@@ -1573,7 +1573,6 @@
 status_t ResTable::add(ResTable* src)
 {
     mError = src->mError;
-    mParams = src->mParams;
     
     for (size_t i=0; i<src->mHeaders.size(); i++) {
         mHeaders.add(src->mHeaders[i]);
@@ -4008,7 +4007,16 @@
                         printf("      NON-INTEGER ResTable_type ADDRESS: %p\n", type);
                         continue;
                     }
-                    printf("      config %d lang=%c%c cnt=%c%c orien=%d touch=%d density=%d key=%d infl=%d nav=%d w=%d h=%d lyt=%d\n",
+                    char density[16];
+                    uint16_t dval = dtohs(type->config.density);
+                    if (dval == ResTable_config::DENSITY_DEFAULT) {
+                        strcpy(density, "def");
+                    } else if (dval == ResTable_config::DENSITY_NONE) {
+                        strcpy(density, "non");
+                    } 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 lyt=%d\n",
                            (int)configIndex,
                            type->config.language[0] ? type->config.language[0] : '-',
                            type->config.language[1] ? type->config.language[1] : '-',
@@ -4016,7 +4024,7 @@
                            type->config.country[1] ? type->config.country[1] : '-',
                            type->config.orientation,
                            type->config.touchscreen,
-                           dtohs(type->config.density),
+                           density,
                            type->config.keyboard,
                            type->config.inputFlags,
                            type->config.navigation,
diff --git a/libs/utils/String8.cpp b/libs/utils/String8.cpp
index c50d343..e908ec1 100644
--- a/libs/utils/String8.cpp
+++ b/libs/utils/String8.cpp
@@ -25,25 +25,39 @@
 
 #include <ctype.h>
 
-namespace android {
+/*
+ * Functions outside android is below the namespace android, since they use
+ * functions and constants in android namespace.
+ */
 
 // ---------------------------------------------------------------------------
 
-static const uint32_t kByteMask = 0x000000BF;
-static const uint32_t kByteMark = 0x00000080;
+namespace android {
+
+static const char32_t kByteMask = 0x000000BF;
+static const char32_t kByteMark = 0x00000080;
 
 // Surrogates aren't valid for UTF-32 characters, so define some
 // constants that will let us screen them out.
-static const uint32_t kUnicodeSurrogateHighStart  = 0x0000D800;
-static const uint32_t kUnicodeSurrogateHighEnd    = 0x0000DBFF;
-static const uint32_t kUnicodeSurrogateLowStart   = 0x0000DC00;
-static const uint32_t kUnicodeSurrogateLowEnd     = 0x0000DFFF;
-static const uint32_t kUnicodeSurrogateStart      = kUnicodeSurrogateHighStart;
-static const uint32_t kUnicodeSurrogateEnd        = kUnicodeSurrogateLowEnd;
+static const char32_t kUnicodeSurrogateHighStart  = 0x0000D800;
+static const char32_t kUnicodeSurrogateHighEnd    = 0x0000DBFF;
+static const char32_t kUnicodeSurrogateLowStart   = 0x0000DC00;
+static const char32_t kUnicodeSurrogateLowEnd     = 0x0000DFFF;
+static const char32_t kUnicodeSurrogateStart      = kUnicodeSurrogateHighStart;
+static const char32_t kUnicodeSurrogateEnd        = kUnicodeSurrogateLowEnd;
+static const char32_t kUnicodeMaxCodepoint        = 0x0010FFFF;
 
 // Mask used to set appropriate bits in first byte of UTF-8 sequence,
 // indexed by number of bytes in the sequence.
-static const uint32_t kFirstByteMark[] = {
+// 0xxxxxxx
+// -> (00-7f) 7bit. Bit mask for the first byte is 0x00000000
+// 110yyyyx 10xxxxxx
+// -> (c0-df)(80-bf) 11bit. Bit mask is 0x000000C0
+// 1110yyyy 10yxxxxx 10xxxxxx
+// -> (e0-ef)(80-bf)(80-bf) 16bit. Bit mask is 0x000000E0
+// 11110yyy 10yyxxxx 10xxxxxx 10xxxxxx
+// -> (f0-f7)(80-bf)(80-bf)(80-bf) 21bit. Bit mask is 0x000000F0
+static const char32_t kFirstByteMark[] = {
     0x00000000, 0x00000000, 0x000000C0, 0x000000E0, 0x000000F0
 };
 
@@ -52,7 +66,7 @@
 #define RES_PATH_SEPARATOR '/'
 
 // Return number of utf8 bytes required for the character.
-static size_t utf32_to_utf8_bytes(uint32_t srcChar)
+static size_t utf32_to_utf8_bytes(char32_t srcChar)
 {
     size_t bytesToWrite;
 
@@ -79,7 +93,7 @@
         }
     }
     // Max code point for Unicode is 0x0010FFFF.
-    else if (srcChar < 0x00110000)
+    else if (srcChar <= kUnicodeMaxCodepoint)
     {
         bytesToWrite = 4;
     }
@@ -94,7 +108,7 @@
 
 // Write out the source character to <dstP>.
 
-static void utf32_to_utf8(uint8_t* dstP, uint32_t srcChar, size_t bytes)
+static void utf32_to_utf8(uint8_t* dstP, char32_t srcChar, size_t bytes)
 {
     dstP += bytes;
     switch (bytes)
@@ -126,7 +140,7 @@
 	  // Bite me, Darwin!
 		gDarwinIsReallyAnnoying = gDarwinCantLoadAllObjects;
 #endif
-			
+
     SharedBuffer* buf = SharedBuffer::alloc(1);
     char* str = (char*)buf->data();
     *str = 0;
@@ -160,20 +174,20 @@
     return getEmptyString();
 }
 
-// Note: not dealing with expanding surrogate pairs.
-static char* allocFromUTF16(const char16_t* in, size_t len)
+template<typename T, typename L>
+static char* allocFromUTF16OrUTF32(const T* in, L len)
 {
     if (len == 0) return getEmptyString();
-    
+
     size_t bytes = 0;
-    const char16_t* end = in+len;
-    const char16_t* p = in;
-    
+    const T* end = in+len;
+    const T* p = in;
+
     while (p < end) {
         bytes += utf32_to_utf8_bytes(*p);
         p++;
     }
-    
+
     SharedBuffer* buf = SharedBuffer::alloc(bytes+1);
     LOG_ASSERT(buf, "Unable to allocate shared buffer");
     if (buf) {
@@ -181,19 +195,30 @@
         char* str = (char*)buf->data();
         char* d = str;
         while (p < end) {
-            uint32_t c = *p++;
+            const T c = *p++;
             size_t len = utf32_to_utf8_bytes(c);
             utf32_to_utf8((uint8_t*)d, c, len);
             d += len;
         }
         *d = 0;
-        
+
         return str;
     }
-    
+
     return getEmptyString();
 }
 
+// Note: not dealing with expanding surrogate pairs.
+static char* allocFromUTF16(const char16_t* in, size_t len)
+{
+    return allocFromUTF16OrUTF32<char16_t, size_t>(in, len);
+}
+
+static char* allocFromUTF32(const char32_t* in, size_t len)
+{
+    return allocFromUTF16OrUTF32<char32_t, size_t>(in, len);
+}
+
 // ---------------------------------------------------------------------------
 
 String8::String8()
@@ -238,6 +263,16 @@
 {
 }
 
+String8::String8(const char32_t* o)
+    : mString(allocFromUTF32(o, strlen32(o)))
+{
+}
+
+String8::String8(const char32_t* o, size_t len)
+    : mString(allocFromUTF32(o, len))
+{
+}
+
 String8::~String8()
 {
     SharedBuffer::bufferFromData(mString)->release();
@@ -280,6 +315,16 @@
     return NO_MEMORY;
 }
 
+status_t String8::setTo(const char32_t* other, size_t len)
+{
+    SharedBuffer::bufferFromData(mString)->release();
+    mString = allocFromUTF32(other, len);
+    if (mString) return NO_ERROR;
+
+    mString = getEmptyString();
+    return NO_MEMORY;
+}
+
 status_t String8::append(const String8& other)
 {
     const size_t otherLen = other.bytes();
@@ -418,6 +463,21 @@
     unlockBuffer(len);
 }
 
+size_t String8::getUtf32Length() const
+{
+    return utf32_length(mString, length());
+}
+
+int32_t String8::getUtf32At(size_t index, size_t *next_index) const
+{
+    return utf32_at(mString, length(), index, next_index);
+}
+
+size_t String8::getUtf32(char32_t* dst, size_t dst_len) const
+{
+    return utf8_to_utf32(mString, length(), dst, dst_len);
+}
+
 TextOutput& operator<<(TextOutput& to, const String8& val)
 {
     to << val.string();
@@ -427,7 +487,6 @@
 // ---------------------------------------------------------------------------
 // Path functions
 
-
 void String8::setPathName(const char* name)
 {
     setPathName(name, strlen(name));
@@ -600,5 +659,192 @@
     return *this;
 }
 
-
 }; // namespace android
+
+// ---------------------------------------------------------------------------
+
+size_t strlen32(const char32_t *s)
+{
+  const char32_t *ss = s;
+  while ( *ss )
+    ss++;
+  return ss-s;
+}
+
+size_t strnlen32(const char32_t *s, size_t maxlen)
+{
+  const char32_t *ss = s;
+  while ((maxlen > 0) && *ss) {
+    ss++;
+    maxlen--;
+  }
+  return ss-s;
+}
+
+size_t utf8_length(const char *src)
+{
+    const char *cur = src;
+    size_t ret = 0;
+    while (*cur != '\0') {
+        const char first_char = *cur++;
+        if ((first_char & 0x80) == 0) { // ASCII
+            ret += 1;
+            continue;
+        }
+        // (UTF-8's character must not be like 10xxxxxx,
+        //  but 110xxxxx, 1110xxxx, ... or 1111110x)
+        if ((first_char & 0x40) == 0) {
+            return 0;
+        }
+
+        int32_t mask, to_ignore_mask;
+        size_t num_to_read = 0;
+        char32_t utf32 = 0;
+        for (num_to_read = 1, mask = 0x40, to_ignore_mask = 0x80;
+             num_to_read < 5 && (first_char & mask);
+             num_to_read++, to_ignore_mask |= mask, mask >>= 1) {
+            if ((*cur & 0xC0) != 0x80) { // must be 10xxxxxx
+                return 0;
+            }
+            // 0x3F == 00111111
+            utf32 = (utf32 << 6) + (*cur++ & 0x3F);
+        }
+        // "first_char" must be (110xxxxx - 11110xxx)
+        if (num_to_read == 5) {
+            return 0;
+        }
+        to_ignore_mask |= mask;
+        utf32 |= ((~to_ignore_mask) & first_char) << (6 * (num_to_read - 1));
+        if (utf32 > android::kUnicodeMaxCodepoint) {
+            return 0;
+        }
+
+        ret += num_to_read;
+    }
+    return ret;
+}
+
+size_t utf32_length(const char *src, size_t src_len)
+{
+    if (src == NULL || src_len == 0) {
+        return 0;
+    }
+    size_t ret = 0;
+    const char* cur;
+    const char* end;
+    size_t num_to_skip;
+    for (cur = src, end = src + src_len, num_to_skip = 1;
+         cur < end;
+         cur += num_to_skip, ret++) {
+        const char first_char = *cur;
+        num_to_skip = 1;
+        if ((first_char & 0x80) == 0) {  // ASCII
+            continue;
+        }
+        int32_t mask;
+
+        for (mask = 0x40; (first_char & mask); num_to_skip++, mask >>= 1) {
+        }
+    }
+    return ret;
+}
+
+size_t utf8_length_from_utf32(const char32_t *src, size_t src_len)
+{
+    if (src == NULL || src_len == 0) {
+        return 0;
+    }
+    size_t ret = 0;
+    const char32_t *end = src + src_len;
+    while (src < end) {
+        ret += android::utf32_to_utf8_bytes(*src++);
+    }
+    return ret;
+}
+
+static int32_t utf32_at_internal(const char* cur, size_t *num_read)
+{
+    const char first_char = *cur;
+    if ((first_char & 0x80) == 0) { // ASCII
+        *num_read = 1;
+        return *cur;
+    }
+    cur++;
+    char32_t mask, to_ignore_mask;
+    size_t num_to_read = 0;
+    char32_t utf32 = first_char;
+    for (num_to_read = 1, mask = 0x40, to_ignore_mask = 0xFFFFFF80;
+         (first_char & mask);
+         num_to_read++, to_ignore_mask |= mask, mask >>= 1) {
+        // 0x3F == 00111111
+        utf32 = (utf32 << 6) + (*cur++ & 0x3F);
+    }
+    to_ignore_mask |= mask;
+    utf32 &= ~(to_ignore_mask << (6 * (num_to_read - 1)));
+
+    *num_read = num_to_read;
+    return static_cast<int32_t>(utf32);
+}
+
+int32_t utf32_at(const char *src, size_t src_len,
+                 size_t index, size_t *next_index)
+{
+    if (index >= src_len) {
+        return -1;
+    }
+    size_t dummy_index;
+    if (next_index == NULL) {
+        next_index = &dummy_index;
+    }
+    size_t num_read;
+    int32_t ret = utf32_at_internal(src + index, &num_read);
+    if (ret >= 0) {
+        *next_index = index + num_read;
+    }
+
+    return ret;
+}
+
+size_t utf8_to_utf32(const char* src, size_t src_len,
+                     char32_t* dst, size_t dst_len)
+{
+    if (src == NULL || src_len == 0 || dst == NULL || dst_len == 0) {
+        return 0;
+    }
+
+    const char* cur = src;
+    const char* end = src + src_len;
+    char32_t* cur_utf32 = dst;
+    const char32_t* end_utf32 = dst + dst_len;
+    while (cur_utf32 < end_utf32 && cur < end) {
+        size_t num_read;
+        *cur_utf32++ =
+                static_cast<char32_t>(utf32_at_internal(cur, &num_read));
+        cur += num_read;
+    }
+    if (cur_utf32 < end_utf32) {
+        *cur_utf32 = 0;
+    }
+    return static_cast<size_t>(cur_utf32 - dst);
+}
+
+size_t utf32_to_utf8(const char32_t* src, size_t src_len,
+                     char* dst, size_t dst_len)
+{
+    if (src == NULL || src_len == 0 || dst == NULL || dst_len == 0) {
+        return 0;
+    }
+    const char32_t *cur_utf32 = src;
+    const char32_t *end_utf32 = src + src_len;
+    char *cur = dst;
+    const char *end = dst + dst_len;
+    while (cur_utf32 < end_utf32 && cur < end) {
+        size_t len = android::utf32_to_utf8_bytes(*cur_utf32);
+        android::utf32_to_utf8((uint8_t *)cur, *cur_utf32++, len);
+        cur += len;
+    }
+    if (cur < end) {
+        *cur = '\0';
+    }
+    return cur - dst;
+}
diff --git a/libs/utils/ZipUtils.cpp b/libs/utils/ZipUtils.cpp
index 5df94cb..9138878 100644
--- a/libs/utils/ZipUtils.cpp
+++ b/libs/utils/ZipUtils.cpp
@@ -210,7 +210,7 @@
             LOGV("+++ reading %ld bytes (%ld left)\n",
                 getSize, compRemaining);
 
-            int cc = fread(readBuf, getSize, 1, fp);
+            int cc = fread(readBuf, 1, getSize, fp);
             if (cc != (int) getSize) {
                 LOGD("inflate read failed (%d vs %ld)\n",
                     cc, getSize);
@@ -341,4 +341,3 @@
 
     return true;
 }
-
diff --git a/location/java/android/location/Address.java b/location/java/android/location/Address.java
index 3551363..ac275c6 100644
--- a/location/java/android/location/Address.java
+++ b/location/java/android/location/Address.java
@@ -41,7 +41,10 @@
     private String mAdminArea;
     private String mSubAdminArea;
     private String mLocality;
+    private String mSubLocality;
     private String mThoroughfare;
+    private String mSubThoroughfare;
+    private String mPremises;
     private String mPostalCode;
     private String mCountryCode;
     private String mCountryName;
@@ -175,6 +178,21 @@
     }
 
     /**
+     * Returns the sub-locality of the address, or null if it is unknown.
+     * For example, this may correspond to the neighborhood of the locality.
+     */
+    public String getSubLocality() {
+        return mSubLocality;
+    }
+
+    /**
+     * Sets the sub-locality of the address to the given String, which may be null.
+     */
+    public void setSubLocality(String sublocality) {
+        mSubLocality = sublocality;
+    }
+
+    /**
      * Returns the thoroughfare name of the address, for example, "1600 Ampitheater Parkway",
      * which may be null
      */
@@ -190,6 +208,35 @@
     }
 
     /**
+     * Returns the sub-thoroughfare name of the address, which may be null.
+     * This may correspond to the street number of the address.
+     */
+    public String getSubThoroughfare() {
+        return mSubThoroughfare;
+    }
+
+    /**
+     * Sets the sub-thoroughfare name of the address, which may be null.
+     */
+    public void setSubThoroughfare(String subthoroughfare) {
+        this.mSubThoroughfare = subthoroughfare;
+    }
+
+    /**
+     * Returns the premises of the address, or null if it is unknown.
+     */
+    public String getPremises() {
+        return mPremises;
+    }
+
+    /**
+     * Sets the premises of the address to the given String, which may be null.
+     */
+    public void setPremises(String premises) {
+        mPremises = premises;
+    }
+
+    /**
      * Returns the postal code of the address, for example "94110",
      * or null if it is unknown.
      */
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index cfdf5e3..a65a417 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1063,6 +1063,21 @@
         }
     }
 
+    /**
+     *  @hide
+     *  Reload audio settings. This method is called by Settings backup
+     *  agent when audio settings are restored and causes the AudioService
+     *  to read and apply restored settings.
+     */
+    public void reloadAudioSettings() {
+        IAudioService service = getService();
+        try {
+            service.reloadAudioSettings();
+        } catch (RemoteException e) {
+            Log.e(TAG, "Dead object in reloadAudioSettings"+e);
+        }
+    }
+
      /**
       * {@hide}
       */
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 937baad..58c04f3 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -508,14 +508,14 @@
     /** @see AudioManager#setRingerMode(int) */
     public void setRingerMode(int ringerMode) {
         if (ringerMode != mRingerMode) {
-            setRingerModeInt(ringerMode);
+            setRingerModeInt(ringerMode, true);
 
             // Send sticky broadcast
             broadcastRingerMode();
         }
     }
 
-    private void setRingerModeInt(int ringerMode) {
+    private void setRingerModeInt(int ringerMode, boolean persist) {
         mRingerMode = ringerMode;
 
         // Adjust volumes via posting message
@@ -543,8 +543,10 @@
         }
         
         // Post a persist ringer mode msg
-        sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, SHARED_MSG,
-                SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY);
+        if (persist) {
+            sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, SHARED_MSG,
+                    SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY);
+        }
     }
 
     /** @see AudioManager#shouldVibrate(int) */
@@ -914,6 +916,46 @@
         }
     }
 
+    /** @see AudioManager#reloadAudioSettings() */
+    public void reloadAudioSettings() {
+        // restore ringer mode, ringer mode affected streams, mute affected streams and vibrate settings
+        readPersistedSettings();
+
+        // restore volume settings
+        int numStreamTypes = AudioSystem.getNumStreamTypes();
+        for (int streamType = 0; streamType < numStreamTypes; streamType++) {
+            VolumeStreamState streamState = mStreamStates[streamType];
+
+            // there is no volume setting for STREAM_BLUETOOTH_SCO
+            if (streamType != AudioSystem.STREAM_BLUETOOTH_SCO) {
+                String settingName = System.VOLUME_SETTINGS[streamType];
+                String lastAudibleSettingName = settingName + System.APPEND_FOR_LAST_AUDIBLE;
+
+                streamState.mIndex = streamState.getValidIndex(Settings.System.getInt(mContentResolver,
+                        settingName,
+                        AudioManager.DEFAULT_STREAM_VOLUME[streamType]));
+                streamState.mLastAudibleIndex = streamState.getValidIndex(Settings.System.getInt(mContentResolver,
+                        lastAudibleSettingName,
+                        streamState.mIndex > 0 ? streamState.mIndex : AudioManager.DEFAULT_STREAM_VOLUME[streamType]));
+            }
+            // unmute stream that whas muted but is not affect by mute anymore
+            if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType)) {
+                int size = streamState.mDeathHandlers.size();
+                for (int i = 0; i < size; i++) {
+                    streamState.mDeathHandlers.get(i).mMuteCount = 1;
+                    streamState.mDeathHandlers.get(i).mute(false);
+                }
+            }
+            // apply stream volume
+            if (streamState.muteCount() == 0) {
+                AudioSystem.setVolume(streamType, streamState.mVolumes[streamState.mIndex]);
+            }
+        }
+
+        // apply new ringer mode
+        setRingerModeInt(getRingerMode(), false);
+    }
+
     ///////////////////////////////////////////////////////////////////////////
     // Internal methods
     ///////////////////////////////////////////////////////////////////////////
@@ -1285,10 +1327,12 @@
         }
 
         private void persistVolume(VolumeStreamState streamState) {
-            System.putInt(mContentResolver, streamState.mVolumeIndexSettingName,
-                    streamState.mIndex);
-            System.putInt(mContentResolver, streamState.mLastAudibleVolumeIndexSettingName,
-                    streamState.mLastAudibleIndex);
+            if (streamState.mStreamType != AudioManager.STREAM_BLUETOOTH_SCO) {
+                System.putInt(mContentResolver, streamState.mVolumeIndexSettingName,
+                        streamState.mIndex);
+                System.putInt(mContentResolver, streamState.mLastAudibleVolumeIndexSettingName,
+                        streamState.mLastAudibleIndex);
+            }
         }
 
         private void persistRingerMode() {
@@ -1426,7 +1470,7 @@
              * Ensure all stream types that should be affected by ringer mode
              * are in the proper state.
              */
-            setRingerModeInt(getRingerMode());
+            setRingerModeInt(getRingerMode(), false);
         }
         
     }
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
new file mode 100644
index 0000000..645f3f6
--- /dev/null
+++ b/media/java/android/media/ExifInterface.java
@@ -0,0 +1,398 @@
+/*
+ * 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.media;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Wrapper for native Exif library
+ * {@hide}
+ */
+public class ExifInterface {
+    private static final String TAG = "ExifInterface";
+    private String mFilename;
+
+    // Constants used for the Orientation Exif tag.
+    public static final int ORIENTATION_UNDEFINED = 0;
+    public static final int ORIENTATION_NORMAL = 1;
+
+    // Constants used for white balance
+    public static final int WHITEBALANCE_AUTO = 0;
+    public static final int WHITEBALANCE_MANUAL = 1;
+
+    // left right reversed mirror
+    public static final int ORIENTATION_FLIP_HORIZONTAL = 2;
+    public static final int ORIENTATION_ROTATE_180 = 3;
+
+    // upside down mirror
+    public static final int ORIENTATION_FLIP_VERTICAL = 4;
+
+    // flipped about top-left <--> bottom-right axis
+    public static final int ORIENTATION_TRANSPOSE = 5;
+
+    // rotate 90 cw to right it
+    public static final int ORIENTATION_ROTATE_90 = 6;
+
+    // flipped about top-right <--> bottom-left axis
+    public static final int ORIENTATION_TRANSVERSE = 7;
+
+    // rotate 270 to right it
+    public static final int ORIENTATION_ROTATE_270 = 8;
+
+    // The Exif tag names
+    public static final String TAG_ORIENTATION = "Orientation";
+
+    public static final String TAG_DATE_TIME_ORIGINAL = "DateTimeOriginal";
+    public static final String TAG_MAKE = "Make";
+    public static final String TAG_MODEL = "Model";
+    public static final String TAG_FLASH = "Flash";
+    public static final String TAG_IMAGE_WIDTH = "ImageWidth";
+    public static final String TAG_IMAGE_LENGTH = "ImageLength";
+
+    public static final String TAG_GPS_LATITUDE = "GPSLatitude";
+    public static final String TAG_GPS_LONGITUDE = "GPSLongitude";
+
+    public static final String TAG_GPS_LATITUDE_REF = "GPSLatitudeRef";
+    public static final String TAG_GPS_LONGITUDE_REF = "GPSLongitudeRef";
+    public static final String TAG_WHITE_BALANCE = "WhiteBalance";
+
+    private boolean mSavedAttributes = false;
+    private boolean mHasThumbnail = false;
+    private HashMap<String, String> mCachedAttributes = null;
+
+    static {
+        System.loadLibrary("exif");
+    }
+
+    private static ExifInterface sExifObj = null;
+    /**
+     * Since the underlying jhead native code is not thread-safe,
+     * ExifInterface should use singleton interface instead of public
+     * constructor.
+     */
+    private static synchronized ExifInterface instance() {
+        if (sExifObj == null) {
+            sExifObj = new ExifInterface();
+        }
+
+        return sExifObj;
+    }
+
+    /**
+     * The following 3 static methods are handy routines for atomic operation
+     * of underlying jhead library. It retrieves EXIF data and then release
+     * ExifInterface immediately.
+     */
+    public static synchronized HashMap<String, String> loadExifData(String filename) {
+        ExifInterface exif = instance();
+        HashMap<String, String> exifData = null;
+        if (exif != null) {
+            exif.setFilename(filename);
+            exifData = exif.getAttributes();
+        }
+        return exifData;
+    }
+
+    public static synchronized void saveExifData(String filename, HashMap<String, String> exifData) {
+        ExifInterface exif = instance();
+        if (exif != null) {
+            exif.setFilename(filename);
+            exif.saveAttributes(exifData);
+        }
+    }
+
+    public static synchronized byte[] getExifThumbnail(String filename) {
+        ExifInterface exif = instance();
+        if (exif != null) {
+            exif.setFilename(filename);
+            return exif.getThumbnail();
+        }
+        return null;
+    }
+
+    public void setFilename(String filename) {
+        mFilename = filename;
+    }
+
+    /**
+     * Given a HashMap of Exif tags and associated values, an Exif section in
+     * the JPG file is created and loaded with the tag data. saveAttributes()
+     * is expensive because it involves copying all the JPG data from one file
+     * to another and deleting the old file and renaming the other. It's best
+     * to collect all the attributes to write and make a single call rather
+     * than multiple calls for each attribute. You must call "commitChanges()"
+     * at some point to commit the changes.
+     */
+    public void saveAttributes(HashMap<String, String> attributes) {
+        // format of string passed to native C code:
+        // "attrCnt attr1=valueLen value1attr2=value2Len value2..."
+        // example:
+        // "4 attrPtr ImageLength=4 1024Model=6 FooImageWidth=4 1280Make=3 FOO"
+        StringBuilder sb = new StringBuilder();
+        int size = attributes.size();
+        if (attributes.containsKey("hasThumbnail")) {
+            --size;
+        }
+        sb.append(size + " ");
+        for (Map.Entry<String, String> iter : attributes.entrySet()) {
+            String key = iter.getKey();
+            if (key.equals("hasThumbnail")) {
+                // this is a fake attribute not saved as an exif tag
+                continue;
+            }
+            String val = iter.getValue();
+            sb.append(key + "=");
+            sb.append(val.length() + " ");
+            sb.append(val);
+        }
+        String s = sb.toString();
+        saveAttributesNative(mFilename, s);
+        commitChangesNative(mFilename);
+        mSavedAttributes = true;
+    }
+
+    /**
+     * Returns a HashMap loaded with the Exif attributes of the file. The key
+     * is the standard tag name and the value is the tag's value: e.g.
+     * Model -> Nikon. Numeric values are returned as strings.
+     */
+    public HashMap<String, String> getAttributes() {
+        if (mCachedAttributes != null) {
+            return mCachedAttributes;
+        }
+        // format of string passed from native C code:
+        // "attrCnt attr1=valueLen value1attr2=value2Len value2..."
+        // example:
+        // "4 attrPtr ImageLength=4 1024Model=6 FooImageWidth=4 1280Make=3 FOO"
+        mCachedAttributes = new HashMap<String, String>();
+
+        String attrStr = getAttributesNative(mFilename);
+
+        // get count
+        int ptr = attrStr.indexOf(' ');
+        int count = Integer.parseInt(attrStr.substring(0, ptr));
+        // skip past the space between item count and the rest of the attributes
+        ++ptr;
+
+        for (int i = 0; i < count; i++) {
+            // extract the attribute name
+            int equalPos = attrStr.indexOf('=', ptr);
+            String attrName = attrStr.substring(ptr, equalPos);
+            ptr = equalPos + 1;     // skip past =
+
+            // extract the attribute value length
+            int lenPos = attrStr.indexOf(' ', ptr);
+            int attrLen = Integer.parseInt(attrStr.substring(ptr, lenPos));
+            ptr = lenPos + 1;       // skip pas the space
+
+            // extract the attribute value
+            String attrValue = attrStr.substring(ptr, ptr + attrLen);
+            ptr += attrLen;
+
+            if (attrName.equals("hasThumbnail")) {
+                mHasThumbnail = attrValue.equalsIgnoreCase("true");
+            } else {
+                mCachedAttributes.put(attrName, attrValue);
+            }
+        }
+        return mCachedAttributes;
+    }
+
+    /**
+     * Given a numerical white balance value, return a
+     * human-readable string describing it.
+     */
+    public static String whiteBalanceToString(int whitebalance) {
+        switch (whitebalance) {
+            case WHITEBALANCE_AUTO:
+                return "Auto";
+            case WHITEBALANCE_MANUAL:
+                return "Manual";
+            default:
+                return "";
+        }
+    }
+
+    /**
+     * Given a numerical orientation, return a human-readable string describing
+     * the orientation.
+     */
+    public static String orientationToString(int orientation) {
+        // TODO: this function needs to be localized and use string resource ids
+        // rather than strings
+        String orientationString;
+        switch (orientation) {
+            case ORIENTATION_NORMAL:
+                orientationString = "Normal";
+                break;
+            case ORIENTATION_FLIP_HORIZONTAL:
+                orientationString = "Flipped horizontal";
+                break;
+            case ORIENTATION_ROTATE_180:
+                orientationString = "Rotated 180 degrees";
+                break;
+            case ORIENTATION_FLIP_VERTICAL:
+                orientationString = "Upside down mirror";
+                break;
+            case ORIENTATION_TRANSPOSE:
+                orientationString = "Transposed";
+                break;
+            case ORIENTATION_ROTATE_90:
+                orientationString = "Rotated 90 degrees";
+                break;
+            case ORIENTATION_TRANSVERSE:
+                orientationString = "Transversed";
+                break;
+            case ORIENTATION_ROTATE_270:
+                orientationString = "Rotated 270 degrees";
+                break;
+            default:
+                orientationString = "Undefined";
+                break;
+        }
+        return orientationString;
+    }
+
+    /**
+     * Copies the thumbnail data out of the filename and puts it in the Exif
+     * data associated with the file used to create this object. You must call
+     * "commitChanges()" at some point to commit the changes.
+     */
+    public boolean appendThumbnail(String thumbnailFileName) {
+        if (!mSavedAttributes) {
+            throw new RuntimeException("Must call saveAttributes "
+                    + "before calling appendThumbnail");
+        }
+        mHasThumbnail = appendThumbnailNative(mFilename, thumbnailFileName);
+        return mHasThumbnail;
+    }
+
+    public boolean hasThumbnail() {
+        if (!mSavedAttributes) {
+            getAttributes();
+        }
+        return mHasThumbnail;
+    }
+
+    public byte[] getThumbnail() {
+        return getThumbnailNative(mFilename);
+    }
+
+    public static float[] getLatLng(HashMap<String, String> exifData) {
+        if (exifData == null) {
+            return null;
+        }
+
+        String latValue = exifData.get(ExifInterface.TAG_GPS_LATITUDE);
+        String latRef = exifData.get(ExifInterface.TAG_GPS_LATITUDE_REF);
+        String lngValue = exifData.get(ExifInterface.TAG_GPS_LONGITUDE);
+        String lngRef = exifData.get(ExifInterface.TAG_GPS_LONGITUDE_REF);
+        float[] latlng = null;
+
+        if (latValue != null && latRef != null
+                && lngValue != null && lngRef != null) {
+            latlng = new float[2];
+            latlng[0] = ExifInterface.convertRationalLatLonToFloat(
+                    latValue, latRef);
+            latlng[1] = ExifInterface.convertRationalLatLonToFloat(
+                    lngValue, lngRef);
+        }
+
+        return latlng;
+    }
+
+    public static float convertRationalLatLonToFloat(
+            String rationalString, String ref) {
+        try {
+            String [] parts = rationalString.split(",");
+
+            String [] pair;
+            pair = parts[0].split("/");
+            int degrees = (int) (Float.parseFloat(pair[0].trim())
+                    / Float.parseFloat(pair[1].trim()));
+
+            pair = parts[1].split("/");
+            int minutes = (int) ((Float.parseFloat(pair[0].trim())
+                    / Float.parseFloat(pair[1].trim())));
+
+            pair = parts[2].split("/");
+            float seconds = Float.parseFloat(pair[0].trim())
+                    / Float.parseFloat(pair[1].trim());
+
+            float result = degrees + (minutes / 60F) + (seconds / (60F * 60F));
+            if ((ref.equals("S") || ref.equals("W"))) {
+                return -result;
+            }
+            return result;
+        } catch (RuntimeException ex) {
+            // if for whatever reason we can't parse the lat long then return
+            // null
+            return 0f;
+        }
+    }
+
+    public static String convertRationalLatLonToDecimalString(
+            String rationalString, String ref, boolean usePositiveNegative) {
+            float result = convertRationalLatLonToFloat(rationalString, ref);
+
+            String preliminaryResult = String.valueOf(result);
+            if (usePositiveNegative) {
+                String neg = (ref.equals("S") || ref.equals("E")) ? "-" : "";
+                return neg + preliminaryResult;
+            } else {
+                return preliminaryResult + String.valueOf((char) 186) + " "
+                        + ref;
+            }
+    }
+
+    public static String makeLatLongString(double d) {
+        d = Math.abs(d);
+
+        int degrees = (int) d;
+
+        double remainder = d - degrees;
+        int minutes = (int) (remainder * 60D);
+        // really seconds * 1000
+        int seconds = (int) (((remainder * 60D) - minutes) * 60D * 1000D);
+
+        String retVal = degrees + "/1," + minutes + "/1," + seconds + "/1000";
+        return retVal;
+    }
+
+    public static String makeLatStringRef(double lat) {
+        return lat >= 0D ? "N" : "S";
+    }
+
+    public static String makeLonStringRef(double lon) {
+        return lon >= 0D ? "W" : "E";
+    }
+
+    private native boolean appendThumbnailNative(String fileName,
+            String thumbnailFileName);
+
+    private native void saveAttributesNative(String fileName,
+            String compressedAttributes);
+
+    private native String getAttributesNative(String fileName);
+
+    private native void commitChangesNative(String fileName);
+
+    private native byte[] getThumbnailNative(String fileName);
+}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index f5e242d..9a8264f 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -71,4 +71,5 @@
   
     oneway void unloadSoundEffects();
 
+    oneway void reloadAudioSettings();
 }
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java
index cccc0fc..95f3680 100644
--- a/media/java/android/media/MediaScanner.java
+++ b/media/java/android/media/MediaScanner.java
@@ -54,7 +54,7 @@
 
 /**
  * Internal service helper that no-one should use directly.
- * 
+ *
  * The way the scan currently works is:
  * - The Java MediaScannerService creates a MediaScanner (this class), and calls
  *   MediaScanner.scanDirectories on it.
@@ -96,7 +96,7 @@
  * {@hide}
  */
 public class MediaScanner
-{    
+{
     static {
         System.loadLibrary("media_jni");
     }
@@ -108,17 +108,17 @@
             Audio.Media.DATA, // 1
             Audio.Media.DATE_MODIFIED, // 2
     };
-    
+
     private static final int ID_AUDIO_COLUMN_INDEX = 0;
     private static final int PATH_AUDIO_COLUMN_INDEX = 1;
     private static final int DATE_MODIFIED_AUDIO_COLUMN_INDEX = 2;
- 
+
     private static final String[] VIDEO_PROJECTION = new String[] {
             Video.Media._ID, // 0
             Video.Media.DATA, // 1
             Video.Media.DATE_MODIFIED, // 2
     };
-    
+
     private static final int ID_VIDEO_COLUMN_INDEX = 0;
     private static final int PATH_VIDEO_COLUMN_INDEX = 1;
     private static final int DATE_MODIFIED_VIDEO_COLUMN_INDEX = 2;
@@ -128,11 +128,11 @@
             Images.Media.DATA, // 1
             Images.Media.DATE_MODIFIED, // 2
     };
-    
+
     private static final int ID_IMAGES_COLUMN_INDEX = 0;
     private static final int PATH_IMAGES_COLUMN_INDEX = 1;
     private static final int DATE_MODIFIED_IMAGES_COLUMN_INDEX = 2;
-    
+
     private static final String[] PLAYLISTS_PROJECTION = new String[] {
             Audio.Playlists._ID, // 0
             Audio.Playlists.DATA, // 1
@@ -157,7 +157,7 @@
     private static final String ALARMS_DIR = "/alarms/";
     private static final String MUSIC_DIR = "/music/";
     private static final String PODCAST_DIR = "/podcasts/";
-    
+
     private static final String[] ID3_GENRES = {
         // ID3v1 Genres
         "Blues",
@@ -317,11 +317,11 @@
      * to get the full system property.
      */
     private static final String DEFAULT_RINGTONE_PROPERTY_PREFIX = "ro.config.";
-    
+
     // set to true if file path comparisons should be case insensitive.
     // this should be set when scanning files on a case insensitive file system.
     private boolean mCaseInsensitivePaths;
-    
+
     private BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
 
     private static class FileCacheEntry {
@@ -331,7 +331,7 @@
         long mLastModified;
         boolean mSeenInFileSystem;
         boolean mLastModifiedChanged;
-        
+
         FileCacheEntry(Uri tableUri, long rowId, String path, long lastModified) {
             mTableUri = tableUri;
             mRowId = rowId;
@@ -346,10 +346,10 @@
             return mPath;
         }
     }
-    
-    // hashes file path to FileCacheEntry.  
+
+    // hashes file path to FileCacheEntry.
     // path should be lower case if mCaseInsensitivePaths is true
-    private HashMap<String, FileCacheEntry> mFileCache; 
+    private HashMap<String, FileCacheEntry> mFileCache;
 
     private ArrayList<FileCacheEntry> mPlayLists;
     private HashMap<String, Uri> mGenreCache;
@@ -360,7 +360,7 @@
         mContext = c;
         mBitmapOptions.inSampleSize = 1;
         mBitmapOptions.inJustDecodeBounds = true;
-        
+
         setDefaultRingtoneFileNames();
     }
 
@@ -370,11 +370,11 @@
         mDefaultNotificationFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
                 + Settings.System.NOTIFICATION_SOUND);
     }
-    
+
     private MyMediaScannerClient mClient = new MyMediaScannerClient();
-    
+
     private class MyMediaScannerClient implements MediaScannerClient {
-    
+
         private String mArtist;
         private String mAlbumArtist;    // use this if mArtist is missing
         private String mAlbum;
@@ -389,11 +389,11 @@
         private String mPath;
         private long mLastModified;
         private long mFileSize;
-    
+
         public FileCacheEntry beginFile(String path, String mimeType, long lastModified, long fileSize) {
-            
+
             // special case certain file names
-            // I use regionMatches() instead of substring() below 
+            // I use regionMatches() instead of substring() below
             // to avoid memory allocation
             int lastSlash = path.lastIndexOf('/');
             if (lastSlash >= 0 && lastSlash + 2 < path.length()) {
@@ -401,7 +401,7 @@
                 if (path.regionMatches(lastSlash + 1, "._", 0, 2)) {
                     return null;
                 }
-                
+
                 // ignore album art files created by Windows Media Player:
                 // Folder.jpg, AlbumArtSmall.jpg, AlbumArt_{...}_Large.jpg and AlbumArt_{...}_Small.jpg
                 if (path.regionMatches(true, path.length() - 4, ".jpg", 0, 4)) {
@@ -416,7 +416,7 @@
                     }
                 }
             }
-            
+
             mMimeType = null;
             // try mimeType first, if it is specified
             if (mimeType != null) {
@@ -435,7 +435,7 @@
                     mMimeType = mediaFileType.mimeType;
                 }
             }
-            
+
             String key = path;
             if (mCaseInsensitivePaths) {
                 key = path.toLowerCase();
@@ -446,20 +446,20 @@
                 mFileCache.put(key, entry);
             }
             entry.mSeenInFileSystem = true;
-            
+
             // add some slack to avoid a rounding error
             long delta = lastModified - entry.mLastModified;
             if (delta > 1 || delta < -1) {
                 entry.mLastModified = lastModified;
                 entry.mLastModifiedChanged = true;
             }
-                           
+
             if (mProcessPlaylists && MediaFile.isPlayListFileType(mFileType)) {
                 mPlayLists.add(entry);
                 // we don't process playlists in the main scan, so return null
                 return null;
             }
-            
+
             // clear all the metadata
             mArtist = null;
             mAlbumArtist = null;
@@ -472,10 +472,10 @@
             mDuration = 0;
             mPath = path;
             mLastModified = lastModified;
-            
+
             return entry;
         }
-        
+
         public void scanFile(String path, long lastModified, long fileSize) {
             doScanFile(path, null, lastModified, fileSize, false);
         }
@@ -513,7 +513,7 @@
                     } else if (MediaFile.isImageFileType(mFileType)) {
                         // we used to compute the width and height but it's not worth it
                     }
-                    
+
                     result = endFile(entry, ringtones, notifications, alarms, music, podcasts);
                 }
             } catch (RemoteException e) {
@@ -531,17 +531,17 @@
             char ch = s.charAt(start++);
             // return defaultValue if we have no integer at all
             if (ch < '0' || ch > '9') return defaultValue;
-            
+
             int result = ch - '0';
             while (start < length) {
                 ch = s.charAt(start++);
                 if (ch < '0' || ch > '9') return result;
                 result = result * 10 + (ch - '0');
             }
-            
+
             return result;
-        }                                
-                                
+        }
+
         public void handleStringTag(String name, String value) {
             if (name.equalsIgnoreCase("title") || name.startsWith("title;")) {
                 // Don't trim() here, to preserve the special \001 character
@@ -577,7 +577,7 @@
                 // track number might be of the form "2/12"
                 // we just read the number before the slash
                 int num = parseSubstring(value, 0, 0);
-                mTrack = (mTrack / 1000) * 1000 + num; 
+                mTrack = (mTrack / 1000) * 1000 + num;
             } else if (name.equalsIgnoreCase("discnumber") ||
                     name.equals("set") || name.startsWith("set;")) {
                 // set number might be of the form "1/3"
@@ -588,16 +588,16 @@
                 mDuration = parseSubstring(value, 0, 0);
             }
         }
-        
+
         public void setMimeType(String mimeType) {
             mMimeType = mimeType;
             mFileType = MediaFile.getFileTypeForMimeType(mimeType);
         }
-        
+
         /**
          * Formats the data into a values array suitable for use with the Media
          * Content Provider.
-         * 
+         *
          * @return a map of values
          */
         private ContentValues toValues() {
@@ -608,7 +608,7 @@
             map.put(MediaStore.MediaColumns.DATE_MODIFIED, mLastModified);
             map.put(MediaStore.MediaColumns.SIZE, mFileSize);
             map.put(MediaStore.MediaColumns.MIME_TYPE, mMimeType);
-            
+
             if (MediaFile.isVideoFileType(mFileType)) {
                 map.put(Video.Media.ARTIST, (mArtist != null && mArtist.length() > 0 ? mArtist : MediaFile.UNKNOWN_STRING));
                 map.put(Video.Media.ALBUM, (mAlbum != null && mAlbum.length() > 0 ? mAlbum : MediaFile.UNKNOWN_STRING));
@@ -629,9 +629,9 @@
             }
             return map;
         }
-    
+
         private Uri endFile(FileCacheEntry entry, boolean ringtones, boolean notifications,
-                boolean alarms, boolean music, boolean podcasts) 
+                boolean alarms, boolean music, boolean podcasts)
                 throws RemoteException {
             // update database
             Uri tableUri;
@@ -649,7 +649,7 @@
                 return null;
             }
             entry.mTableUri = tableUri;
-            
+
              // use album artist if artist is missing
             if (mArtist == null || mArtist.length() == 0) {
                 mArtist = mAlbumArtist;
@@ -657,7 +657,7 @@
 
             ContentValues values = toValues();
             String title = values.getAsString(MediaStore.MediaColumns.TITLE);
-            if (TextUtils.isEmpty(title)) {
+            if (title == null || TextUtils.isEmpty(title.trim())) {
                 title = values.getAsString(MediaStore.MediaColumns.DATA);
                 // extract file name after last slash
                 int lastSlash = title.lastIndexOf('/');
@@ -680,10 +680,18 @@
                 values.put(Audio.Media.IS_ALARM, alarms);
                 values.put(Audio.Media.IS_MUSIC, music);
                 values.put(Audio.Media.IS_PODCAST, podcasts);
-            } else if (isImage) {
-                // nothing right now
+            } else if (mFileType == MediaFile.FILE_TYPE_JPEG) {
+                HashMap<String, String> exifData =
+                        ExifInterface.loadExifData(entry.mPath);
+                if (exifData != null) {
+                    float[] latlng = ExifInterface.getLatLng(exifData);
+                    if (latlng != null) {
+                        values.put(Images.Media.LATITUDE, latlng[0]);
+                        values.put(Images.Media.LONGITUDE, latlng[1]);
+                    }
+                }
             }
-            
+
             Uri result = null;
             long rowId = entry.mRowId;
             if (rowId == 0) {
@@ -730,15 +738,15 @@
                         }
                     }
                 }
-              
+
                 if (uri != null) {
-                    // add entry to audio_genre_map  
+                    // add entry to audio_genre_map
                     values.clear();
                     values.put(MediaStore.Audio.Genres.Members.AUDIO_ID, Long.valueOf(rowId));
                     mMediaProvider.insert(uri, values);
                 }
             }
-            
+
             if (notifications && !mDefaultNotificationSet) {
                 if (TextUtils.isEmpty(mDefaultNotificationFilename) ||
                         doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) {
@@ -752,36 +760,36 @@
                     mDefaultRingtoneSet = true;
                 }
             }
-            
+
             return result;
         }
-        
+
         private boolean doesPathHaveFilename(String path, String filename) {
             int pathFilenameStart = path.lastIndexOf(File.separatorChar) + 1;
             int filenameLength = filename.length();
             return path.regionMatches(pathFilenameStart, filename, 0, filenameLength) &&
                     pathFilenameStart + filenameLength == path.length();
         }
-        
+
         private void setSettingIfNotSet(String settingName, Uri uri, long rowId) {
-            
+
             String existingSettingValue = Settings.System.getString(mContext.getContentResolver(),
                     settingName);
-            
+
             if (TextUtils.isEmpty(existingSettingValue)) {
                 // Set the setting to the given URI
                 Settings.System.putString(mContext.getContentResolver(), settingName,
                         ContentUris.withAppendedId(uri, rowId).toString());
             }
         }
-        
+
     }; // end of anonymous MediaScannerClient instance
-    
+
     private void prescan(String filePath) throws RemoteException {
         Cursor c = null;
         String where = null;
         String[] selectionArgs = null;
-         
+
         if (mFileCache == null) {
             mFileCache = new HashMap<String, FileCacheEntry>();
         } else {
@@ -792,7 +800,7 @@
         } else {
             mPlayLists.clear();
         }
-  
+
         // Build the list of files from the content provider
         try {
             // Read existing files from the audio table
@@ -801,14 +809,14 @@
                 selectionArgs = new String[] { filePath };
             }
             c = mMediaProvider.query(mAudioUri, AUDIO_PROJECTION, where, selectionArgs, null);
- 
+
             if (c != null) {
                 try {
                     while (c.moveToNext()) {
                         long rowId = c.getLong(ID_AUDIO_COLUMN_INDEX);
                         String path = c.getString(PATH_AUDIO_COLUMN_INDEX);
                         long lastModified = c.getLong(DATE_MODIFIED_AUDIO_COLUMN_INDEX);
-                        
+
                         String key = path;
                         if (mCaseInsensitivePaths) {
                             key = path.toLowerCase();
@@ -829,14 +837,14 @@
                 where = null;
             }
             c = mMediaProvider.query(mVideoUri, VIDEO_PROJECTION, where, selectionArgs, null);
- 
+
             if (c != null) {
                 try {
                     while (c.moveToNext()) {
                         long rowId = c.getLong(ID_VIDEO_COLUMN_INDEX);
                         String path = c.getString(PATH_VIDEO_COLUMN_INDEX);
                         long lastModified = c.getLong(DATE_MODIFIED_VIDEO_COLUMN_INDEX);
-                        
+
                         String key = path;
                         if (mCaseInsensitivePaths) {
                             key = path.toLowerCase();
@@ -858,7 +866,7 @@
             }
             mOriginalCount = 0;
             c = mMediaProvider.query(mImagesUri, IMAGES_PROJECTION, where, selectionArgs, null);
- 
+
             if (c != null) {
                 try {
                     mOriginalCount = c.getCount();
@@ -866,7 +874,7 @@
                         long rowId = c.getLong(ID_IMAGES_COLUMN_INDEX);
                         String path = c.getString(PATH_IMAGES_COLUMN_INDEX);
                        long lastModified = c.getLong(DATE_MODIFIED_IMAGES_COLUMN_INDEX);
-    
+
                         String key = path;
                         if (mCaseInsensitivePaths) {
                             key = path.toLowerCase();
@@ -879,7 +887,7 @@
                     c = null;
                 }
             }
-            
+
             if (mProcessPlaylists) {
                 // Read existing files from the playlists table
                 if (filePath != null) {
@@ -888,16 +896,16 @@
                     where = null;
                 }
                 c = mMediaProvider.query(mPlaylistsUri, PLAYLISTS_PROJECTION, where, selectionArgs, null);
-     
+
                 if (c != null) {
                     try {
                         while (c.moveToNext()) {
                             String path = c.getString(PATH_IMAGES_COLUMN_INDEX);
-            
+
                             if (path != null && path.length() > 0) {
                                 long rowId = c.getLong(ID_PLAYLISTS_COLUMN_INDEX);
                                 long lastModified = c.getLong(DATE_MODIFIED_PLAYLISTS_COLUMN_INDEX);
-    
+
                                 String key = path;
                                 if (mCaseInsensitivePaths) {
                                     key = path.toLowerCase();
@@ -919,7 +927,7 @@
             }
         }
     }
-    
+
     private boolean inScanDirectory(String path, String[] directories) {
         for (int i = 0; i < directories.length; i++) {
             if (path.startsWith(directories[i])) {
@@ -928,25 +936,25 @@
         }
         return false;
     }
-    
+
     private void pruneDeadThumbnailFiles() {
         HashSet<String> existingFiles = new HashSet<String>();
         String directory = "/sdcard/DCIM/.thumbnails";
         String [] files = (new File(directory)).list();
         if (files == null)
             files = new String[0];
-        
+
         for (int i = 0; i < files.length; i++) {
             String fullPathString = directory + "/" + files[i];
             existingFiles.add(fullPathString);
         }
-        
+
         try {
             Cursor c = mMediaProvider.query(
-                    mThumbsUri, 
-                    new String [] { "_data" }, 
-                    null, 
-                    null, 
+                    mThumbsUri,
+                    new String [] { "_data" },
+                    null,
+                    null,
                     null);
             Log.v(TAG, "pruneDeadThumbnailFiles... " + c);
             if (c != null && c.moveToFirst()) {
@@ -955,7 +963,7 @@
                     existingFiles.remove(fullPathString);
                 } while (c.moveToNext());
             }
-            
+
             for (String fileToDelete : existingFiles) {
                 if (Config.LOGV)
                     Log.v(TAG, "fileToDelete is " + fileToDelete);
@@ -964,7 +972,7 @@
                 } catch (SecurityException ex) {
                 }
             }
-            
+
             Log.v(TAG, "/pruneDeadThumbnailFiles... " + c);
             if (c != null) {
                 c.close();
@@ -980,10 +988,10 @@
         while (iterator.hasNext()) {
             FileCacheEntry entry = iterator.next();
             String path = entry.mPath;
-            
+
             // remove database entries for files that no longer exist.
             boolean fileMissing = false;
-            
+
             if (!entry.mSeenInFileSystem) {
                 if (inScanDirectory(path, directories)) {
                     // we didn't see this file in the scan directory.
@@ -997,7 +1005,7 @@
                     }
                 }
             }
-            
+
             if (fileMissing) {
                 // do not delete missing playlists, since they may have been modified by the user.
                 // the user can delete them in the media player instead.
@@ -1016,25 +1024,25 @@
                 }
             }
         }
-        
+
         // handle playlists last, after we know what media files are on the storage.
         if (mProcessPlaylists) {
             processPlayLists();
         }
-        
+
         if (mOriginalCount == 0 && mImagesUri.equals(Images.Media.getContentUri("external")))
             pruneDeadThumbnailFiles();
-        
+
         // allow GC to clean up
         mGenreCache = null;
         mPlayLists = null;
         mFileCache = null;
         mMediaProvider = null;
     }
-    
+
     private void initialize(String volumeName) {
         mMediaProvider = mContext.getContentResolver().acquireProvider("media");
-        
+
         mAudioUri = Audio.Media.getContentUri(volumeName);
         mVideoUri = Video.Media.getContentUri(volumeName);
         mImagesUri = Images.Media.getContentUri(volumeName);
@@ -1051,23 +1059,23 @@
             if ( Process.supportsProcesses()) {
                 mCaseInsensitivePaths = true;
             }
-        }          
+        }
     }
 
     public void scanDirectories(String[] directories, String volumeName) {
         try {
             long start = System.currentTimeMillis();
-            initialize(volumeName);    
+            initialize(volumeName);
             prescan(null);
             long prescan = System.currentTimeMillis();
-            
+
             for (int i = 0; i < directories.length; i++) {
                 processDirectory(directories[i], MediaFile.sFileExtensions, mClient);
             }
             long scan = System.currentTimeMillis();
             postscan(directories);
             long end = System.currentTimeMillis();
-            
+
             if (Config.LOGD) {
                 Log.d(TAG, " prescan time: " + (prescan - start) + "ms\n");
                 Log.d(TAG, "    scan time: " + (scan - prescan) + "ms\n");
@@ -1088,9 +1096,9 @@
     // this function is used to scan a single file
     public Uri scanSingleFile(String path, String volumeName, String mimeType) {
         try {
-            initialize(volumeName);        
+            initialize(volumeName);
             prescan(path);
-    
+
             File file = new File(path);
             // always scan the file, so we can return the content://media Uri for existing files
             return mClient.doScanFile(path, mimeType, file.lastModified(), file.length(), true);
@@ -1105,7 +1113,7 @@
         int result = 0;
         int end1 = path1.length();
         int end2 = path2.length();
-        
+
         while (end1 > 0 && end2 > 0) {
             int slash1 = path1.lastIndexOf('/', end1 - 1);
             int slash2 = path2.lastIndexOf('/', end2 - 1);
@@ -1123,13 +1131,13 @@
                 end2 = start2 - 1;
             } else break;
         }
-               
+
         return result;
     }
 
-    private boolean addPlayListEntry(String entry, String playListDirectory, 
+    private boolean addPlayListEntry(String entry, String playListDirectory,
             Uri uri, ContentValues values, int index) {
-        
+
         // watch for trailing whitespace
         int entryLength = entry.length();
         while (entryLength > 0 && Character.isWhitespace(entry.charAt(entryLength - 1))) entryLength--;
@@ -1146,36 +1154,36 @@
         // if we have a relative path, combine entry with playListDirectory
         if (!fullPath)
             entry = playListDirectory + entry;
-            
+
         //FIXME - should we look for "../" within the path?
-        
+
         // best matching MediaFile for the play list entry
         FileCacheEntry bestMatch = null;
-        
+
         // number of rightmost file/directory names for bestMatch
-        int bestMatchLength = 0;    
-                
+        int bestMatchLength = 0;
+
         Iterator<FileCacheEntry> iterator = mFileCache.values().iterator();
         while (iterator.hasNext()) {
             FileCacheEntry cacheEntry = iterator.next();
             String path = cacheEntry.mPath;
-        
+
             if (path.equalsIgnoreCase(entry)) {
                 bestMatch = cacheEntry;
                 break;    // don't bother continuing search
             }
-            
+
             int matchLength = matchPaths(path, entry);
             if (matchLength > bestMatchLength) {
                 bestMatch = cacheEntry;
                 bestMatchLength = matchLength;
             }
         }
-        
+
         if (bestMatch == null) {
             return false;
         }
-        
+
         try {
         // OK, now we need to add this to the database
             values.clear();
@@ -1189,7 +1197,7 @@
 
         return true;
     }
-    
+
     private void processM3uPlayList(String path, String playListDirectory, Uri uri, ContentValues values) {
         BufferedReader reader = null;
         try {
@@ -1266,7 +1274,7 @@
         public WplHandler(String playListDirectory, Uri uri) {
             this.playListDirectory = playListDirectory;
             this.uri = uri;
-            
+
             RootElement root = new RootElement("smil");
             Element body = root.getChild("body");
             Element seq = body.getChild("seq");
@@ -1316,12 +1324,12 @@
             }
         }
     }
-    
+
     private void processPlayLists() throws RemoteException {
         Iterator<FileCacheEntry> iterator = mPlayLists.iterator();
         while (iterator.hasNext()) {
             FileCacheEntry entry = iterator.next();
-            String path = entry.mPath;  
+            String path = entry.mPath;
 
             // only process playlist files if they are new or have been modified since the last scan
             if (entry.mLastModifiedChanged) {
@@ -1332,7 +1340,7 @@
                 long rowId = entry.mRowId;
                 if (rowId == 0) {
                     // Create a new playlist
-        
+
                     int lastDot = path.lastIndexOf('.');
                     String name = (lastDot < 0 ? path.substring(lastSlash + 1) : path.substring(lastSlash + 1, lastDot));
                     values.put(MediaStore.Audio.Playlists.NAME, name);
@@ -1343,7 +1351,7 @@
                     membersUri = Uri.withAppendedPath(uri, Playlists.Members.CONTENT_DIRECTORY);
                 } else {
                     uri = ContentUris.withAppendedId(mPlaylistsUri, rowId);
-                    
+
                     // update lastModified value of existing playlist
                     values.put(MediaStore.Audio.Playlists.DATE_MODIFIED, entry.mLastModified);
                     mMediaProvider.update(uri, values, null, null);
@@ -1352,7 +1360,7 @@
                     membersUri = Uri.withAppendedPath(uri, Playlists.Members.CONTENT_DIRECTORY);
                     mMediaProvider.delete(membersUri, null, null);
                 }
-               
+
                 String playListDirectory = path.substring(0, lastSlash + 1);
                 MediaFile.MediaFileType mediaFileType = MediaFile.getFileType(path);
                 int fileType = (mediaFileType == null ? 0 : mediaFileType.fileType);
@@ -1363,7 +1371,7 @@
                     processPlsPlayList(path, playListDirectory, membersUri, values);
                 else if (fileType == MediaFile.FILE_TYPE_WPL)
                     processWplPlayList(path, playListDirectory, membersUri);
-                    
+
                 Cursor cursor = mMediaProvider.query(membersUri, PLAYLIST_MEMBERS_PROJECTION, null,
                         null, null);
                 try {
@@ -1377,18 +1385,18 @@
             }
         }
     }
-    
+
     private native void processDirectory(String path, String extensions, MediaScannerClient client);
     private native void processFile(String path, String mimeType, MediaScannerClient client);
     public native void setLocale(String locale);
-    
+
     public native byte[] extractAlbumArt(FileDescriptor fd);
 
     private native final void native_setup();
     private native final void native_finalize();
     @Override
-    protected void finalize() { 
+    protected void finalize() {
         mContext.getContentResolver().releaseProvider(mMediaProvider);
-        native_finalize(); 
+        native_finalize();
     }
 }
diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp
index c22cd53..5435da7 100644
--- a/media/libmedia/ToneGenerator.cpp
+++ b/media/libmedia/ToneGenerator.cpp
@@ -1225,6 +1225,8 @@
             LOGV("Cbk restarting track\n");
             if (lpToneGen->prepareWave()) {
                 lpToneGen->mState = TONE_STARTING;
+                // must reload lpToneDesc as prepareWave() may change mpToneDesc
+                lpToneDesc = lpToneGen->mpToneDesc;
             } else {
                 LOGW("Cbk restarting prepareWave() failed\n");
                 lpToneGen->mState = TONE_IDLE;
diff --git a/media/sdutils/sdutil.cpp b/media/sdutils/sdutil.cpp
index a9aabf0..06120f5 100644
--- a/media/sdutils/sdutil.cpp
+++ b/media/sdutils/sdutil.cpp
@@ -88,7 +88,7 @@
     String16 string(path);
     gMountService->mountMedia(string);
     
-    for (int i = 0; i < 10; i++) {
+    for (int i = 0; i < 60; i++) {
         if (isMounted(path)) {
             return 0;
         }
@@ -103,7 +103,7 @@
     String16 string(path);
     gMountService->unmountMedia(string);
 
-    for (int i = 0; i < 10; i++) {
+    for (int i = 0; i < 20; i++) {
         if (!isMounted(path)) {
             return 0;
         }
diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp
index c44478d..4461567 100644
--- a/opengl/libagl/egl.cpp
+++ b/opengl/libagl/egl.cpp
@@ -1103,7 +1103,7 @@
         // default value
         if (binarySearch<config_pair_t>(
                 (config_pair_t const*)attrib_list,
-                0, numAttributes,
+                0, numAttributes-1,
                 config_defaults[j].key) < 0)
         {
             for (int i=0 ; i<numConfigs ; i++) {
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index de323b3..c6e0f50 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -799,7 +799,7 @@
     EGLint patch_index = -1;
     GLint attr;
     size_t size = 0;
-    while ((attr=attrib_list[size])) {
+    while ((attr=attrib_list[size]) != EGL_NONE) {
         if (attr == EGL_CONFIG_ID)
             patch_index = size;
         size += 2;
diff --git a/packages/SettingsProvider/etc/bookmarks.xml b/packages/SettingsProvider/etc/bookmarks.xml
index 5fb6608..5af416a 100644
--- a/packages/SettingsProvider/etc/bookmarks.xml
+++ b/packages/SettingsProvider/etc/bookmarks.xml
@@ -53,6 +53,6 @@
         shortcut="s" />
     <bookmark
         package="com.google.android.youtube"
-        class="com.google.android.youtube.HomePage"
+        class="com.google.android.youtube.HomeActivity"
         shortcut="y" />
-</bookmarks>
\ No newline at end of file
+</bookmarks>
diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml
new file mode 100644
index 0000000..a7c01b3
--- /dev/null
+++ b/packages/SettingsProvider/res/values-cs/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"mobil,bluetooth,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-cs/strings.xml b/packages/SettingsProvider/res/values-cs/strings.xml
new file mode 100644
index 0000000..dc75a92
--- /dev/null
+++ b/packages/SettingsProvider/res/values-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Paměť pro nastavení"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml
new file mode 100644
index 0000000..f85d3f0
--- /dev/null
+++ b/packages/SettingsProvider/res/values-de/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"Mobilfunk, Bluetooth, WLAN"</string>
+    <string name="def_location_providers_allowed">"GPS"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-de/strings.xml b/packages/SettingsProvider/res/values-de/strings.xml
new file mode 100644
index 0000000..50c8a14
--- /dev/null
+++ b/packages/SettingsProvider/res/values-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Einstellungsspeicher"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml
new file mode 100644
index 0000000..a64805a
--- /dev/null
+++ b/packages/SettingsProvider/res/values-es/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"móvil,bluetooth,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-es/strings.xml b/packages/SettingsProvider/res/values-es/strings.xml
new file mode 100644
index 0000000..d30d195
--- /dev/null
+++ b/packages/SettingsProvider/res/values-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Almacenamiento de configuración"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml
new file mode 100644
index 0000000..56334cc
--- /dev/null
+++ b/packages/SettingsProvider/res/values-fr/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"cellulaire, Bluetooth, Wi-Fi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-fr/strings.xml b/packages/SettingsProvider/res/values-fr/strings.xml
new file mode 100644
index 0000000..686ec8b
--- /dev/null
+++ b/packages/SettingsProvider/res/values-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Stockage des paramètres"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml
new file mode 100644
index 0000000..19c0896
--- /dev/null
+++ b/packages/SettingsProvider/res/values-it/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"cellulare,bluetooth,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-it/strings.xml b/packages/SettingsProvider/res/values-it/strings.xml
new file mode 100644
index 0000000..29e462f
--- /dev/null
+++ b/packages/SettingsProvider/res/values-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Archiviazione impostazioni"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml
new file mode 100644
index 0000000..625235a
--- /dev/null
+++ b/packages/SettingsProvider/res/values-nl/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"mobiel,bluetooth,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-nl/strings.xml b/packages/SettingsProvider/res/values-nl/strings.xml
new file mode 100644
index 0000000..b37b535
--- /dev/null
+++ b/packages/SettingsProvider/res/values-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Opslagruimte voor instellingen"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml
new file mode 100644
index 0000000..b60832e
--- /dev/null
+++ b/packages/SettingsProvider/res/values-pl/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"komórka,bluetooth,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-pl/strings.xml b/packages/SettingsProvider/res/values-pl/strings.xml
new file mode 100644
index 0000000..4ab1e91
--- /dev/null
+++ b/packages/SettingsProvider/res/values-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Pamięć ustawień"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
new file mode 100644
index 0000000..fdbba88
--- /dev/null
+++ b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="def_airplane_mode_radios">"手機,藍牙,wifi"</string>
+    <string name="def_location_providers_allowed">"gps"</string>
+    <!-- no translation found for def_backup_transport (6764822064303377157) -->
+    <skip />
+</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rTW/strings.xml b/packages/SettingsProvider/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..b24144a
--- /dev/null
+++ b/packages/SettingsProvider/res/values-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"設定儲存空間"</string>
+</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index b6bc8a5..2b36904 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -16,12 +16,16 @@
 
 package com.android.providers.settings;
 
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.EOFException;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.zip.CRC32;
 
 import android.backup.BackupDataInput;
 import android.backup.BackupDataOutput;
@@ -34,7 +38,9 @@
 import android.media.AudioManager;
 import android.net.Uri;
 import android.net.wifi.WifiManager;
+import android.os.FileUtils;
 import android.os.ParcelFileDescriptor;
+import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.provider.Settings;
@@ -52,6 +58,13 @@
     private static final String KEY_SYNC = "sync_providers";
     private static final String KEY_LOCALE = "locale";
 
+    private static final int STATE_SYSTEM = 0;
+    private static final int STATE_SECURE = 1;
+    private static final int STATE_SYNC   = 2;
+    private static final int STATE_LOCALE = 3;
+    private static final int STATE_WIFI   = 4;
+    private static final int STATE_SIZE   = 5; // The number of state items
+
     private static String[] sortedSystemKeys = null;
     private static String[] sortedSecureKeys = null;
 
@@ -87,20 +100,22 @@
         byte[] secureSettingsData = getSecureSettings();
         byte[] syncProviders = mSettingsHelper.getSyncProviders();
         byte[] locale = mSettingsHelper.getLocaleData();
-        
-        data.writeEntityHeader(KEY_SYSTEM, systemSettingsData.length);
-        data.writeEntityData(systemSettingsData, systemSettingsData.length);
+        byte[] wifiData = getFileData(FILE_WIFI_SUPPLICANT);
 
-        data.writeEntityHeader(KEY_SECURE, secureSettingsData.length);
-        data.writeEntityData(secureSettingsData, secureSettingsData.length);
+        long[] stateChecksums = readOldChecksums(oldState);
 
-        data.writeEntityHeader(KEY_SYNC, syncProviders.length);
-        data.writeEntityData(syncProviders, syncProviders.length);
+        stateChecksums[STATE_SYSTEM] =
+                writeIfChanged(stateChecksums[STATE_SYSTEM], KEY_SYSTEM, systemSettingsData, data);
+        stateChecksums[STATE_SECURE] =
+                writeIfChanged(stateChecksums[STATE_SECURE], KEY_SECURE, secureSettingsData, data);
+        stateChecksums[STATE_SYNC] =
+                writeIfChanged(stateChecksums[STATE_SYNC], KEY_SYNC, syncProviders, data);
+        stateChecksums[STATE_LOCALE] =
+                writeIfChanged(stateChecksums[STATE_LOCALE], KEY_LOCALE, locale, data);
+        stateChecksums[STATE_WIFI] =
+                writeIfChanged(stateChecksums[STATE_WIFI], FILE_WIFI_SUPPLICANT, wifiData, data);
 
-        data.writeEntityHeader(KEY_LOCALE, locale.length);
-        data.writeEntityData(locale, locale.length);
-
-        backupFile(FILE_WIFI_SUPPLICANT, data);
+        writeNewChecksums(stateChecksums, newState);
     }
 
     @Override
@@ -115,11 +130,15 @@
             final int size = data.getDataSize();
             if (KEY_SYSTEM.equals(key)) {
                 restoreSettings(data, Settings.System.CONTENT_URI);
+                mSettingsHelper.applyAudioSettings();
             } else if (KEY_SECURE.equals(key)) {
                 restoreSettings(data, Settings.Secure.CONTENT_URI);
-// TODO: Re-enable WIFI restore when we figure out a solution for the permissions
-//            } else if (FILE_WIFI_SUPPLICANT.equals(key)) {
-//                restoreFile(FILE_WIFI_SUPPLICANT, data);
+            } else if (FILE_WIFI_SUPPLICANT.equals(key)) {
+                restoreFile(FILE_WIFI_SUPPLICANT, data);
+                FileUtils.setPermissions(FILE_WIFI_SUPPLICANT,
+                        FileUtils.S_IRUSR | FileUtils.S_IWUSR |
+                        FileUtils.S_IRGRP | FileUtils.S_IWGRP,
+                        Process.myUid(), Process.WIFI_UID);
             } else if (KEY_SYNC.equals(key)) {
                 mSettingsHelper.setSyncProviders(data);
             } else if (KEY_LOCALE.equals(key)) {
@@ -132,6 +151,49 @@
         }
     }
 
+    private long[] readOldChecksums(ParcelFileDescriptor oldState) throws IOException {
+        long[] stateChecksums = new long[STATE_SIZE];
+
+        DataInputStream dataInput = new DataInputStream(
+                new FileInputStream(oldState.getFileDescriptor()));
+        for (int i = 0; i < STATE_SIZE; i++) {
+            try {
+                stateChecksums[i] = dataInput.readLong();
+            } catch (EOFException eof) {
+                break;
+            }
+        }
+        dataInput.close();
+        return stateChecksums;
+    }
+
+    private void writeNewChecksums(long[] checksums, ParcelFileDescriptor newState)
+            throws IOException {
+        DataOutputStream dataOutput = new DataOutputStream(
+                new FileOutputStream(newState.getFileDescriptor()));
+        for (int i = 0; i < STATE_SIZE; i++) {
+            dataOutput.writeLong(checksums[i]);
+        }
+        dataOutput.close();
+    }
+
+    private long writeIfChanged(long oldChecksum, String key, byte[] data,
+            BackupDataOutput output) {
+        CRC32 checkSummer = new CRC32();
+        checkSummer.update(data);
+        long newChecksum = checkSummer.getValue();
+        if (oldChecksum == newChecksum) {
+            return oldChecksum;
+        }
+        try {
+            output.writeEntityHeader(key, data.length);
+            output.writeEntityData(data, data.length);
+        } catch (IOException ioe) {
+            // Bail
+        }
+        return newChecksum;
+    }
+
     private byte[] getSystemSettings() {
         Cursor sortedCursor = getContentResolver().query(Settings.System.CONTENT_URI, PROJECTION,
                 null, null, Settings.NameValueTable.NAME);
@@ -248,7 +310,7 @@
         return result;
     }
 
-    private void backupFile(String filename, BackupDataOutput data) {
+    private byte[] getFileData(String filename) {
         try {
             File file = new File(filename);
             if (file.exists()) {
@@ -260,14 +322,13 @@
                     got = fis.read(bytes, offset, bytes.length - offset);
                     if (got > 0) offset += got;
                 } while (offset < bytes.length && got > 0);
-                data.writeEntityHeader(filename, bytes.length);
-                data.writeEntityData(bytes, bytes.length);
+                return bytes;
             } else {
-                data.writeEntityHeader(filename, 0);
-                data.writeEntityData(EMPTY_DATA, 0);
+                return EMPTY_DATA;
             }
         } catch (IOException ioe) {
             Log.w(TAG, "Couldn't backup " + filename);
+            return EMPTY_DATA;
         }
     }
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index 2c5775a..ca739e6 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -167,6 +167,9 @@
         // Check if locale was set by the user:
         Configuration conf = mContext.getResources().getConfiguration();
         Locale loc = conf.locale;
+        // TODO: The following is not working as intended because the network is forcing a locale
+        // change after registering. Need to find some other way to detect if the user manually
+        // changed the locale
         if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard
 
         final String[] availableLocales = mContext.getAssets().getLocales();
@@ -193,6 +196,14 @@
         } catch (RemoteException e) {
             // Intentionally left blank
         }
+    }
 
+    /**
+     * Informs the audio service of changes to the settings so that
+     * they can be re-read and applied.
+     */
+    void applyAudioSettings() {
+        AudioManager am = new AudioManager(mContext);
+        am.reloadAudioSettings();
     }
 }
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 2abf8b3..c0de9a5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -126,11 +126,14 @@
         // a notification and then using the contract class to get their data,
         // the system property will be updated and they'll get the new data.
 
+        boolean backedUpDataChanged = false;
         String property = null, table = uri.getPathSegments().get(0);
         if (table.equals("system")) {
             property = Settings.System.SYS_PROP_SETTING_VERSION;
+            backedUpDataChanged = true;
         } else if (table.equals("secure")) {
             property = Settings.Secure.SYS_PROP_SETTING_VERSION;
+            backedUpDataChanged = true;
         } else if (table.equals("gservices")) {
             property = Settings.Gservices.SYS_PROP_SETTING_VERSION;
         }
@@ -142,7 +145,9 @@
         }
 
         // Inform the backup manager about a data change
-        mBackupManager.dataChanged();
+        if (backedUpDataChanged) {
+            mBackupManager.dataChanged();
+        }
         // Now send the notification through the content framework.
 
         String notify = uri.getQueryParameter("notify");
diff --git a/packages/SubscribedFeedsProvider/res/values-cs/strings.xml b/packages/SubscribedFeedsProvider/res/values-cs/strings.xml
new file mode 100644
index 0000000..9b782b0
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-cs/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Synchronizace zdrojů"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-de/strings.xml b/packages/SubscribedFeedsProvider/res/values-de/strings.xml
new file mode 100644
index 0000000..1ade594
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-de/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Feedsynchronisierung"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-es/strings.xml b/packages/SubscribedFeedsProvider/res/values-es/strings.xml
new file mode 100644
index 0000000..86c6946
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-es/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Sincronización de feeds"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-fr/strings.xml b/packages/SubscribedFeedsProvider/res/values-fr/strings.xml
new file mode 100644
index 0000000..924b960
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-fr/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Synchronisation des flux"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-it/strings.xml b/packages/SubscribedFeedsProvider/res/values-it/strings.xml
new file mode 100644
index 0000000..eabb17e
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-it/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Sincronizzazione feed"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-nl/strings.xml b/packages/SubscribedFeedsProvider/res/values-nl/strings.xml
new file mode 100644
index 0000000..b9e82d1
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-nl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Feeds synchroniseren"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-pl/strings.xml b/packages/SubscribedFeedsProvider/res/values-pl/strings.xml
new file mode 100644
index 0000000..02da9f3
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-pl/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Synchronizowanie kanałów"</string>
+</resources>
diff --git a/packages/SubscribedFeedsProvider/res/values-zh-rTW/strings.xml b/packages/SubscribedFeedsProvider/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..e6643cd
--- /dev/null
+++ b/packages/SubscribedFeedsProvider/res/values-zh-rTW/strings.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"同步資訊提供"</string>
+</resources>
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index 1958ba9..82067be 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -33,6 +33,8 @@
 #define DEFAULT_TTS_FORMAT      AudioSystem::PCM_16_BIT
 #define DEFAULT_TTS_NB_CHANNELS 1
 #define DEFAULT_TTS_BUFFERSIZE  1024
+// TODO use the TTS stream type when available
+#define DEFAULT_TTS_STREAM_TYPE AudioSystem::MUSIC
 
 #define USAGEMODE_PLAY_IMMEDIATELY 0
 #define USAGEMODE_WRITE_TO_FILE    1
@@ -46,15 +48,20 @@
     jmethodID   synthProxyMethodPost;
 };
 
+// structure to hold the data that is used each time the TTS engine has synthesized more data
 struct afterSynthData_t {
     jint jniStorage;
     int  usageMode;
     FILE* outputFile;
+    AudioSystem::stream_type streamType;
 };
 
 // ----------------------------------------------------------------------------
 static fields_t javaTTSFields;
 
+// TODO move to synth member once we have multiple simultaneous engines running
+static Mutex engineMutex;
+
 // ----------------------------------------------------------------------------
 class SynthProxyJniStorage {
     public :
@@ -62,6 +69,7 @@
         jobject                   tts_ref;
         TtsEngine*                mNativeSynthInterface;
         AudioTrack*               mAudioOut;
+        AudioSystem::stream_type  mStreamType;
         uint32_t                  mSampleRate;
         AudioSystem::audio_format mAudFormat;
         int                       mNbChannels;
@@ -73,11 +81,13 @@
             tts_ref = NULL;
             mNativeSynthInterface = NULL;
             mAudioOut = NULL;
+            mStreamType = DEFAULT_TTS_STREAM_TYPE;
             mSampleRate = DEFAULT_TTS_RATE;
             mAudFormat  = DEFAULT_TTS_FORMAT;
             mNbChannels = DEFAULT_TTS_NB_CHANNELS;
             mBufferSize = DEFAULT_TTS_BUFFERSIZE;
             mBuffer = new int8_t[mBufferSize];
+            memset(mBuffer, 0, mBufferSize);
         }
 
         ~SynthProxyJniStorage() {
@@ -97,34 +107,33 @@
             }
         }
 
-        void createAudioOut(uint32_t rate, AudioSystem::audio_format format,
-                int channel) {
+        void createAudioOut(AudioSystem::stream_type streamType, uint32_t rate,
+                AudioSystem::audio_format format, int channel) {
             mSampleRate = rate;
             mAudFormat  = format;
             mNbChannels = channel;
 
-            // TODO use the TTS stream type
-            int streamType = AudioSystem::MUSIC;
+            mStreamType = streamType;
 
             // retrieve system properties to ensure successful creation of the
             // AudioTrack object for playback
             int afSampleRate;
-            if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) {
+            if (AudioSystem::getOutputSamplingRate(&afSampleRate, mStreamType) != NO_ERROR) {
                 afSampleRate = 44100;
             }
             int afFrameCount;
-            if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) {
+            if (AudioSystem::getOutputFrameCount(&afFrameCount, mStreamType) != NO_ERROR) {
                 afFrameCount = 2048;
             }
             uint32_t afLatency;
-            if (AudioSystem::getOutputLatency(&afLatency, streamType) != NO_ERROR) {
+            if (AudioSystem::getOutputLatency(&afLatency, mStreamType) != NO_ERROR) {
                 afLatency = 500;
             }
             uint32_t minBufCount = afLatency / ((1000 * afFrameCount)/afSampleRate);
             if (minBufCount < 2) minBufCount = 2;
             int minFrameCount = (afFrameCount * rate * minBufCount)/afSampleRate;
 
-            mAudioOut = new AudioTrack(streamType, rate, format, channel,
+            mAudioOut = new AudioTrack(mStreamType, rate, format, channel,
                     minFrameCount > 4096 ? minFrameCount : 4096,
                     0, 0, 0, 0); // not using an AudioTrack callback
 
@@ -142,21 +151,21 @@
 
 
 // ----------------------------------------------------------------------------
-void prepAudioTrack(SynthProxyJniStorage* pJniData,
-        uint32_t rate, AudioSystem::audio_format format, int channel)
-{
+void prepAudioTrack(SynthProxyJniStorage* pJniData, AudioSystem::stream_type streamType,
+        uint32_t rate, AudioSystem::audio_format format, int channel) {
     // Don't bother creating a new audiotrack object if the current
-    // object is already set.
+    // object is already initialized with the same audio parameters.
     if ( pJniData->mAudioOut &&
          (rate == pJniData->mSampleRate) &&
          (format == pJniData->mAudFormat) &&
-         (channel == pJniData->mNbChannels) ){
+         (channel == pJniData->mNbChannels) &&
+         (streamType == pJniData->mStreamType) ){
         return;
     }
     if (pJniData->mAudioOut){
         pJniData->killAudio();
     }
-    pJniData->createAudioOut(rate, format, channel);
+    pJniData->createAudioOut(streamType, rate, format, channel);
 }
 
 
@@ -186,9 +195,10 @@
         }
 
         if (bufferSize > 0) {
-            prepAudioTrack(pJniData, rate, format, channel);
+            prepAudioTrack(pJniData, pForAfter->streamType, rate, format, channel);
             if (pJniData->mAudioOut) {
                 pJniData->mAudioOut->write(wav, bufferSize);
+                memset(wav, 0, bufferSize);
                 //LOGV("AudioTrack wrote: %d bytes", bufferSize);
             } else {
                 LOGE("Can't play, null audiotrack");
@@ -203,6 +213,7 @@
         }
         if (bufferSize > 0){
             fwrite(wav, 1, bufferSize, pForAfter->outputFile);
+            memset(wav, 0, bufferSize);
         }
     }
     // Future update:
@@ -241,7 +252,7 @@
     SynthProxyJniStorage* pJniStorage = new SynthProxyJniStorage();
 
     prepAudioTrack(pJniStorage,
-            DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS);
+            DEFAULT_TTS_STREAM_TYPE, DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS);
 
     const char *nativeSoLibNativeString =
             env->GetStringUTFChars(nativeSoLib, 0);
@@ -278,6 +289,7 @@
 {
     if (jniData) {
         SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
+        env->DeleteGlobalRef(pSynthData->tts_ref);
         delete pSynthData;
     }
 }
@@ -321,6 +333,8 @@
         return result;
     }
 
+    Mutex::Autolock l(engineMutex);
+
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
     const char *langNativeString = env->GetStringUTFChars(language, 0);
     const char *countryNativeString = env->GetStringUTFChars(country, 0);
@@ -380,6 +394,8 @@
     char buffer [bufSize];
     sprintf(buffer, "%d", speechRate);
 
+    Mutex::Autolock l(engineMutex);
+
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
     LOGI("setting speech rate to %d", speechRate);
 
@@ -402,6 +418,8 @@
         return result;
     }
 
+    Mutex::Autolock l(engineMutex);
+
     int bufSize = 10;
     char buffer [bufSize];
     sprintf(buffer, "%d", pitch);
@@ -434,6 +452,8 @@
         return result;
     }
 
+    Mutex::Autolock l(engineMutex);
+
     // Retrieve audio parameters before writing the file header
     AudioSystem::audio_format encoding = DEFAULT_TTS_FORMAT;
     uint32_t rate = DEFAULT_TTS_RATE;
@@ -468,6 +488,7 @@
 
     unsigned int unique_identifier;
 
+    memset(pSynthData->mBuffer, 0, pSynthData->mBufferSize);
     result = pSynthData->mNativeSynthInterface->synthesizeText(textNativeString,
             pSynthData->mBuffer, pSynthData->mBufferSize, (void *)pForAfter);
 
@@ -526,7 +547,7 @@
 
 static int
 android_tts_SynthProxy_speak(JNIEnv *env, jobject thiz, jint jniData,
-        jstring textJavaString)
+        jstring textJavaString, jint javaStreamType)
 {
     int result = TTS_FAILURE;
 
@@ -535,19 +556,22 @@
         return result;
     }
 
+    Mutex::Autolock l(engineMutex);
+
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
 
     if (pSynthData->mAudioOut) {
-        pSynthData->mAudioOut->stop();
         pSynthData->mAudioOut->start();
     }
 
     afterSynthData_t* pForAfter = new (afterSynthData_t);
     pForAfter->jniStorage = jniData;
     pForAfter->usageMode  = USAGEMODE_PLAY_IMMEDIATELY;
+    pForAfter->streamType = (AudioSystem::stream_type) javaStreamType;
 
     if (pSynthData->mNativeSynthInterface) {
         const char *textNativeString = env->GetStringUTFChars(textJavaString, 0);
+        memset(pSynthData->mBuffer, 0, pSynthData->mBufferSize);
         result = pSynthData->mNativeSynthInterface->synthesizeText(textNativeString,
                 pSynthData->mBuffer, pSynthData->mBufferSize, (void *)pForAfter);
         env->ReleaseStringUTFChars(textJavaString, textNativeString);
@@ -569,12 +593,12 @@
 
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
 
-    if (pSynthData->mNativeSynthInterface) {
-        result = pSynthData->mNativeSynthInterface->stop();
-    }
     if (pSynthData->mAudioOut) {
         pSynthData->mAudioOut->stop();
     }
+    if (pSynthData->mNativeSynthInterface) {
+        result = pSynthData->mNativeSynthInterface->stop();
+    }
 
     return result;
 }
@@ -588,6 +612,8 @@
         return;
     }
 
+    Mutex::Autolock l(engineMutex);
+
     SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
     if (pSynthData->mNativeSynthInterface) {
         pSynthData->mNativeSynthInterface->shutdown();
@@ -596,24 +622,6 @@
 }
 
 
-// TODO add buffer format
-static void
-android_tts_SynthProxy_playAudioBuffer(JNIEnv *env, jobject thiz, jint jniData,
-        int bufferPointer, int bufferSize)
-{
-LOGI("android_tts_SynthProxy_playAudioBuffer");
-    if (jniData == 0) {
-        LOGE("android_tts_SynthProxy_playAudioBuffer(): invalid JNI data");
-        return;
-    }
-
-    SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
-    short* wav = (short*) bufferPointer;
-    pSynthData->mAudioOut->write(wav, bufferSize);
-    //LOGI("AudioTrack wrote: %d bytes", bufferSize);
-}
-
-
 static jobjectArray
 android_tts_SynthProxy_getLanguage(JNIEnv *env, jobject thiz, jint jniData)
 {
@@ -672,7 +680,7 @@
         (void*)android_tts_SynthProxy_stop
     },
     {   "native_speak",
-        "(ILjava/lang/String;)I",
+        "(ILjava/lang/String;I)I",
         (void*)android_tts_SynthProxy_speak
     },
     {   "native_synthesizeToFile",
@@ -699,10 +707,6 @@
         "(II)I",
         (void*)android_tts_SynthProxy_setPitch
     },
-    {   "native_playAudioBuffer",
-        "(III)V",
-        (void*)android_tts_SynthProxy_playAudioBuffer
-    },
     {   "native_getLanguage",
         "(I)[Ljava/lang/String;",
         (void*)android_tts_SynthProxy_getLanguage
diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java
index bb16b14..a0814aa 100755
--- a/packages/TtsService/src/android/tts/SynthProxy.java
+++ b/packages/TtsService/src/android/tts/SynthProxy.java
@@ -15,6 +15,8 @@
  */
 package android.tts;
 
+import android.media.AudioManager;
+import android.media.AudioSystem;
 import android.util.Log;
 import java.lang.ref.WeakReference;
 
@@ -52,8 +54,13 @@
     /**
      * Synthesize speech and speak it directly using AudioTrack.
      */
-    public int speak(String text) {
-        return native_speak(mJniData, text);
+    public int speak(String text, int streamType) {
+        if ((streamType > -1) && (streamType < AudioSystem.getNumStreamTypes())) {
+            return native_speak(mJniData, text, streamType);
+        } else {
+            Log.e("SynthProxy", "Trying to speak with invalid stream type " + streamType);
+            return native_speak(mJniData, text, AudioManager.STREAM_MUSIC);
+        }
     }
 
     /**
@@ -102,13 +109,6 @@
     }
 
     /**
-     * Plays the given audio buffer.
-     */
-    public void playAudioBuffer(int bufferPointer, int bufferSize) {
-        native_playAudioBuffer(mJniData, bufferPointer, bufferSize);
-    }
-
-    /**
      * Returns the currently set language, country and variant information.
      */
     public String[] getLanguage() {
@@ -156,7 +156,7 @@
 
     private native final int native_stop(int jniData);
 
-    private native final int native_speak(int jniData, String text);
+    private native final int native_speak(int jniData, String text, int streamType);
 
     private native final int native_synthesizeToFile(int jniData, String text, String filename);
 
@@ -173,9 +173,6 @@
 
     private native final int native_setPitch(int jniData, int speechRate);
 
-    // TODO add buffer format
-    private native final void native_playAudioBuffer(int jniData, int bufferPointer, int bufferSize);
-
     private native final String[] native_getLanguage(int jniData);
 
     private native final int native_getRate(int jniData);
diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java
index a713edf..cfefcb7 100755
--- a/packages/TtsService/src/android/tts/TtsService.java
+++ b/packages/TtsService/src/android/tts/TtsService.java
@@ -22,6 +22,7 @@
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.net.Uri;
@@ -38,6 +39,8 @@
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.TimeUnit;
+
 
 /**
  * @hide Synthesizes speech from text. This is implemented as a service so that
@@ -57,23 +60,29 @@
         public int mType = TEXT;
         public long mDuration = 0;
         public String mFilename = null;
+        public String mCallingApp = "";
 
-        public SpeechItem(String text, ArrayList<String> params, int itemType) {
+        public SpeechItem(String source, String text, ArrayList<String> params, int itemType) {
             mText = text;
             mParams = params;
             mType = itemType;
+            mCallingApp = source;
         }
 
-        public SpeechItem(long silenceTime) {
+        public SpeechItem(String source, long silenceTime, ArrayList<String> params) {
             mDuration = silenceTime;
+            mParams = params;
             mType = SILENCE;
+            mCallingApp = source;
         }
 
-        public SpeechItem(String text, ArrayList<String> params, int itemType, String filename) {
+        public SpeechItem(String source, String text, ArrayList<String> params,
+                int itemType, String filename) {
             mText = text;
             mParams = params;
             mType = itemType;
             mFilename = filename;
+            mCallingApp = source;
         }
 
     }
@@ -103,18 +112,26 @@
 
     private static final int MAX_SPEECH_ITEM_CHAR_LENGTH = 4000;
     private static final int MAX_FILENAME_LENGTH = 250;
+    // TODO use the TTS stream type when available
+    private static final int DEFAULT_STREAM_TYPE = AudioManager.STREAM_MUSIC;
 
     private static final String ACTION = "android.intent.action.START_TTS_SERVICE";
     private static final String CATEGORY = "android.intent.category.TTS";
     private static final String PKGNAME = "android.tts";
 
-    final RemoteCallbackList<android.speech.tts.ITtsCallback> mCallbacks = new RemoteCallbackList<ITtsCallback>();
+    private final RemoteCallbackList<ITtsCallback> mCallbacks
+            = new RemoteCallbackList<ITtsCallback>();
+
+    private HashMap<String, ITtsCallback> mCallbacksMap;
 
     private Boolean mIsSpeaking;
     private ArrayList<SpeechItem> mSpeechQueue;
     private HashMap<String, SoundResource> mEarcons;
     private HashMap<String, SoundResource> mUtterances;
     private MediaPlayer mPlayer;
+    private SpeechItem mCurrentSpeechItem;
+    private HashMap<SpeechItem, Boolean> mKillList; // Used to ensure that in-flight synth calls
+                                                    // are killed when stop is used.
     private TtsService mSelf;
 
     private ContentResolver mResolver;
@@ -122,25 +139,30 @@
     private final ReentrantLock speechQueueLock = new ReentrantLock();
     private final ReentrantLock synthesizerLock = new ReentrantLock();
 
-    private SynthProxy nativeSynth;
+    private static SynthProxy sNativeSynth = null;
     @Override
     public void onCreate() {
         super.onCreate();
-        //Log.i("TTS", "TTS starting");
+        Log.i("TtsService", "TtsService.onCreate()");
 
         mResolver = getContentResolver();
 
         String soLibPath = "/system/lib/libttspico.so";
-        nativeSynth = new SynthProxy(soLibPath);
+        if (sNativeSynth == null) {
+            sNativeSynth = new SynthProxy(soLibPath);
+        }
 
         mSelf = this;
         mIsSpeaking = false;
 
         mEarcons = new HashMap<String, SoundResource>();
         mUtterances = new HashMap<String, SoundResource>();
+        mCallbacksMap = new HashMap<String, android.speech.tts.ITtsCallback>();
 
         mSpeechQueue = new ArrayList<SpeechItem>();
         mPlayer = null;
+        mCurrentSpeechItem = null;
+        mKillList = new HashMap<SpeechItem, Boolean>();
 
         setDefaultSettings();
     }
@@ -151,7 +173,7 @@
         // Don't hog the media player
         cleanUpPlayer();
 
-        nativeSynth.shutdown();
+        sNativeSynth.shutdown();
 
         // Unregister all callbacks.
         mCallbacks.kill();
@@ -159,10 +181,10 @@
 
 
     private void setDefaultSettings() {
-        setLanguage(this.getDefaultLanguage(), getDefaultCountry(), getDefaultLocVariant());
+        setLanguage("", this.getDefaultLanguage(), getDefaultCountry(), getDefaultLocVariant());
 
         // speech rate
-        setSpeechRate(getDefaultRate());
+        setSpeechRate("", getDefaultRate());
     }
 
 
@@ -217,38 +239,38 @@
     }
 
 
-    private int setSpeechRate(int rate) {
+    private int setSpeechRate(String callingApp, int rate) {
         if (isDefaultEnforced()) {
-            return nativeSynth.setSpeechRate(getDefaultRate());
+            return sNativeSynth.setSpeechRate(getDefaultRate());
         } else {
-            return nativeSynth.setSpeechRate(rate);
+            return sNativeSynth.setSpeechRate(rate);
         }
     }
 
 
-    private int setPitch(int pitch) {
-        return nativeSynth.setPitch(pitch);
+    private int setPitch(String callingApp, int pitch) {
+        return sNativeSynth.setPitch(pitch);
     }
 
 
     private int isLanguageAvailable(String lang, String country, String variant) {
-        //Log.v("TTS", "TtsService.isLanguageAvailable(" + lang + ", " + country + ", " +variant+")");
-        return nativeSynth.isLanguageAvailable(lang, country, variant);
+        //Log.v("TtsService", "TtsService.isLanguageAvailable(" + lang + ", " + country + ", " +variant+")");
+        return sNativeSynth.isLanguageAvailable(lang, country, variant);
     }
 
 
     private String[] getLanguage() {
-        return nativeSynth.getLanguage();
+        return sNativeSynth.getLanguage();
     }
 
 
-    private int setLanguage(String lang, String country, String variant) {
-        //Log.v("TTS", "TtsService.setLanguage(" + lang + ", " + country + ", " + variant + ")");
+    private int setLanguage(String callingApp, String lang, String country, String variant) {
+        Log.v("TtsService", "TtsService.setLanguage(" + lang + ", " + country + ", " + variant + ")");
         if (isDefaultEnforced()) {
-            return nativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(),
+            return sNativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(),
                     getDefaultLocVariant());
         } else {
-            return nativeSynth.setLanguage(lang, country, variant);
+            return sNativeSynth.setLanguage(lang, country, variant);
         }
     }
 
@@ -263,7 +285,7 @@
      * @param resId
      *            The resource ID of the sound within its package
      */
-    private void addSpeech(String text, String packageName, int resId) {
+    private void addSpeech(String callingApp, String text, String packageName, int resId) {
         mUtterances.put(text, new SoundResource(packageName, resId));
     }
 
@@ -276,7 +298,7 @@
      *            The filename of the sound resource. This must be a complete
      *            path like: (/sdcard/mysounds/mysoundbite.mp3).
      */
-    private void addSpeech(String text, String filename) {
+    private void addSpeech(String callingApp, String text, String filename) {
         mUtterances.put(text, new SoundResource(filename));
     }
 
@@ -290,7 +312,7 @@
      * @param resId
      *            The resource ID of the sound within its package
      */
-    private void addEarcon(String earcon, String packageName, int resId) {
+    private void addEarcon(String callingApp, String earcon, String packageName, int resId) {
         mEarcons.put(earcon, new SoundResource(packageName, resId));
     }
 
@@ -303,7 +325,7 @@
      *            The filename of the sound resource. This must be a complete
      *            path like: (/sdcard/mysounds/mysoundbite.mp3).
      */
-    private void addEarcon(String earcon, String filename) {
+    private void addEarcon(String callingApp, String earcon, String filename) {
         mEarcons.put(earcon, new SoundResource(filename));
     }
 
@@ -313,17 +335,20 @@
      * @param text
      *            The text that should be spoken
      * @param queueMode
-     *            0 for no queue (interrupts all previous utterances), 1 for
-     *            queued
+     *            TextToSpeech.TTS_QUEUE_FLUSH for no queue (interrupts all previous utterances),
+     *            TextToSpeech.TTS_QUEUE_ADD for queued
      * @param params
      *            An ArrayList of parameters. This is not implemented for all
      *            engines.
      */
-    private int speak(String text, int queueMode, ArrayList<String> params) {
-        if (queueMode == 0) {
-            stop();
+    private int speak(String callingApp, String text, int queueMode, ArrayList<String> params) {
+        Log.v("TtsService", "TTS service received " + text);
+        if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) {
+            stop(callingApp);
+        } else if (queueMode == 2) {
+            stopAll(callingApp);
         }
-        mSpeechQueue.add(new SpeechItem(text, params, SpeechItem.TEXT));
+        mSpeechQueue.add(new SpeechItem(callingApp, text, params, SpeechItem.TEXT));
         if (!mIsSpeaking) {
             processSpeechQueue();
         }
@@ -336,18 +361,20 @@
      * @param earcon
      *            The earcon that should be played
      * @param queueMode
-     *            0 for no queue (interrupts all previous utterances), 1 for
-     *            queued
+     *            TextToSpeech.TTS_QUEUE_FLUSH for no queue (interrupts all previous utterances),
+     *            TextToSpeech.TTS_QUEUE_ADD for queued
      * @param params
      *            An ArrayList of parameters. This is not implemented for all
      *            engines.
      */
-    private int playEarcon(String earcon, int queueMode,
+    private int playEarcon(String callingApp, String earcon, int queueMode,
             ArrayList<String> params) {
-        if (queueMode == 0) {
-            stop();
+        if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) {
+            stop(callingApp);
+        } else if (queueMode == 2) {
+            stopAll(callingApp);
         }
-        mSpeechQueue.add(new SpeechItem(earcon, params, SpeechItem.EARCON));
+        mSpeechQueue.add(new SpeechItem(callingApp, earcon, params, SpeechItem.EARCON));
         if (!mIsSpeaking) {
             processSpeechQueue();
         }
@@ -355,49 +382,153 @@
     }
 
     /**
-     * Stops all speech output and removes any utterances still in the queue.
+     * Stops all speech output and removes any utterances still in the queue for the calling app.
      */
-    private int stop() {
-        Log.i("TTS", "Stopping");
-        mSpeechQueue.clear();
-
-        int result = nativeSynth.stop();
-        mIsSpeaking = false;
-        if (mPlayer != null) {
-            try {
-                mPlayer.stop();
-            } catch (IllegalStateException e) {
-                // Do nothing, the player is already stopped.
+    private int stop(String callingApp) {
+        int result = TextToSpeech.TTS_ERROR;
+        boolean speechQueueAvailable = false;
+        try{
+            // If the queue is locked for more than 1 second,
+            // something has gone very wrong with processSpeechQueue.
+            speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS);
+            if (speechQueueAvailable) {
+                Log.i("TtsService", "Stopping");
+                for (int i = mSpeechQueue.size() - 1; i > -1; i--){
+                    if (mSpeechQueue.get(i).mCallingApp.equals(callingApp)){
+                        mSpeechQueue.remove(i);
+                    }
+                }
+                if ((mCurrentSpeechItem != null) &&
+                     mCurrentSpeechItem.mCallingApp.equals(callingApp)) {
+                    result = sNativeSynth.stop();
+                    mKillList.put(mCurrentSpeechItem, true);
+                    if (mPlayer != null) {
+                        try {
+                            mPlayer.stop();
+                        } catch (IllegalStateException e) {
+                            // Do nothing, the player is already stopped.
+                        }
+                    }
+                    mIsSpeaking = false;
+                    mCurrentSpeechItem = null;
+                } else {
+                    result = TextToSpeech.TTS_SUCCESS;
+                }
+                Log.i("TtsService", "Stopped");
             }
+        } catch (InterruptedException e) {
+          Log.e("TtsService", "TTS stop: tryLock interrupted");
+          e.printStackTrace();
+        } finally {
+            // This check is needed because finally will always run; even if the
+            // method returns somewhere in the try block.
+            if (speechQueueAvailable) {
+                speechQueueLock.unlock();
+            }
+            return result;
         }
-        Log.i("TTS", "Stopped");
-        return result;
+    }
+
+
+
+    /**
+     * Stops all speech output and removes any utterances still in the queue globally.
+     */
+    private int stopAll(String callingApp) {
+        int result = TextToSpeech.TTS_ERROR;
+        boolean speechQueueAvailable = false;
+        try{
+            // If the queue is locked for more than 1 second,
+            // something has gone very wrong with processSpeechQueue.
+            speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS);
+            if (speechQueueAvailable) {
+                for (int i = mSpeechQueue.size() - 1; i > -1; i--){
+                    if (mSpeechQueue.get(i).mType != SpeechItem.TEXT_TO_FILE){
+                        mSpeechQueue.remove(i);
+                    }
+                }
+                if ((mCurrentSpeechItem != null) &&
+                    ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) ||
+                      mCurrentSpeechItem.mCallingApp.equals(callingApp))) {
+                    result = sNativeSynth.stop();
+                    mKillList.put(mCurrentSpeechItem, true);
+                    if (mPlayer != null) {
+                        try {
+                            mPlayer.stop();
+                        } catch (IllegalStateException e) {
+                            // Do nothing, the player is already stopped.
+                        }
+                    }
+                    mIsSpeaking = false;
+                    mCurrentSpeechItem = null;
+                } else {
+                    result = TextToSpeech.TTS_SUCCESS;
+                }
+                Log.i("TtsService", "Stopped all");
+            }
+        } catch (InterruptedException e) {
+          Log.e("TtsService", "TTS stopAll: tryLock interrupted");
+          e.printStackTrace();
+        } finally {
+            // This check is needed because finally will always run; even if the
+            // method returns somewhere in the try block.
+            if (speechQueueAvailable) {
+                speechQueueLock.unlock();
+            }
+            return result;
+        }
     }
 
     public void onCompletion(MediaPlayer arg0) {
+        String callingApp = mCurrentSpeechItem.mCallingApp;
+        ArrayList<String> params = mCurrentSpeechItem.mParams;
+        String utteranceId = "";
+        if (params != null){
+            for (int i = 0; i < params.size() - 1; i = i + 2){
+            String param = params.get(i);
+                if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){
+                    utteranceId = params.get(i+1);
+                }
+            }
+        }
+        if (utteranceId.length() > 0){
+            dispatchUtteranceCompletedCallback(utteranceId, callingApp);
+        }
         processSpeechQueue();
     }
 
-    private int playSilence(long duration, int queueMode,
+    private int playSilence(String callingApp, long duration, int queueMode,
             ArrayList<String> params) {
-        if (queueMode == 0) {
-            stop();
+        if (queueMode == TextToSpeech.TTS_QUEUE_FLUSH) {
+            stop(callingApp);
         }
-        mSpeechQueue.add(new SpeechItem(duration));
+        mSpeechQueue.add(new SpeechItem(callingApp, duration, params));
         if (!mIsSpeaking) {
             processSpeechQueue();
         }
         return TextToSpeech.TTS_SUCCESS;
     }
 
-    private void silence(final long duration) {
+    private void silence(final SpeechItem speechItem) {
         class SilenceThread implements Runnable {
             public void run() {
+                String utteranceId = "";
+                if (speechItem.mParams != null){
+                    for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){
+                        String param = speechItem.mParams.get(i);
+                        if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){
+                            utteranceId = speechItem.mParams.get(i+1);
+                        }
+                    }
+                }
                 try {
-                    Thread.sleep(duration);
+                    Thread.sleep(speechItem.mDuration);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 } finally {
+                    if (utteranceId.length() > 0){
+                        dispatchUtteranceCompletedCallback(utteranceId, speechItem.mCallingApp);
+                    }
                     processSpeechQueue();
                 }
             }
@@ -407,47 +538,70 @@
         slnc.start();
     }
 
-    private void speakInternalOnly(final String text,
-            final ArrayList<String> params) {
+    private void speakInternalOnly(final SpeechItem speechItem) {
         class SynthThread implements Runnable {
             public void run() {
                 boolean synthAvailable = false;
+                String utteranceId = "";
                 try {
                     synthAvailable = synthesizerLock.tryLock();
                     if (!synthAvailable) {
                         Thread.sleep(100);
                         Thread synth = (new Thread(new SynthThread()));
-                        synth.setPriority(Thread.MIN_PRIORITY);
+                        //synth.setPriority(Thread.MIN_PRIORITY);
                         synth.start();
                         return;
                     }
-                    if (params != null){
-                        String language = "";
-                        String country = "";
-                        String variant = "";
-                        for (int i = 0; i < params.size() - 1; i = i + 2){
-                            String param = params.get(i);
-                            if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)){
-                                setSpeechRate(Integer.parseInt(params.get(i+1)));
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){
-                                language = params.get(i+1);
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){
-                                country = params.get(i+1);
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){
-                                variant = params.get(i+1);
+                    int streamType = DEFAULT_STREAM_TYPE;
+                    String language = "";
+                    String country = "";
+                    String variant = "";
+                    String speechRate = "";
+                    if (speechItem.mParams != null){
+                        for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){
+                            String param = speechItem.mParams.get(i);
+                            if (param != null) {
+                                if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)) {
+                                    speechRate = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){
+                                    language = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){
+                                    country = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){
+                                    variant = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){
+                                    utteranceId = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_STREAM)) {
+                                    try {
+                                        streamType
+                                                = Integer.parseInt(speechItem.mParams.get(i + 1));
+                                    } catch (NumberFormatException e) {
+                                        streamType = DEFAULT_STREAM_TYPE;
+                                    }
+                                }
                             }
                         }
-                        if (language.length() > 0){
-                            setLanguage(language, country, variant);
-                        }
                     }
-                    nativeSynth.speak(text);
+                    // Only do the synthesis if it has not been killed by a subsequent utterance.
+                    if (mKillList.get(speechItem) == null) {
+                        if (language.length() > 0){
+                            setLanguage("", language, country, variant);
+                        }
+                        if (speechRate.length() > 0){
+                            setSpeechRate("", Integer.parseInt(speechRate));
+                        }
+                        sNativeSynth.speak(speechItem.mText, streamType);
+                    }
                 } catch (InterruptedException e) {
+                    Log.e("TtsService", "TTS speakInternalOnly(): tryLock interrupted");
                     e.printStackTrace();
                 } finally {
                     // This check is needed because finally will always run;
                     // even if the
                     // method returns somewhere in the try block.
+                    if (utteranceId.length() > 0){
+                        dispatchUtteranceCompletedCallback(utteranceId, speechItem.mCallingApp);
+                    }
                     if (synthAvailable) {
                         synthesizerLock.unlock();
                     }
@@ -456,52 +610,67 @@
             }
         }
         Thread synth = (new Thread(new SynthThread()));
-        synth.setPriority(Thread.MIN_PRIORITY);
+        //synth.setPriority(Thread.MIN_PRIORITY);
         synth.start();
     }
 
-    private void synthToFileInternalOnly(final String text,
-            final ArrayList<String> params, final String filename) {
+    private void synthToFileInternalOnly(final SpeechItem speechItem) {
         class SynthThread implements Runnable {
             public void run() {
-                Log.i("TTS", "Synthesizing to " + filename);
                 boolean synthAvailable = false;
+                String utteranceId = "";
+                Log.i("TtsService", "Synthesizing to " + speechItem.mFilename);
                 try {
                     synthAvailable = synthesizerLock.tryLock();
                     if (!synthAvailable) {
                         Thread.sleep(100);
                         Thread synth = (new Thread(new SynthThread()));
-                        synth.setPriority(Thread.MIN_PRIORITY);
+                        //synth.setPriority(Thread.MIN_PRIORITY);
                         synth.start();
                         return;
                     }
-                    if (params != null){
-                        String language = "";
-                        String country = "";
-                        String variant = "";
-                        for (int i = 0; i < params.size() - 1; i = i + 2){
-                            String param = params.get(i);
-                            if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)){
-                                setSpeechRate(Integer.parseInt(params.get(i+1)));
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){
-                                language = params.get(i+1);
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){
-                                country = params.get(i+1);
-                            } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){
-                                variant = params.get(i+1);
+                    String language = "";
+                    String country = "";
+                    String variant = "";
+                    String speechRate = "";
+                    if (speechItem.mParams != null){
+                        for (int i = 0; i < speechItem.mParams.size() - 1; i = i + 2){
+                            String param = speechItem.mParams.get(i);
+                            if (param != null) {
+                                if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_RATE)) {
+                                    speechRate = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_LANGUAGE)){
+                                    language = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_COUNTRY)){
+                                    country = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_VARIANT)){
+                                    variant = speechItem.mParams.get(i+1);
+                                } else if (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_UTTERANCE_ID)){
+                                    utteranceId = speechItem.mParams.get(i+1);
+                                }
                             }
                         }
-                        if (language.length() > 0){
-                            setLanguage(language, country, variant);
-                        }
                     }
-                    nativeSynth.synthesizeToFile(text, filename);
+                    // Only do the synthesis if it has not been killed by a subsequent utterance.
+                    if (mKillList.get(speechItem) == null){
+                        if (language.length() > 0){
+                            setLanguage("", language, country, variant);
+                        }
+                        if (speechRate.length() > 0){
+                            setSpeechRate("", Integer.parseInt(speechRate));
+                        }
+                        sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename);
+                    }
                 } catch (InterruptedException e) {
+                    Log.e("TtsService", "TTS synthToFileInternalOnly(): tryLock interrupted");
                     e.printStackTrace();
                 } finally {
                     // This check is needed because finally will always run;
                     // even if the
                     // method returns somewhere in the try block.
+                    if (utteranceId.length() > 0){
+                        dispatchUtteranceCompletedCallback(utteranceId, speechItem.mCallingApp);
+                    }
                     if (synthAvailable) {
                         synthesizerLock.unlock();
                     }
@@ -510,7 +679,7 @@
             }
         }
         Thread synth = (new Thread(new SynthThread()));
-        synth.setPriority(Thread.MIN_PRIORITY);
+        //synth.setPriority(Thread.MIN_PRIORITY);
         synth.start();
     }
 
@@ -532,26 +701,30 @@
         sendBroadcast(i);
     }
 
-    private void dispatchSpeechCompletedCallbacks(String mark) {
-        Log.i("TTS callback", "dispatch started");
+
+    private void dispatchUtteranceCompletedCallback(String utteranceId, String packageName) {
+        ITtsCallback cb = mCallbacksMap.get(packageName);
+        if (cb == null){
+            return;
+        }
+        Log.i("TtsService", "TTS callback: dispatch started");
         // Broadcast to all clients the new value.
         final int N = mCallbacks.beginBroadcast();
-        for (int i = 0; i < N; i++) {
-            try {
-                mCallbacks.getBroadcastItem(i).markReached(mark);
-            } catch (RemoteException e) {
-                // The RemoteCallbackList will take care of removing
-                // the dead object for us.
-            }
+        try {
+            cb.utteranceCompleted(utteranceId);
+        } catch (RemoteException e) {
+            // The RemoteCallbackList will take care of removing
+            // the dead object for us.
         }
         mCallbacks.finishBroadcast();
-        Log.i("TTS callback", "dispatch completed to " + N);
+        Log.i("TtsService", "TTS callback: dispatch completed to " + N);
     }
 
     private SpeechItem splitCurrentTextIfNeeded(SpeechItem currentSpeechItem){
         if (currentSpeechItem.mText.length() < MAX_SPEECH_ITEM_CHAR_LENGTH){
             return currentSpeechItem;
         } else {
+            String callingApp = currentSpeechItem.mCallingApp;
             ArrayList<SpeechItem> splitItems = new ArrayList<SpeechItem>();
             int start = 0;
             int end = start + MAX_SPEECH_ITEM_CHAR_LENGTH - 1;
@@ -559,13 +732,13 @@
             SpeechItem splitItem;
             while (end < currentSpeechItem.mText.length()){
                 splitText = currentSpeechItem.mText.substring(start, end);
-                splitItem = new SpeechItem(splitText, null, SpeechItem.TEXT);
+                splitItem = new SpeechItem(callingApp, splitText, null, SpeechItem.TEXT);
                 splitItems.add(splitItem);
                 start = end;
                 end = start + MAX_SPEECH_ITEM_CHAR_LENGTH - 1;
             }
             splitText = currentSpeechItem.mText.substring(start);
-            splitItem = new SpeechItem(splitText, null, SpeechItem.TEXT);
+            splitItem = new SpeechItem(callingApp, splitText, null, SpeechItem.TEXT);
             splitItems.add(splitItem);
             mSpeechQueue.remove(0);
             for (int i = splitItems.size() - 1; i >= 0; i--){
@@ -588,23 +761,21 @@
                 return;
             }
 
-            SpeechItem currentSpeechItem = mSpeechQueue.get(0);
+            mCurrentSpeechItem = mSpeechQueue.get(0);
             mIsSpeaking = true;
-            SoundResource sr = getSoundResource(currentSpeechItem);
+            SoundResource sr = getSoundResource(mCurrentSpeechItem);
             // Synth speech as needed - synthesizer should call
             // processSpeechQueue to continue running the queue
-            Log.i("TTS processing: ", currentSpeechItem.mText);
+            Log.i("TtsService", "TTS processing: " + mCurrentSpeechItem.mText);
             if (sr == null) {
-                if (currentSpeechItem.mType == SpeechItem.TEXT) {
-                    currentSpeechItem = splitCurrentTextIfNeeded(currentSpeechItem);
-                    speakInternalOnly(currentSpeechItem.mText,
-                            currentSpeechItem.mParams);
-                } else if (currentSpeechItem.mType == SpeechItem.TEXT_TO_FILE) {
-                    synthToFileInternalOnly(currentSpeechItem.mText,
-                            currentSpeechItem.mParams, currentSpeechItem.mFilename);
+                if (mCurrentSpeechItem.mType == SpeechItem.TEXT) {
+                    mCurrentSpeechItem = splitCurrentTextIfNeeded(mCurrentSpeechItem);
+                    speakInternalOnly(mCurrentSpeechItem);
+                } else if (mCurrentSpeechItem.mType == SpeechItem.TEXT_TO_FILE) {
+                    synthToFileInternalOnly(mCurrentSpeechItem);
                 } else {
                     // This is either silence or an earcon that was missing
-                    silence(currentSpeechItem.mDuration);
+                    silence(mCurrentSpeechItem);
                 }
             } else {
                 cleanUpPlayer();
@@ -615,8 +786,7 @@
                     // Utterance is part of the app calling the library
                     Context ctx;
                     try {
-                        ctx = this.createPackageContext(sr.mSourcePackageName,
-                                0);
+                        ctx = this.createPackageContext(sr.mSourcePackageName, 0);
                     } catch (NameNotFoundException e) {
                         e.printStackTrace();
                         mSpeechQueue.remove(0); // Remove it from the queue and
@@ -639,6 +809,7 @@
                 }
                 mPlayer.setOnCompletionListener(this);
                 try {
+                    mPlayer.setAudioStreamType(getStreamTypeFromParams(mCurrentSpeechItem.mParams));
                     mPlayer.start();
                 } catch (IllegalStateException e) {
                     mSpeechQueue.clear();
@@ -659,6 +830,24 @@
         }
     }
 
+    private int getStreamTypeFromParams(ArrayList<String> paramList) {
+        int streamType = DEFAULT_STREAM_TYPE;
+        if (paramList == null) {
+            return streamType;
+        }
+        for (int i = 0; i < paramList.size() - 1; i = i + 2) {
+            String param = paramList.get(i);
+            if ((param != null) && (param.equals(TextToSpeech.Engine.TTS_KEY_PARAM_STREAM))) {
+                try {
+                    streamType = Integer.parseInt(paramList.get(i + 1));
+                } catch (NumberFormatException e) {
+                    streamType = DEFAULT_STREAM_TYPE;
+                }
+            }
+        }
+        return streamType;
+    }
+
     private void cleanUpPlayer() {
         if (mPlayer != null) {
             mPlayer.release();
@@ -679,7 +868,7 @@
      *            something like "/sdcard/myappsounds/mysound.wav".
      * @return A boolean that indicates if the synthesis succeeded
      */
-    private boolean synthesizeToFile(String text, ArrayList<String> params,
+    private boolean synthesizeToFile(String callingApp, String text, ArrayList<String> params,
             String filename) {
         // Don't allow a filename that is too long
         if (filename.length() > MAX_FILENAME_LENGTH) {
@@ -690,7 +879,7 @@
         if (text.length() >= MAX_SPEECH_ITEM_CHAR_LENGTH){
             return false;
         }
-        mSpeechQueue.add(new SpeechItem(text, params, SpeechItem.TEXT_TO_FILE, filename));
+        mSpeechQueue.add(new SpeechItem(callingApp, text, params, SpeechItem.TEXT_TO_FILE, filename));
         if (!mIsSpeaking) {
             processSpeechQueue();
         }
@@ -711,14 +900,22 @@
 
     private final android.speech.tts.ITts.Stub mBinder = new Stub() {
 
-        public void registerCallback(ITtsCallback cb) {
-            if (cb != null)
+        public int registerCallback(String packageName, ITtsCallback cb) {
+            if (cb != null) {
                 mCallbacks.register(cb);
+                mCallbacksMap.put(packageName, cb);
+                return TextToSpeech.TTS_SUCCESS;
+            }
+            return TextToSpeech.TTS_ERROR;
         }
 
-        public void unregisterCallback(ITtsCallback cb) {
-            if (cb != null)
+        public int unregisterCallback(String packageName, ITtsCallback cb) {
+            if (cb != null) {
+                mCallbacksMap.remove(packageName);
                 mCallbacks.unregister(cb);
+                return TextToSpeech.TTS_SUCCESS;
+            }
+            return TextToSpeech.TTS_ERROR;
         }
 
         /**
@@ -728,18 +925,18 @@
          * @param text
          *            The text that should be spoken
          * @param queueMode
-         *            0 for no queue (interrupts all previous utterances), 1 for
-         *            queued
+         *            TextToSpeech.TTS_QUEUE_FLUSH for no queue (interrupts all previous utterances)
+         *            TextToSpeech.TTS_QUEUE_ADD for queued
          * @param params
          *            An ArrayList of parameters. The first element of this
          *            array controls the type of voice to use.
          */
-        public int speak(String text, int queueMode, String[] params) {
+        public int speak(String callingApp, String text, int queueMode, String[] params) {
             ArrayList<String> speakingParams = new ArrayList<String>();
             if (params != null) {
                 speakingParams = new ArrayList<String>(Arrays.asList(params));
             }
-            return mSelf.speak(text, queueMode, speakingParams);
+            return mSelf.speak(callingApp, text, queueMode, speakingParams);
         }
 
         /**
@@ -748,17 +945,17 @@
          * @param earcon
          *            The earcon that should be played
          * @param queueMode
-         *            0 for no queue (interrupts all previous utterances), 1 for
-         *            queued
+         *            TextToSpeech.TTS_QUEUE_FLUSH for no queue (interrupts all previous utterances)
+         *            TextToSpeech.TTS_QUEUE_ADD for queued
          * @param params
          *            An ArrayList of parameters.
          */
-        public int playEarcon(String earcon, int queueMode, String[] params) {
+        public int playEarcon(String callingApp, String earcon, int queueMode, String[] params) {
             ArrayList<String> speakingParams = new ArrayList<String>();
             if (params != null) {
                 speakingParams = new ArrayList<String>(Arrays.asList(params));
             }
-            return mSelf.playEarcon(earcon, queueMode, speakingParams);
+            return mSelf.playEarcon(callingApp, earcon, queueMode, speakingParams);
         }
 
         /**
@@ -767,25 +964,25 @@
          * @param duration
          *            The duration of the silence that should be played
          * @param queueMode
-         *            0 for no queue (interrupts all previous utterances), 1 for
-         *            queued
+         *            TextToSpeech.TTS_QUEUE_FLUSH for no queue (interrupts all previous utterances)
+         *            TextToSpeech.TTS_QUEUE_ADD for queued
          * @param params
          *            An ArrayList of parameters.
          */
-        public int playSilence(long duration, int queueMode, String[] params) {
+        public int playSilence(String callingApp, long duration, int queueMode, String[] params) {
             ArrayList<String> speakingParams = new ArrayList<String>();
             if (params != null) {
                 speakingParams = new ArrayList<String>(Arrays.asList(params));
             }
-            return mSelf.playSilence(duration, queueMode, speakingParams);
+            return mSelf.playSilence(callingApp, duration, queueMode, speakingParams);
         }
 
         /**
          * Stops all speech output and removes any utterances still in the
          * queue.
          */
-        public int stop() {
-            return mSelf.stop();
+        public int stop(String callingApp) {
+            return mSelf.stop(callingApp);
         }
 
         /**
@@ -807,8 +1004,8 @@
          * @param resId
          *            The resource ID of the sound within its package
          */
-        public void addSpeech(String text, String packageName, int resId) {
-            mSelf.addSpeech(text, packageName, resId);
+        public void addSpeech(String callingApp, String text, String packageName, int resId) {
+            mSelf.addSpeech(callingApp, text, packageName, resId);
         }
 
         /**
@@ -820,8 +1017,8 @@
          *            The filename of the sound resource. This must be a
          *            complete path like: (/sdcard/mysounds/mysoundbite.mp3).
          */
-        public void addSpeechFile(String text, String filename) {
-            mSelf.addSpeech(text, filename);
+        public void addSpeechFile(String callingApp, String text, String filename) {
+            mSelf.addSpeech(callingApp, text, filename);
         }
 
         /**
@@ -834,8 +1031,8 @@
          * @param resId
          *            The resource ID of the sound within its package
          */
-        public void addEarcon(String earcon, String packageName, int resId) {
-            mSelf.addEarcon(earcon, packageName, resId);
+        public void addEarcon(String callingApp, String earcon, String packageName, int resId) {
+            mSelf.addEarcon(callingApp, earcon, packageName, resId);
         }
 
         /**
@@ -847,8 +1044,8 @@
          *            The filename of the sound resource. This must be a
          *            complete path like: (/sdcard/mysounds/mysoundbite.mp3).
          */
-        public void addEarconFile(String earcon, String filename) {
-            mSelf.addEarcon(earcon, filename);
+        public void addEarconFile(String callingApp, String earcon, String filename) {
+            mSelf.addEarcon(callingApp, earcon, filename);
         }
 
         /**
@@ -858,8 +1055,8 @@
          * @param speechRate
          *            The speech rate that should be used
          */
-        public int setSpeechRate(int speechRate) {
-            return mSelf.setSpeechRate(speechRate);
+        public int setSpeechRate(String callingApp, int speechRate) {
+            return mSelf.setSpeechRate(callingApp, speechRate);
         }
 
         /**
@@ -869,8 +1066,8 @@
          * @param pitch
          *            The pitch that should be used for the synthesized voice
          */
-        public int setPitch(int pitch) {
-            return mSelf.setPitch(pitch);
+        public int setPitch(String callingApp, int pitch) {
+            return mSelf.setPitch(callingApp, pitch);
         }
 
         /**
@@ -904,8 +1101,8 @@
          * @param country  the three letter ISO country code.
          * @param variant  the variant code associated with the country and language pair.
          */
-        public int setLanguage(String lang, String country, String variant) {
-            return mSelf.setLanguage(lang, country, variant);
+        public int setLanguage(String callingApp, String lang, String country, String variant) {
+            return mSelf.setLanguage(callingApp, lang, country, variant);
         }
 
         /**
@@ -922,13 +1119,13 @@
          *            be something like "/sdcard/myappsounds/mysound.wav".
          * @return A boolean that indicates if the synthesis succeeded
          */
-        public boolean synthesizeToFile(String text, String[] params,
+        public boolean synthesizeToFile(String callingApp, String text, String[] params,
                 String filename) {
             ArrayList<String> speakingParams = new ArrayList<String>();
             if (params != null) {
                 speakingParams = new ArrayList<String>(Arrays.asList(params));
             }
-            return mSelf.synthesizeToFile(text, speakingParams, filename);
+            return mSelf.synthesizeToFile(callingApp, text, speakingParams, filename);
         }
 
     };
diff --git a/packages/VpnServices/res/values-cs/strings.xml b/packages/VpnServices/res/values-cs/strings.xml
new file mode 100644
index 0000000..5f3522d
--- /dev/null
+++ b/packages/VpnServices/res/values-cs/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Služby VPN"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-de/strings.xml b/packages/VpnServices/res/values-de/strings.xml
new file mode 100644
index 0000000..93fa474
--- /dev/null
+++ b/packages/VpnServices/res/values-de/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"VPN-Dienste"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-es/strings.xml b/packages/VpnServices/res/values-es/strings.xml
new file mode 100644
index 0000000..bb4f348
--- /dev/null
+++ b/packages/VpnServices/res/values-es/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Servicios VPN"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-fr/strings.xml b/packages/VpnServices/res/values-fr/strings.xml
new file mode 100644
index 0000000..4395d03
--- /dev/null
+++ b/packages/VpnServices/res/values-fr/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Services VPN"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-it/strings.xml b/packages/VpnServices/res/values-it/strings.xml
new file mode 100644
index 0000000..76e0214
--- /dev/null
+++ b/packages/VpnServices/res/values-it/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Servizi VPN"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-nl/strings.xml b/packages/VpnServices/res/values-nl/strings.xml
new file mode 100644
index 0000000..9a50f3b
--- /dev/null
+++ b/packages/VpnServices/res/values-nl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"VPN-services"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-pl/strings.xml b/packages/VpnServices/res/values-pl/strings.xml
new file mode 100644
index 0000000..d2e8c60
--- /dev/null
+++ b/packages/VpnServices/res/values-pl/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"Usługi VPN"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/res/values-zh-rTW/strings.xml b/packages/VpnServices/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..021077b
--- /dev/null
+++ b/packages/VpnServices/res/values-zh-rTW/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label">"VPN 服務"</string>
+    <!-- no translation found for vpn_notification_title_connected (2567196609405266775) -->
+    <skip />
+    <!-- no translation found for vpn_notification_title_disconnected (3564361788336568244) -->
+    <skip />
+    <!-- no translation found for vpn_notification_hint_disconnected (1952209867082269429) -->
+    <skip />
+</resources>
diff --git a/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java b/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java
index 7dd9d9e..e4c070f 100644
--- a/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java
+++ b/packages/VpnServices/src/com/android/server/vpn/AndroidServiceProxy.java
@@ -18,6 +18,7 @@
 
 import android.net.LocalSocket;
 import android.net.LocalSocketAddress;
+import android.net.vpn.VpnManager;
 import android.os.SystemProperties;
 import android.util.Log;
 
@@ -48,6 +49,9 @@
 
     private static final int END_OF_ARGUMENTS = 255;
 
+    private static final int STOP_SERVICE = -1;
+    private static final int AUTH_ERROR_CODE = 51;
+
     private String mServiceName;
     private String mSocketName;
     private LocalSocket mKeepaliveSocket;
@@ -72,14 +76,22 @@
 
     @Override
     public synchronized void stop() {
-        if (isRunning()) setResultAndCloseControlSocket(-1);
+        if (isRunning()) {
+            try {
+                setResultAndCloseControlSocket(STOP_SERVICE);
+            } catch (IOException e) {
+                // should not occur
+                throw new RuntimeException(e);
+            }
+        }
+        Log.d(mTag, "-----  Stop: " + mServiceName);
         SystemProperties.set(SVC_STOP_CMD, mServiceName);
     }
 
     /**
      * Sends a command with arguments to the service through the control socket.
      */
-    public void sendCommand(String ...args) throws IOException {
+    public synchronized void sendCommand(String ...args) throws IOException {
         OutputStream out = getControlSocketOutput();
         for (String arg : args) outputString(out, arg);
         out.write(END_OF_ARGUMENTS);
@@ -94,7 +106,14 @@
     @Override
     protected void performTask() throws IOException {
         String svc = mServiceName;
-        Log.d(mTag, "+++++  Execute: " + svc);
+        Log.d(mTag, "-----  Stop the daemon just in case: " + mServiceName);
+        SystemProperties.set(SVC_STOP_CMD, mServiceName);
+        if (!blockUntil(SVC_STATE_STOPPED, 5)) {
+            throw new IOException("cannot start service anew: " + svc
+                    + ", it is still running");
+        }
+
+        Log.d(mTag, "+++++  Start: " + svc);
         SystemProperties.set(SVC_START_CMD, svc);
 
         boolean success = blockUntil(SVC_STATE_RUNNING, WAITING_TIME);
@@ -114,30 +133,22 @@
                     InputStream in = s.getInputStream();
                     int data = in.read();
                     if (data >= 0) {
-                        Log.d(mTag, "got data from keepalive socket: " + data);
+                        Log.d(mTag, "got data from control socket: " + data);
 
-                        if (data == 0) {
-                            // re-establish the connection:
-                            // synchronized here so that checkSocketResult()
-                            // returns when new mKeepaliveSocket is available for
-                            // next cmd
-                            synchronized (this) {
-                                setResultAndCloseControlSocket((byte) data);
-                                s = mKeepaliveSocket = createServiceSocket();
-                            }
-                        } else {
-                            // keep the socket
-                            setSocketResult(data);
-                        }
+                        setSocketResult(data);
                     } else {
                         // service is gone
                         if (mControlSocketInUse) setSocketResult(-1);
                         break;
                     }
                 }
-                Log.d(mTag, "keepalive connection closed");
+                Log.d(mTag, "control connection closed");
             } catch (IOException e) {
-                Log.d(mTag, "keepalive socket broken: " + e.getMessage());
+                if (e instanceof VpnConnectingError) {
+                    throw e;
+                } else {
+                    Log.d(mTag, "control socket broken: " + e.getMessage());
+                }
             }
 
             // Wait 5 seconds for the service to exit
@@ -179,7 +190,7 @@
         }
     }
 
-    private synchronized void checkSocketResult() throws IOException {
+    private void checkSocketResult() throws IOException {
         try {
             // will be notified when the result comes back from service
             if (mSocketResult == null) wait();
@@ -194,14 +205,21 @@
         }
     }
 
-    private synchronized void setSocketResult(int result) {
+    private synchronized void setSocketResult(int result)
+            throws VpnConnectingError {
         if (mControlSocketInUse) {
             mSocketResult = result;
             notifyAll();
+        } else if (result > 0) {
+            // error from daemon
+            throw new VpnConnectingError((result == AUTH_ERROR_CODE)
+                    ? VpnManager.VPN_ERROR_AUTH
+                    : VpnManager.VPN_ERROR_CONNECTION_FAILED);
         }
     }
 
-    private void setResultAndCloseControlSocket(int result) {
+    private void setResultAndCloseControlSocket(int result)
+            throws VpnConnectingError {
         setSocketResult(result);
         try {
             mKeepaliveSocket.shutdownInput();
diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java
index 6abf81c..7b3ddf8 100644
--- a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java
+++ b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecPskService.java
@@ -30,12 +30,11 @@
     @Override
     protected void connect(String serverIp, String username, String password)
             throws IOException {
-        String hostIp = getHostIp();
         L2tpIpsecPskProfile p = getProfile();
 
         // IPSEC
         AndroidServiceProxy ipsecService = startService(IPSEC_DAEMON);
-        ipsecService.sendCommand(hostIp, serverIp, L2tpService.L2TP_PORT,
+        ipsecService.sendCommand(serverIp, L2tpService.L2TP_PORT,
                 p.getPresharedKey());
 
         sleep(2000); // 2 seconds
diff --git a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java
index 825953c..e2d4ff4 100644
--- a/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java
+++ b/packages/VpnServices/src/com/android/server/vpn/L2tpIpsecService.java
@@ -30,11 +30,9 @@
     @Override
     protected void connect(String serverIp, String username, String password)
             throws IOException {
-        String hostIp = getHostIp();
-
         // IPSEC
         AndroidServiceProxy ipsecService = startService(IPSEC_DAEMON);
-        ipsecService.sendCommand(hostIp, serverIp, L2tpService.L2TP_PORT,
+        ipsecService.sendCommand(serverIp, L2tpService.L2TP_PORT,
                 getUserkeyPath(), getUserCertPath(), getCaCertPath());
 
         sleep(2000); // 2 seconds
diff --git a/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java b/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java
index 16d253a..5fac799 100644
--- a/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java
+++ b/packages/VpnServices/src/com/android/server/vpn/MtpdHelper.java
@@ -48,7 +48,6 @@
                 "linkname", VPN_LINKNAME,
                 "name", username,
                 "password", password,
-                "ipparam", serverIp + "@" + vpnService.getGatewayIp(),
                 "refuse-eap", "nodefaultroute", "usepeerdns",
                 "idle", "1800",
                 "mtu", "1400",
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnConnectingError.java b/packages/VpnServices/src/com/android/server/vpn/VpnConnectingError.java
new file mode 100644
index 0000000..3c4ec7d
--- /dev/null
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnConnectingError.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.vpn;
+
+import java.io.IOException;
+
+/**
+ * Exception thrown when a connecting attempt fails.
+ */
+class VpnConnectingError extends IOException {
+    private int mErrorCode;
+
+    VpnConnectingError(int errorCode) {
+        super("Connecting error: " + errorCode);
+        mErrorCode = errorCode;
+    }
+
+    int getErrorCode() {
+        return mErrorCode;
+    }
+}
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnService.java b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
index a60788a..26322f4 100644
--- a/packages/VpnServices/src/com/android/server/vpn/VpnService.java
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
@@ -20,7 +20,6 @@
 import android.app.NotificationManager;
 import android.app.PendingIntent;
 import android.content.Context;
-import android.net.NetworkUtils;
 import android.net.vpn.VpnManager;
 import android.net.vpn.VpnProfile;
 import android.net.vpn.VpnState;
@@ -30,10 +29,8 @@
 
 import java.io.IOException;
 import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.Socket;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
 
 /**
@@ -46,9 +43,9 @@
     private static final String DNS2 = "net.dns2";
     private static final String VPN_DNS1 = "vpn.dns1";
     private static final String VPN_DNS2 = "vpn.dns2";
-    private static final String VPN_UP = "vpn.up";
-    private static final String VPN_IS_UP = "1";
-    private static final String VPN_IS_DOWN = "0";
+    private static final String VPN_STATUS = "vpn.status";
+    private static final String VPN_IS_UP = "ok";
+    private static final String VPN_IS_DOWN = "down";
 
     private static final String REMOTE_IP = "net.ipremote";
     private static final String DNS_DOMAIN_SUFFICES = "net.dns.search";
@@ -60,6 +57,7 @@
 
     private VpnState mState = VpnState.IDLE;
     private boolean mInError;
+    private VpnConnectingError mError;
 
     // connection settings
     private String mOriginalDns1;
@@ -67,7 +65,6 @@
     private String mVpnDns1 = "";
     private String mVpnDns2 = "";
     private String mOriginalDomainSuffices;
-    private String mHostIp;
 
     private long mStartTime; // VPN connection start time
 
@@ -106,14 +103,6 @@
     }
 
     /**
-     * Returns the host IP for establishing the VPN connection.
-     */
-    protected String getHostIp() throws IOException {
-        if (mHostIp == null) mHostIp = reallyGetHostIp();
-        return mHostIp;
-    }
-
-    /**
      * Returns the IP address of the specified host name.
      */
     protected String getIp(String hostName) throws IOException {
@@ -121,21 +110,6 @@
     }
 
     /**
-     * Returns the IP address of the default gateway.
-     */
-    protected String getGatewayIp() throws IOException {
-        Enumeration<NetworkInterface> ifces =
-                NetworkInterface.getNetworkInterfaces();
-        for (; ifces.hasMoreElements(); ) {
-            NetworkInterface ni = ifces.nextElement();
-            int gateway = NetworkUtils.getDefaultRoute(ni.getName());
-            if (gateway == 0) continue;
-            return toInetAddress(gateway).getHostAddress();
-        }
-        throw new IOException("Default gateway is not available");
-    }
-
-    /**
      * Sets the system property. The method is blocked until the value is
      * settled in.
      * @param name the name of the property
@@ -166,16 +140,23 @@
         return mState;
     }
 
-    synchronized void onConnect(String username, String password)
-            throws IOException {
-        mState = VpnState.CONNECTING;
-        broadcastConnectivity(VpnState.CONNECTING);
+    synchronized boolean onConnect(String username, String password) {
+        try {
+            mState = VpnState.CONNECTING;
+            broadcastConnectivity(VpnState.CONNECTING);
 
-        String serverIp = getIp(getProfile().getServerName());
+            String serverIp = getIp(getProfile().getServerName());
 
-        onBeforeConnect();
-        connect(serverIp, username, password);
-        waitUntilConnectedOrTimedout();
+            onBeforeConnect();
+            connect(serverIp, username, password);
+            waitUntilConnectedOrTimedout();
+            return true;
+        } catch (Throwable e) {
+            Log.e(TAG, "onConnect()", e);
+            mError = newConnectingError(e);
+            onError();
+            return false;
+        }
     }
 
     synchronized void onDisconnect(boolean cleanUpServices) {
@@ -189,7 +170,7 @@
 
             mServiceHelper.stop();
         } catch (Throwable e) {
-            Log.e(TAG, "onError()", e);
+            Log.e(TAG, "onDisconnect()", e);
             onFinalCleanUp();
         }
     }
@@ -214,26 +195,33 @@
 
         SystemProperties.set(VPN_DNS1, "-");
         SystemProperties.set(VPN_DNS2, "-");
-        SystemProperties.set(VPN_UP, VPN_IS_DOWN);
-        Log.d(TAG, "       VPN UP: " + SystemProperties.get(VPN_UP));
+        SystemProperties.set(VPN_STATUS, VPN_IS_DOWN);
+        Log.d(TAG, "       VPN UP: " + SystemProperties.get(VPN_STATUS));
     }
 
     private void waitUntilConnectedOrTimedout() {
-        sleep(2000); // 2 seconds
-        for (int i = 0; i < 60; i++) {
-            if (VPN_IS_UP.equals(SystemProperties.get(VPN_UP))) {
-                onConnected();
-                return;
-            }
-            sleep(500); // 0.5 second
-        }
+        // Run this in the background thread to not block UI
+        new Thread(new Runnable() {
+            public void run() {
+                sleep(2000); // 2 seconds
+                for (int i = 0; i < 60; i++) {
+                    if (VPN_IS_UP.equals(SystemProperties.get(VPN_STATUS))) {
+                        onConnected();
+                        return;
+                    } else if (mState != VpnState.CONNECTING) {
+                        break;
+                    }
+                    sleep(500); // 0.5 second
+                }
 
-        synchronized (this) {
-            if (mState == VpnState.CONNECTING) {
-                Log.d(TAG, "       connecting timed out !!");
-                onError();
+                synchronized (VpnService.this) {
+                    if (mState == VpnState.CONNECTING) {
+                        Log.d(TAG, "       connecting timed out !!");
+                        onError();
+                    }
+                }
             }
-        }
+        }).start();
     }
 
     private synchronized void onConnected() {
@@ -264,6 +252,13 @@
         mContext.stopSelf();
     }
 
+    private VpnConnectingError newConnectingError(Throwable e) {
+        return new VpnConnectingError(
+                (e instanceof UnknownHostException)
+                ? VpnManager.VPN_ERROR_UNKNOWN_SERVER
+                : VpnManager.VPN_ERROR_CONNECTION_FAILED);
+    }
+
     private synchronized void onOneServiceGone() {
         switch (mState) {
         case IDLE:
@@ -304,12 +299,12 @@
 
     private void saveVpnDnsProperties() {
         mOriginalDns1 = mOriginalDns2 = "";
-        for (int i = 0; i < 10; i++) {
+        for (int i = 0; i < 5; i++) {
             mVpnDns1 = SystemProperties.get(VPN_DNS1);
             mVpnDns2 = SystemProperties.get(VPN_DNS2);
             if (mOriginalDns1.equals(mVpnDns1)) {
                 Log.d(TAG, "wait for vpn dns to settle in..." + i);
-                sleep(500);
+                sleep(200);
             } else {
                 mOriginalDns1 = SystemProperties.get(DNS1);
                 mOriginalDns2 = SystemProperties.get(DNS2);
@@ -322,7 +317,9 @@
                 return;
             }
         }
-        Log.e(TAG, "saveVpnDnsProperties(): DNS not updated??");
+        Log.d(TAG, "saveVpnDnsProperties(): DNS not updated??");
+        mOriginalDns1 = mVpnDns1 = SystemProperties.get(DNS1);
+        mOriginalDns2 = mVpnDns2 = SystemProperties.get(DNS2);
     }
 
     private void saveAndSetDomainSuffices() {
@@ -340,7 +337,13 @@
     }
 
     private void broadcastConnectivity(VpnState s) {
-        new VpnManager(mContext).broadcastConnectivity(mProfile.getName(), s);
+        VpnManager m = new VpnManager(mContext);
+        if ((s == VpnState.IDLE) && (mError != null)) {
+            m.broadcastConnectivity(mProfile.getName(), s,
+                    mError.getErrorCode());
+        } else {
+            m.broadcastConnectivity(mProfile.getName(), s);
+        }
     }
 
     private void startConnectivityMonitor() {
@@ -373,26 +376,11 @@
     private void checkDnsProperties() {
         String dns1 = SystemProperties.get(DNS1);
         if (!mVpnDns1.equals(dns1)) {
-            Log.w(TAG, "   @@ !!!    dns being overridden");
+            Log.w(TAG, "   dns being overridden by: " + dns1);
             onError();
         }
     }
 
-    private String reallyGetHostIp() throws IOException {
-        Enumeration<NetworkInterface> ifces =
-                NetworkInterface.getNetworkInterfaces();
-        for (; ifces.hasMoreElements(); ) {
-            NetworkInterface ni = ifces.nextElement();
-            int gateway = NetworkUtils.getDefaultRoute(ni.getName());
-            if (gateway == 0) continue;
-            Enumeration<InetAddress> addrs = ni.getInetAddresses();
-            for (; addrs.hasMoreElements(); ) {
-                return addrs.nextElement().getHostAddress();
-            }
-        }
-        throw new IOException("Host IP is not available");
-    }
-
     protected void sleep(int ms) {
         try {
             Thread.currentThread().sleep(ms);
@@ -440,6 +428,9 @@
         //@Override
         public void error(ProcessProxy p, Throwable e) {
             Log.e(TAG, "service error: " + p.getName(), e);
+            if (e instanceof VpnConnectingError) {
+                mError = (VpnConnectingError) e;
+            }
             commonCallback((AndroidServiceProxy) p);
         }
 
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
index 617875e..32b8e51 100644
--- a/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnServiceBinder.java
@@ -27,7 +27,6 @@
 import android.net.vpn.VpnProfile;
 import android.net.vpn.VpnState;
 import android.os.IBinder;
-import android.util.Log;
 
 import java.io.IOException;
 
@@ -55,6 +54,12 @@
         }
     };
 
+    public void onStart (Intent intent, int startId) {
+        super.onStart(intent, startId);
+        setForeground(true);
+        android.util.Log.d("VpnServiceBinder", "becomes a foreground service");
+    }
+
     public IBinder onBind(Intent intent) {
         return mBinder;
     }
@@ -62,21 +67,13 @@
     private synchronized boolean connect(
             VpnProfile p, String username, String password) {
         if (mService != null) return false;
-        try {
-            mService = createService(p);
-            mService.onConnect(username, password);
-            return true;
-        } catch (Throwable e) {
-            Log.e(TAG, "connect()", e);
-            if (mService != null) mService.onError();
-            return false;
-        }
+        mService = createService(p);
+        return mService.onConnect(username, password);
     }
 
     private synchronized void checkStatus(VpnProfile p) {
-        if (mService == null) broadcastConnectivity(p.getName(), VpnState.IDLE);
-
-        if (!p.getName().equals(mService.mProfile.getName())) {
+        if ((mService == null)
+                || (!p.getName().equals(mService.mProfile.getName()))) {
             broadcastConnectivity(p.getName(), VpnState.IDLE);
         } else {
             broadcastConnectivity(p.getName(), mService.getState());
diff --git a/services/java/com/android/server/AppWidgetService.java b/services/java/com/android/server/AppWidgetService.java
index 131e156..78db6f9 100644
--- a/services/java/com/android/server/AppWidgetService.java
+++ b/services/java/com/android/server/AppWidgetService.java
@@ -68,6 +68,7 @@
 
     private static final String SETTINGS_FILENAME = "appwidgets.xml";
     private static final String SETTINGS_TMP_FILENAME = SETTINGS_FILENAME + ".tmp";
+    private static final int MIN_UPDATE_PERIOD = 30 * 60 * 1000; // 30 minutes
 
     /*
      * When identifying a Host or Provider based on the calling process, use the uid field.
@@ -629,9 +630,12 @@
                 Binder.restoreCallingIdentity(token);
             }
             if (!alreadyRegistered) {
+                long period = p.info.updatePeriodMillis;
+                if (period < MIN_UPDATE_PERIOD) {
+                    period = MIN_UPDATE_PERIOD;
+                }
                 mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
-                        SystemClock.elapsedRealtime() + p.info.updatePeriodMillis,
-                        p.info.updatePeriodMillis, p.broadcast);
+                        SystemClock.elapsedRealtime() + period, period, p.broadcast);
             }
         }
     }
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 3b82284..6e28515 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -810,17 +810,25 @@
 
                 // Now propagate the newly-backed-up data to the transport
                 if (success) {
-                    if (DEBUG) Log.v(TAG, "doBackup() success; calling transport");
-                    backupData =
-                        ParcelFileDescriptor.open(backupDataName, ParcelFileDescriptor.MODE_READ_ONLY);
-                    if (!transport.performBackup(packInfo, backupData)) {
-                        // STOPSHIP TODO: handle errors
-                        Log.e(TAG, "Backup failure in performBackup()");
+                    if (DEBUG) Log.v(TAG, "doBackup() success");
+                    if (backupDataName.length() > 0) {
+                        backupData =
+                            ParcelFileDescriptor.open(backupDataName,
+                                    ParcelFileDescriptor.MODE_READ_ONLY);
+                        if (!transport.performBackup(packInfo, backupData)) {
+                            // STOPSHIP TODO: handle errors
+                            Log.e(TAG, "Backup failure in performBackup()");
+                        }
+                    } else {
+                        if (DEBUG) {
+                            Log.i(TAG, "no backup data written; not calling transport");
+                        }
                     }
 
-                    // !!! TODO: After successful transport, delete the now-stale data
-                    // and juggle the files so that next time the new state is passed
-                    //backupDataName.delete();
+                    // After successful transport, delete the now-stale data
+                    // and juggle the files so that next time we supply the agent
+                    // with the new state file it just created.
+                    backupDataName.delete();
                     newStateName.renameTo(savedStateName);
                 }
             } catch (Exception e) {
diff --git a/services/java/com/android/server/MountListener.java b/services/java/com/android/server/MountListener.java
index 2e430c8..3e53585 100644
--- a/services/java/com/android/server/MountListener.java
+++ b/services/java/com/android/server/MountListener.java
@@ -202,6 +202,7 @@
             byte[] buffer = new byte[100];
 
             writeCommand(VOLD_CMD_SEND_UMS_STATUS);
+            mountMedia(Environment.getExternalStorageDirectory().getAbsolutePath());
             
             while (true) {
                 int count = inputStream.read(buffer);
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 854138c..38fb7c9 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -49,6 +49,7 @@
 import android.os.Message;
 import android.os.Power;
 import android.os.RemoteException;
+import android.os.SystemProperties;
 import android.os.Vibrator;
 import android.provider.Settings;
 import android.text.TextUtils;
@@ -88,7 +89,8 @@
 
     private NotificationRecord mSoundNotification;
     private AsyncPlayer mSound;
-    private int mDisabledNotifications;
+    private boolean mSystemReady;
+    private int mDisabledNotifications = StatusBarManager.DISABLE_NOTIFICATION_ALERTS;
 
     private NotificationRecord mVibrateNotification;
     private Vibrator mVibrator = new Vibrator();
@@ -377,6 +379,11 @@
         mSettingsObserver.observe();
     }
 
+    void systemReady() {
+        // no beeping until we're basically done booting
+        mSystemReady = true;
+    }
+
     // Toasts
     // ============================================================================
     public void enqueueToast(String pkg, ITransientNotification callback, int duration)
@@ -637,7 +644,7 @@
                     }
                 }
 
-                sendAccessibilityEventTypeNotificationChangedDoCheck(notification, pkg);
+                sendAccessibilityEvent(notification, pkg);
 
             } else {
                 if (old != null && old.statusBarKey != null) {
@@ -654,7 +661,8 @@
             // If we're not supposed to beep, vibrate, etc. then don't.
             if (((mDisabledNotifications & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) == 0)
                     && (!(old != null
-                        && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0 ))) {
+                        && (notification.flags & Notification.FLAG_ONLY_ALERT_ONCE) != 0 ))
+                    && mSystemReady) {
                 // sound
                 final boolean useDefaultSound =
                     (notification.defaults & Notification.DEFAULT_SOUND) != 0; 
@@ -721,8 +729,7 @@
         idOut[0] = id;
     }
 
-    private void sendAccessibilityEventTypeNotificationChangedDoCheck(Notification notification,
-            CharSequence packageName) {
+    private void sendAccessibilityEvent(Notification notification, CharSequence packageName) {
         AccessibilityManager manager = AccessibilityManager.getInstance(mContext);
         if (!manager.isEnabled()) {
             return;
@@ -939,6 +946,9 @@
     // to accidentally lose.
     private void updateAdbNotification() {
         if (mAdbEnabled && mBatteryPlugged == BatteryManager.BATTERY_PLUGGED_USB) {
+            if ("0".equals(SystemProperties.get("persist.adb.notify"))) {
+                return;
+            }
             if (!mAdbNotificationShown) {
                 NotificationManager notificationManager = (NotificationManager) mContext
                         .getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 06435c8..143c7d5 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -56,12 +56,11 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.pm.Signature;
-import android.content.res.CompatibilityInfo;
-import android.content.res.Configuration;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Debug;
 import android.os.HandlerThread;
 import android.os.Parcel;
 import android.os.RemoteException;
@@ -251,6 +250,9 @@
     final HashMap<String, PackageParser.PermissionGroup> mPermissionGroups =
             new HashMap<String, PackageParser.PermissionGroup>();
 
+    // Broadcast actions that are only available to the system.
+    final HashSet<String> mProtectedBroadcasts = new HashSet<String>();
+    
     boolean mSystemReady;
     boolean mSafeMode;
     boolean mHasSystemUidErrors;
@@ -260,7 +262,6 @@
     final ResolveInfo mResolveInfo = new ResolveInfo();
     ComponentName mResolveComponentName;
     PackageParser.Package mPlatformPackage;
-    private boolean mCompatibilityModeEnabled = true;
 
     public static final IPackageManager main(Context context, boolean factoryTest) {
         PackageManagerService m = new PackageManagerService(context, factoryTest);
@@ -763,7 +764,7 @@
         synchronized (mPackages) {
             PackageParser.Package p = mPackages.get(packageName);
             if (Config.LOGV) Log.v(
-                TAG, "getApplicationInfo " + packageName
+                TAG, "getPackageInfo " + packageName
                 + ": " + p);
             if (p != null) {
                 return generatePackageInfo(p, flags);
@@ -794,7 +795,7 @@
         synchronized (mPackages) {
             PackageParser.Package p = mPackages.get(packageName);
             if (Config.LOGV) Log.v(
-                TAG, "getApplicationInfo " + packageName
+                TAG, "getPackageGids" + packageName
                 + ": " + p);
             if (p != null) {
                 final PackageSetting ps = (PackageSetting)p.mExtras;
@@ -892,11 +893,7 @@
                     + ": " + p);
             if (p != null) {
                 // Note: isEnabledLP() does not apply here - always return info
-                ApplicationInfo appInfo = PackageParser.generateApplicationInfo(p, flags);
-                if (!mCompatibilityModeEnabled) {
-                    appInfo.disableCompatibilityMode();
-                }
-                return appInfo;
+                return PackageParser.generateApplicationInfo(p, flags);
             }
             if ("android".equals(packageName)||"system".equals(packageName)) {
                 return mAndroidApplication;
@@ -1128,6 +1125,12 @@
         }
     }
 
+    public boolean isProtectedBroadcast(String actionName) {
+        synchronized (mPackages) {
+            return mProtectedBroadcasts.contains(actionName);
+        }
+    }
+    
     public int checkSignatures(String pkg1, String pkg2) {
         synchronized (mPackages) {
             PackageParser.Package p1 = mPackages.get(pkg1);
@@ -2039,8 +2042,9 @@
                             + suid.userId + "): packages=" + suid.packages);
                 }
             }
-    
-            // Just create the setting, don't add it yet
+
+            // Just create the setting, don't add it yet. For already existing packages
+            // the PkgSetting exists already and doesn't have to be created.
             pkgSetting = mSettings.getPackageLP(pkg, suid, destCodeFile,
                             destResourceFile, pkg.applicationInfo.flags, true, false);
             if (pkgSetting == null) {
@@ -2265,7 +2269,7 @@
             // Add the new setting to mSettings
             mSettings.insertPackageSettingLP(pkgSetting, pkg.packageName, suid);
             // Add the new setting to mPackages
-            mPackages.put(pkg.applicationInfo.packageName, pkg);          
+            mPackages.put(pkg.applicationInfo.packageName, pkg);
             int N = pkg.providers.size();
             StringBuilder r = null;
             int i;
@@ -2500,6 +2504,13 @@
                 if (Config.LOGD) Log.d(TAG, "  Instrumentation: " + r);
             }
     
+            if (pkg.protectedBroadcasts != null) {
+                N = pkg.protectedBroadcasts.size();
+                for (i=0; i<N; i++) {
+                    mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
+                }
+            }
+            
             pkgSetting.setTimeStamp(scanFileTime);
         }
         
@@ -4801,11 +4812,12 @@
         mSystemReady = true;
 
         // Read the compatibilty setting when the system is ready.
-        mCompatibilityModeEnabled = android.provider.Settings.System.getInt(
+        boolean compatibilityModeEnabled = android.provider.Settings.System.getInt(
                 mContext.getContentResolver(),
                 android.provider.Settings.System.COMPATIBILITY_MODE, 1) == 1;
+        PackageParser.setCompatibilityModeEnabled(compatibilityModeEnabled);
         if (DEBUG_SETTINGS) {
-            Log.d(TAG, "compatibility mode:" + mCompatibilityModeEnabled);
+            Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
         }
     }
 
@@ -4889,6 +4901,22 @@
                     pw.print("    resourcePath="); pw.println(ps.resourcePathString);
                     if (ps.pkg != null) {
                         pw.print("    dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
+                        pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
+                        pw.print("    densities="); pw.println(ps.pkg.supportsDensityList);
+                        ArrayList<String> screens = new ArrayList<String>();
+                        if ((ps.pkg.applicationInfo.flags & 
+                                ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
+                            screens.add("medium");
+                        }
+                        if ((ps.pkg.applicationInfo.flags & 
+                                ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
+                            screens.add("large");
+                        }
+                        if ((ps.pkg.applicationInfo.flags & 
+                                ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
+                            screens.add("small,");
+                        }
+                        pw.print("    supportsScreens="); pw.println(screens);
                     }
                     pw.print("    timeStamp="); pw.println(ps.getTimeStampStr());
                     pw.print("    signatures="); pw.println(ps.signatures);
@@ -5408,10 +5436,10 @@
      */
     static class PackageSettingBase extends GrantedPermissions {
         final String name;
-        final File codePath;
-        final String codePathString;
-        final File resourcePath;
-        final String resourcePathString;
+        File codePath;
+        String codePathString;
+        File resourcePath;
+        String resourcePathString;
         private long timeStamp;
         private String timeStampString = "0";
         final int versionCode;
@@ -5809,11 +5837,16 @@
                         // and data partition. Just let the most recent version
                         // take precedence.
                         return p;
-                    } else if ((p.pkg != null) && (p.pkg.applicationInfo != null)) {
+                    } else {
                         // Let the app continue with previous uid if code path changes.
                         reportSettingsProblem(Log.WARN,
                                 "Package " + name + " codePath changed from " + p.codePath
-                                + " to " + codePath + "; Retaining data and using new code");
+                                + " to " + codePath + "; Retaining data and using new code from " +
+                                codePath);
+                        p.codePath = codePath;
+                        p.resourcePath = resourcePath;
+                        p.codePathString = codePath.toString();
+                        p.resourcePathString = resourcePath.toString();
                     }
                 } else if (p.sharedUser != sharedUser) {
                     reportSettingsProblem(Log.WARN,
@@ -5837,6 +5870,7 @@
                 if (sharedUser != null) {
                     p.userId = sharedUser.userId;
                 } else if (MULTIPLE_APPLICATION_UIDS) {
+                    // Assign new user id
                     p.userId = newUserIdLP(p);
                 } else {
                     p.userId = FIRST_APPLICATION_UID;
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 3e4d5f9..aa1a5cf 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -52,6 +52,7 @@
 class ServerThread extends Thread {
     private static final String TAG = "SystemServer";
     private final static boolean INCLUDE_DEMO = false;
+    private final static boolean INCLUDE_BACKUP = false;
 
     private static final int LOG_BOOT_PROGRESS_SYSTEM_RUN = 3010;
 
@@ -190,6 +191,7 @@
         StatusBarService statusBar = null;
         InputMethodManagerService imm = null;
         AppWidgetService appWidget = null;
+        NotificationManagerService notification = null;
 
         if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
             try {
@@ -240,8 +242,8 @@
 
             try {
                 Log.i(TAG, "Starting Notification Manager.");
-                ServiceManager.addService(Context.NOTIFICATION_SERVICE,
-                        new NotificationManagerService(context, statusBar, hardware));
+                notification = new NotificationManagerService(context, statusBar, hardware);
+                ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification);
             } catch (Throwable e) {
                 Log.e(TAG, "Failure starting Notification Manager", e);
             }
@@ -317,8 +319,10 @@
             }
 
             try {
-                Log.i(TAG, "Starting Backup Service");
-                ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
+                if (INCLUDE_BACKUP) {
+                    Log.i(TAG, "Starting Backup Service");
+                    ServiceManager.addService(Context.BACKUP_SERVICE, new BackupManagerService(context));
+                }
             } catch (Throwable e) {
                 Log.e(TAG, "Failure starting Backup Service", e);
             }
@@ -348,6 +352,11 @@
 
         // It is now time to start up the app processes...
         boolean safeMode = wm.detectSafeMode();
+
+        if (notification != null) {
+            notification.systemReady();
+        }
+
         if (statusBar != null) {
             statusBar.systemReady();
         }
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index a940af3..b4754b6 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -192,6 +192,7 @@
     WifiService(Context context, WifiStateTracker tracker) {
         mContext = context;
         mWifiStateTracker = tracker;
+        mWifiStateTracker.enableRssiPolling(true);
         mBatteryStats = BatteryStatsService.getService();
         
         /*
@@ -436,7 +437,7 @@
      * see {@link android.net.wifi.WifiManager#startScan()}
      * @return {@code true} if the operation succeeds
      */
-    public boolean startScan() {
+    public boolean startScan(boolean forceActive) {
         enforceChangePermission();
         synchronized (mWifiStateTracker) {
             switch (mWifiStateTracker.getSupplicantState()) {
@@ -450,7 +451,7 @@
                             WifiStateTracker.SUPPL_SCAN_HANDLING_LIST_ONLY);
                     break;
             }
-            return WifiNative.scanCommand();
+            return WifiNative.scanCommand(forceActive);
         }
     }
 
@@ -1560,9 +1561,11 @@
                 mAlarmManager.cancel(mIdleIntent);
                 mDeviceIdle = false;
                 mScreenOff = false;
+                mWifiStateTracker.enableRssiPolling(true);
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                 Log.d(TAG, "ACTION_SCREEN_OFF");
                 mScreenOff = true;
+                mWifiStateTracker.enableRssiPolling(false);
                 /*
                  * Set a timer to put Wi-Fi to sleep, but only if the screen is off
                  * AND the "stay on while plugged in" setting doesn't match the
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 2dd70ef..2937ed0 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -24,8 +24,10 @@
 import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
 import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
+import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
 import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
 import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR;
 import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
@@ -53,6 +55,7 @@
 import android.content.Context;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
+import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.graphics.Matrix;
 import android.graphics.PixelFormat;
@@ -100,6 +103,7 @@
 import android.view.WindowManagerImpl;
 import android.view.WindowManagerPolicy;
 import android.view.WindowManager.LayoutParams;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Transformation;
@@ -171,6 +175,11 @@
      */
     static final int DEFAULT_DIM_DURATION = 200;
 
+    /** Amount of time (in milliseconds) to animate the fade-in-out transition for
+     * compatible windows.
+     */
+    static final int DEFAULT_FADE_IN_OUT_DURATION = 400;
+
     /** Adjustment to time to perform a dim, to make it more dramatic.
      */
     static final int DIM_DURATION_MULTIPLIER = 6;
@@ -324,12 +333,7 @@
     IInputMethodManager mInputMethodManager;
 
     SurfaceSession mFxSession;
-    Surface mDimSurface;
-    boolean mDimShown;
-    float mDimCurrentAlpha;
-    float mDimTargetAlpha;
-    float mDimDeltaPerMs;
-    long mLastDimAnimTime;
+    private DimAnimator mDimAnimator = null;
     Surface mBlurSurface;
     boolean mBlurShown;
 
@@ -417,7 +421,13 @@
 
     final Configuration mTempConfiguration = new Configuration();
     int screenLayout = Configuration.SCREENLAYOUT_UNDEFINED;
-    
+
+    // The frame use to limit the size of the app running in compatibility mode.
+    Rect mCompatibleScreenFrame = new Rect();
+    // The surface used to fill the outer rim of the app running in compatibility mode.
+    Surface mBackgroundFillerSurface = null;
+    boolean mBackgroundFillerShown = false;
+
     public static WindowManagerService main(Context context,
             PowerManagerService pm, boolean haveInputMethods) {
         WMThread thr = new WMThread(context, pm, haveInputMethods);
@@ -1847,44 +1857,51 @@
         // artifacts when we unfreeze the display if some different animation
         // is running.
         if (!mDisplayFrozen) {
-            int animAttr = 0;
-            switch (transit) {
-                case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
-                    break;
-                case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
-                    break;
-                case WindowManagerPolicy.TRANSIT_TASK_OPEN:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
-                    break;
-                case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
-                    break;
-                case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
-                    break;
-                case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
-                    animAttr = enter
-                            ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
-                            : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
-                    break;
+            Animation a;
+            if (lp != null && (lp.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+                a = new FadeInOutAnimation(enter);
+                if (DEBUG_ANIM) Log.v(TAG,
+                        "applying FadeInOutAnimation for a window in compatibility mode");
+            } else {
+                int animAttr = 0;
+                switch (transit) {
+                    case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_activityOpenEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_activityOpenExitAnimation;
+                        break;
+                    case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_activityCloseEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_activityCloseExitAnimation;
+                        break;
+                    case WindowManagerPolicy.TRANSIT_TASK_OPEN:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_taskOpenEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_taskOpenExitAnimation;
+                        break;
+                    case WindowManagerPolicy.TRANSIT_TASK_CLOSE:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_taskCloseEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_taskCloseExitAnimation;
+                        break;
+                    case WindowManagerPolicy.TRANSIT_TASK_TO_FRONT:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_taskToFrontEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_taskToFrontExitAnimation;
+                        break;
+                    case WindowManagerPolicy.TRANSIT_TASK_TO_BACK:
+                        animAttr = enter
+                                ? com.android.internal.R.styleable.WindowAnimation_taskToBackEnterAnimation
+                                : com.android.internal.R.styleable.WindowAnimation_taskToBackExitAnimation;
+                        break;
+                }
+                a = loadAnimation(lp, animAttr);
+                if (DEBUG_ANIM) Log.v(TAG, "applyAnimation: wtoken=" + wtoken
+                        + " anim=" + a
+                        + " animAttr=0x" + Integer.toHexString(animAttr)
+                        + " transit=" + transit);
             }
-            Animation a = loadAnimation(lp, animAttr);
-            if (DEBUG_ANIM) Log.v(TAG, "applyAnimation: wtoken=" + wtoken
-                    + " anim=" + a
-                    + " animAttr=0x" + Integer.toHexString(animAttr)
-                    + " transit=" + transit);
             if (a != null) {
                 if (DEBUG_ANIM) {
                     RuntimeException e = new RuntimeException();
@@ -3738,12 +3755,14 @@
         }
         config.orientation = orientation;
         
+        DisplayMetrics dm = new DisplayMetrics();
+        mDisplay.getMetrics(dm);
+        CompatibilityInfo.updateCompatibleScreenFrame(dm, orientation, mCompatibleScreenFrame);
+
         if (screenLayout == Configuration.SCREENLAYOUT_UNDEFINED) {
             // Note we only do this once because at this point we don't
             // expect the screen to change in this way at runtime, and want
             // to avoid all of this computation for every config change.
-            DisplayMetrics dm = new DisplayMetrics();
-            mDisplay.getMetrics(dm);
             int longSize = dw;
             int shortSize = dh;
             if (longSize < shortSize) {
@@ -3753,7 +3772,7 @@
             }
             longSize = (int)(longSize/dm.density);
             shortSize = (int)(shortSize/dm.density);
-            
+
             // These semi-magic numbers define our compatibility modes for
             // applications with different screens.  Don't change unless you
             // make sure to test lots and lots of apps!
@@ -5845,8 +5864,21 @@
         public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) {
             mHaveFrame = true;
 
-            final int pw = pf.right-pf.left;
-            final int ph = pf.bottom-pf.top;
+            final Rect container = mContainingFrame;
+            container.set(pf);
+
+            final Rect display = mDisplayFrame;
+            display.set(df);
+
+            if ((mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+                container.intersect(mCompatibleScreenFrame);
+                if ((mAttrs.flags & FLAG_LAYOUT_NO_LIMITS) == 0) {
+                    display.intersect(mCompatibleScreenFrame);
+                }
+            }
+
+            final int pw = container.right - container.left;
+            final int ph = container.bottom - container.top;
 
             int w,h;
             if ((mAttrs.flags & mAttrs.FLAG_SCALED) != 0) {
@@ -5857,12 +5889,6 @@
                 h = mAttrs.height== mAttrs.FILL_PARENT ? ph : mRequestedHeight;
             }
 
-            final Rect container = mContainingFrame;
-            container.set(pf);
-
-            final Rect display = mDisplayFrame;
-            display.set(df);
-
             final Rect content = mContentFrame;
             content.set(cf);
 
@@ -5882,7 +5908,7 @@
 
             // Now make sure the window fits in the overall display.
             Gravity.applyDisplay(mAttrs.gravity, df, frame);
-
+            
             // Make sure the content and visible frames are inside of the
             // final window frame.
             if (content.left < frame.left) content.left = frame.left;
@@ -6565,24 +6591,45 @@
                 return false;
             }
             final Rect frame = shownFrame ? mShownFrame : mFrame;
-            if (frame.left <= 0 && frame.top <= 0
-                    && frame.right >= screenWidth
-                    && frame.bottom >= screenHeight) {
-                return true;
+
+            if ((mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+                return frame.left <= mCompatibleScreenFrame.left &&
+                        frame.top <= mCompatibleScreenFrame.top &&
+                        frame.right >= mCompatibleScreenFrame.right &&
+                        frame.bottom >= mCompatibleScreenFrame.bottom;
+            } else {
+                return frame.left <= 0 && frame.top <= 0
+                        && frame.right >= screenWidth
+                        && frame.bottom >= screenHeight;
             }
-            return false;
         }
 
-        boolean isFullscreenOpaque(int screenWidth, int screenHeight) {
-            if (mAttrs.format != PixelFormat.OPAQUE || mSurface == null
-                    || mAnimation != null || mDrawPending || mCommitDrawPending) {
-                return false;
-            }
-            if (mFrame.left <= 0 && mFrame.top <= 0 &&
-                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight) {
-                return true;
-            }
-            return false;
+        /**
+         * Return true if the window is opaque and fully drawn.
+         */
+        boolean isOpaqueDrawn() {
+            return mAttrs.format == PixelFormat.OPAQUE && mSurface != null
+                    && mAnimation == null && !mDrawPending && !mCommitDrawPending;
+        }
+
+        boolean needsBackgroundFiller(int screenWidth, int screenHeight) {
+            return
+                 // only if the application is requesting compatible window
+                 (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0 &&
+                 // only if it's visible
+                 mHasDrawn && mViewVisibility == View.VISIBLE &&
+                 // and only if the application fills the compatible screen
+                 mFrame.left <= mCompatibleScreenFrame.left &&
+                 mFrame.top <= mCompatibleScreenFrame.top &&
+                 mFrame.right >= mCompatibleScreenFrame.right &&
+                 mFrame.bottom >= mCompatibleScreenFrame.bottom &&
+                 // and starting window do not need background filler
+                 mAttrs.type != mAttrs.TYPE_APPLICATION_STARTING;
+        }
+
+        boolean isFullscreen(int screenWidth, int screenHeight) {
+            return mFrame.left <= 0 && mFrame.top <= 0 &&
+                mFrame.right >= screenWidth && mFrame.bottom >= screenHeight;
         }
 
         void removeLocked() {
@@ -7190,17 +7237,27 @@
 
     public static WindowManager.LayoutParams findAnimations(
             ArrayList<AppWindowToken> order,
-            ArrayList<AppWindowToken> tokenList1,
-            ArrayList<AppWindowToken> tokenList2) {
+            ArrayList<AppWindowToken> openingTokenList1,
+            ArrayList<AppWindowToken> closingTokenList2) {
         // We need to figure out which animation to use...
+
+        // First, check if there is a compatible window in opening/closing
+        // apps, and use it if exists.
         WindowManager.LayoutParams animParams = null;
         int animSrc = 0;
-
+        animParams = findCompatibleWindowParams(openingTokenList1);
+        if (animParams == null) {
+            animParams = findCompatibleWindowParams(closingTokenList2);
+        }
+        if (animParams != null) {
+            return animParams;
+        }
+        
         //Log.i(TAG, "Looking for animations...");
         for (int i=order.size()-1; i>=0; i--) {
             AppWindowToken wtoken = order.get(i);
             //Log.i(TAG, "Token " + wtoken + " with " + wtoken.windows.size() + " windows");
-            if (tokenList1.contains(wtoken) || tokenList2.contains(wtoken)) {
+            if (openingTokenList1.contains(wtoken) || closingTokenList2.contains(wtoken)) {
                 int j = wtoken.windows.size();
                 while (j > 0) {
                     j--;
@@ -7228,6 +7285,21 @@
         return animParams;
     }
 
+    private static LayoutParams findCompatibleWindowParams(ArrayList<AppWindowToken> tokenList) {
+        for (int appCount = tokenList.size() - 1; appCount >= 0; appCount--) {
+            AppWindowToken wtoken = tokenList.get(appCount);
+            // Just checking one window is sufficient as all windows have the compatible flag 
+            // if the application is in compatibility mode.
+            if (wtoken.windows.size() > 0) {
+                WindowManager.LayoutParams params = wtoken.windows.get(0).mAttrs;
+                if ((params.flags & FLAG_COMPATIBLE_WINDOW) != 0) {
+                    return params;
+                }
+            }
+        }
+        return null;
+    }
+
     // -------------------------------------------------------------
     // DummyAnimation
     // -------------------------------------------------------------
@@ -8102,6 +8174,7 @@
             boolean dimming = false;
             boolean covered = false;
             boolean syswin = false;
+            boolean backgroundFillerShown = false;
 
             for (i=N-1; i>=0; i--) {
                 WindowState w = (WindowState)mWindows.get(i);
@@ -8371,11 +8444,39 @@
                             syswin = true;
                         }
                     }
-                    if (w.isFullscreenOpaque(dw, dh)) {
+
+                    boolean opaqueDrawn = w.isOpaqueDrawn();
+                    if (opaqueDrawn && w.isFullscreen(dw, dh)) {
                         // This window completely covers everything behind it,
                         // so we want to leave all of them as unblurred (for
                         // performance reasons).
                         obscured = true;
+                    } else if (opaqueDrawn && w.needsBackgroundFiller(dw, dh)) {
+                        if (SHOW_TRANSACTIONS) Log.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,
+                                        0, dw, dh,
+                                        PixelFormat.OPAQUE,
+                                        Surface.FX_SURFACE_NORMAL);
+                            } catch (Exception e) {
+                                Log.e(TAG, "Exception creating filler surface", e);
+                            }
+                        }
+                        try {
+                            mBackgroundFillerSurface.setPosition(0, 0);
+                            mBackgroundFillerSurface.setSize(dw, dh);
+                            // Using the same layer as Dim because they will never be shown at the
+                            // same time.
+                            mBackgroundFillerSurface.setLayer(w.mAnimLayer - 1);
+                            mBackgroundFillerSurface.show();
+                        } catch (RuntimeException e) {
+                            Log.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
@@ -8386,56 +8487,12 @@
                             if (!dimming) {
                                 //Log.i(TAG, "DIM BEHIND: " + w);
                                 dimming = true;
-                                mDimShown = true;
-                                if (mDimSurface == null) {
-                                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
-                                            + mDimSurface + ": CREATE");
-                                    try {
-                                        mDimSurface = new Surface(mFxSession, 0,
-                                                -1, 16, 16,
-                                                PixelFormat.OPAQUE,
-                                                Surface.FX_SURFACE_DIM);
-                                    } catch (Exception e) {
-                                        Log.e(TAG, "Exception creating Dim surface", e);
-                                    }
+                                if (mDimAnimator == null) {
+                                    mDimAnimator = new DimAnimator(mFxSession);
                                 }
-                                if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
-                                        + mDimSurface + ": SHOW pos=(0,0) (" +
-                                        dw + "x" + dh + "), layer=" + (w.mAnimLayer-1));
-                                if (mDimSurface != null) {
-                                    try {
-                                        mDimSurface.setPosition(0, 0);
-                                        mDimSurface.setSize(dw, dh);
-                                        mDimSurface.show();
-                                    } catch (RuntimeException e) {
-                                        Log.w(TAG, "Failure showing dim surface", e);
-                                    }
-                                }
+                                mDimAnimator.show(dw, dh);
                             }
-                            mDimSurface.setLayer(w.mAnimLayer-1);
-                            final float target = w.mExiting ? 0 : attrs.dimAmount;
-                            if (mDimTargetAlpha != target) {
-                                // If the desired dim level has changed, then
-                                // start an animation to it.
-                                mLastDimAnimTime = currentTime;
-                                long duration = (w.mAnimating && w.mAnimation != null)
-                                        ? w.mAnimation.computeDurationHint()
-                                        : DEFAULT_DIM_DURATION;
-                                if (target > mDimTargetAlpha) {
-                                    // This is happening behind the activity UI,
-                                    // so we can make it run a little longer to
-                                    // give a stronger impression without disrupting
-                                    // the user.
-                                    duration *= DIM_DURATION_MULTIPLIER;
-                                }
-                                if (duration < 1) {
-                                    // Don't divide by zero
-                                    duration = 1;
-                                }
-                                mDimTargetAlpha = target;
-                                mDimDeltaPerMs = (mDimTargetAlpha-mDimCurrentAlpha)
-                                        / duration;
-                            }
+                            mDimAnimator.updateParameters(w, currentTime);
                         }
                         if ((attrFlags&FLAG_BLUR_BEHIND) != 0) {
                             if (!blurring) {
@@ -8472,59 +8529,19 @@
                     }
                 }
             }
-
-            if (!dimming && mDimShown) {
-                // Time to hide the dim surface...  start fading.
-                if (mDimTargetAlpha != 0) {
-                    mLastDimAnimTime = currentTime;
-                    mDimTargetAlpha = 0;
-                    mDimDeltaPerMs = (-mDimCurrentAlpha) / DEFAULT_DIM_DURATION;
+            
+            if (backgroundFillerShown == false && mBackgroundFillerShown) {
+                mBackgroundFillerShown = false;
+                if (SHOW_TRANSACTIONS) Log.d(TAG, "hiding background filler");
+                try {
+                    mBackgroundFillerSurface.hide();
+                } catch (RuntimeException e) {
+                    Log.e(TAG, "Exception hiding filler surface", e);
                 }
             }
 
-            if (mDimShown && mLastDimAnimTime != 0) {
-                mDimCurrentAlpha += mDimDeltaPerMs
-                        * (currentTime-mLastDimAnimTime);
-                boolean more = true;
-                if (mDisplayFrozen) {
-                    // If the display is frozen, there is no reason to animate.
-                    more = false;
-                } else if (mDimDeltaPerMs > 0) {
-                    if (mDimCurrentAlpha > mDimTargetAlpha) {
-                        more = false;
-                    }
-                } else if (mDimDeltaPerMs < 0) {
-                    if (mDimCurrentAlpha < mDimTargetAlpha) {
-                        more = false;
-                    }
-                } else {
-                    more = false;
-                }
-
-                // Do we need to continue animating?
-                if (more) {
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
-                            + mDimSurface + ": alpha=" + mDimCurrentAlpha);
-                    mLastDimAnimTime = currentTime;
-                    mDimSurface.setAlpha(mDimCurrentAlpha);
-                    animating = true;
-                } else {
-                    mDimCurrentAlpha = mDimTargetAlpha;
-                    mLastDimAnimTime = 0;
-                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
-                            + mDimSurface + ": final alpha=" + mDimCurrentAlpha);
-                    mDimSurface.setAlpha(mDimCurrentAlpha);
-                    if (!dimming) {
-                        if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface
-                                + ": HIDE");
-                        try {
-                            mDimSurface.hide();
-                        } catch (RuntimeException e) {
-                            Log.w(TAG, "Illegal argument exception hiding dim surface");
-                        }
-                        mDimShown = false;
-                    }
-                }
+            if (mDimAnimator != null && mDimAnimator.mDimShown) {
+                animating |= mDimAnimator.updateSurface(dimming, currentTime, mDisplayFrozen);
             }
 
             if (!blurring && mBlurShown) {
@@ -9067,11 +9084,11 @@
                     pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
             pw.print("  mLayoutNeeded="); pw.print(mLayoutNeeded);
                     pw.print(" mBlurShown="); pw.println(mBlurShown);
-            pw.print("  mDimShown="); pw.print(mDimShown);
-                    pw.print(" current="); pw.print(mDimCurrentAlpha);
-                    pw.print(" target="); pw.print(mDimTargetAlpha);
-                    pw.print(" delta="); pw.print(mDimDeltaPerMs);
-                    pw.print(" lastAnimTime="); pw.println(mLastDimAnimTime);
+            if (mDimAnimator != null) {
+                mDimAnimator.printTo(pw);
+            } else {
+                pw.print( "  no DimAnimator ");
+            }
             pw.print("  mInputMethodAnimLayerAdjustment=");
                     pw.println(mInputMethodAnimLayerAdjustment);
             pw.print("  mDisplayFrozen="); pw.print(mDisplayFrozen);
@@ -9112,4 +9129,188 @@
         synchronized (mKeyguardDisabled) { }
         synchronized (mKeyWaiter) { }
     }
+
+    /**
+     * DimAnimator class that controls the dim animation. This holds the surface and
+     * all state used for dim animation. 
+     */
+    private static class DimAnimator {
+        Surface mDimSurface;
+        boolean mDimShown = false;
+        float mDimCurrentAlpha;
+        float mDimTargetAlpha;
+        float mDimDeltaPerMs;
+        long mLastDimAnimTime;
+
+        DimAnimator (SurfaceSession session) {
+            if (mDimSurface == null) {
+                if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                        + mDimSurface + ": CREATE");
+                try {
+                    mDimSurface = new Surface(session, 0, -1, 16, 16, PixelFormat.OPAQUE,
+                            Surface.FX_SURFACE_DIM);
+                } catch (Exception e) {
+                    Log.e(TAG, "Exception creating Dim surface", e);
+                }
+            }
+        }
+
+        /**
+         * Show the dim surface.
+         */
+        void show(int dw, int dh) {
+            if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface + ": SHOW pos=(0,0) (" +
+                    dw + "x" + dh + ")");
+            mDimShown = true;
+            try {
+                mDimSurface.setPosition(0, 0);
+                mDimSurface.setSize(dw, dh);
+                mDimSurface.show();
+            } catch (RuntimeException e) {
+                Log.w(TAG, "Failure showing dim surface", e);
+            }
+        }
+
+        /**
+         * Set's the dim surface's layer and update dim parameters that will be used in
+         * {@link updateSurface} after all windows are examined.
+         */
+        void updateParameters(WindowState w, long currentTime) {
+            mDimSurface.setLayer(w.mAnimLayer-1);
+
+            final float target = w.mExiting ? 0 : w.mAttrs.dimAmount;
+            if (SHOW_TRANSACTIONS) Log.i(TAG, "layer=" + (w.mAnimLayer-1) + ", target=" + target);
+            if (mDimTargetAlpha != target) {
+                // If the desired dim level has changed, then
+                // start an animation to it.
+                mLastDimAnimTime = currentTime;
+                long duration = (w.mAnimating && w.mAnimation != null)
+                        ? w.mAnimation.computeDurationHint()
+                        : DEFAULT_DIM_DURATION;
+                if (target > mDimTargetAlpha) {
+                    // This is happening behind the activity UI,
+                    // so we can make it run a little longer to
+                    // give a stronger impression without disrupting
+                    // the user.
+                    duration *= DIM_DURATION_MULTIPLIER;
+                }
+                if (duration < 1) {
+                    // Don't divide by zero
+                    duration = 1;
+                }
+                mDimTargetAlpha = target;
+                mDimDeltaPerMs = (mDimTargetAlpha-mDimCurrentAlpha) / duration;
+            }
+        }
+            
+        /**
+         * Updating the surface's alpha. Returns true if the animation continues, or returns
+         * false when the animation is finished and the dim surface is hidden.
+         */
+        boolean updateSurface(boolean dimming, long currentTime, boolean displayFrozen) {
+            if (!dimming) {
+                if (mDimTargetAlpha != 0) {
+                    mLastDimAnimTime = currentTime;
+                    mDimTargetAlpha = 0;
+                    mDimDeltaPerMs = (-mDimCurrentAlpha) / DEFAULT_DIM_DURATION;
+                }
+            }
+            
+            boolean animating = false;
+            if (mLastDimAnimTime != 0) {
+                mDimCurrentAlpha += mDimDeltaPerMs
+                        * (currentTime-mLastDimAnimTime);
+                boolean more = true;
+                if (displayFrozen) {
+                    // If the display is frozen, there is no reason to animate.
+                    more = false;
+                } else if (mDimDeltaPerMs > 0) {
+                    if (mDimCurrentAlpha > mDimTargetAlpha) {
+                        more = false;
+                    }
+                } else if (mDimDeltaPerMs < 0) {
+                    if (mDimCurrentAlpha < mDimTargetAlpha) {
+                        more = false;
+                    }
+                } else {
+                    more = false;
+                }
+
+                // Do we need to continue animating?
+                if (more) {
+                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                            + mDimSurface + ": alpha=" + mDimCurrentAlpha);
+                    mLastDimAnimTime = currentTime;
+                    mDimSurface.setAlpha(mDimCurrentAlpha);
+                    animating = true;
+                } else {
+                    mDimCurrentAlpha = mDimTargetAlpha;
+                    mLastDimAnimTime = 0;
+                    if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM "
+                            + mDimSurface + ": final alpha=" + mDimCurrentAlpha);
+                    mDimSurface.setAlpha(mDimCurrentAlpha);
+                    if (!dimming) {
+                        if (SHOW_TRANSACTIONS) Log.i(TAG, "  DIM " + mDimSurface
+                                + ": HIDE");
+                        try {
+                            mDimSurface.hide();
+                        } catch (RuntimeException e) {
+                            Log.w(TAG, "Illegal argument exception hiding dim surface");
+                        }
+                        mDimShown = false;
+                    }
+                }
+            }
+            return animating;
+        }
+
+        public void printTo(PrintWriter pw) {
+            pw.print("  mDimShown="); pw.print(mDimShown);
+            pw.print(" current="); pw.print(mDimCurrentAlpha);
+            pw.print(" target="); pw.print(mDimTargetAlpha);
+            pw.print(" delta="); pw.print(mDimDeltaPerMs);
+            pw.print(" lastAnimTime="); pw.println(mLastDimAnimTime);
+        }
+    }
+
+    /**
+     * Animation that fade in after 0.5 interpolate time, or fade out in reverse order.
+     * This is used for opening/closing transition for apps in compatible mode.
+     */
+    private static class FadeInOutAnimation extends Animation {
+        int mWidth;
+        boolean mFadeIn;
+
+        public FadeInOutAnimation(boolean fadeIn) {
+            setInterpolator(new AccelerateInterpolator());
+            setDuration(DEFAULT_FADE_IN_OUT_DURATION);
+            mFadeIn = fadeIn;
+        }
+
+        @Override
+        protected void applyTransformation(float interpolatedTime, Transformation t) {
+            float x = interpolatedTime;
+            if (!mFadeIn) {
+                x = 1.0f - x; // reverse the interpolation for fade out
+            }
+            if (x < 0.5) {
+                // move the window out of the screen.
+                t.getMatrix().setTranslate(mWidth, 0);
+            } else {
+                t.getMatrix().setTranslate(0, 0);// show
+                t.setAlpha((x - 0.5f) * 2);
+            }
+        }
+
+        @Override
+        public void initialize(int width, int height, int parentWidth, int parentHeight) {
+            // width is the screen width {@see AppWindowToken#stepAnimatinoLocked}
+            mWidth = width;
+        }
+
+        @Override
+        public int getZAdjustment() {
+            return Animation.ZORDER_TOP;
+        }
+    }
 }
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 2fe4dd4..d9c40ec 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -32,6 +32,7 @@
 import android.app.AlertDialog;
 import android.app.ApplicationErrorReport;
 import android.app.Dialog;
+import android.app.IActivityController;
 import android.app.IActivityWatcher;
 import android.app.IApplicationThread;
 import android.app.IInstrumentationWatcher;
@@ -56,6 +57,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.InstrumentationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PathPermission;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
@@ -75,6 +77,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.PowerManager;
 import android.os.Process;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
@@ -824,8 +827,11 @@
     String mOrigDebugApp = null;
     boolean mOrigWaitForDebugger = false;
     boolean mAlwaysFinishActivities = false;
-    IActivityWatcher mWatcher = null;
+    IActivityController mController = null;
 
+    final RemoteCallbackList<IActivityWatcher> mWatchers
+            = new RemoteCallbackList<IActivityWatcher>();
+    
     /**
      * Callback of last caller to {@link #requestPss}.
      */
@@ -1622,7 +1628,7 @@
 
     /**
      * This is a simplified version of topRunningActivityLocked that provides a number of
-     * optional skip-over modes.  It is intended for use with the ActivityWatcher hook only.
+     * optional skip-over modes.  It is intended for use with the ActivityController hook only.
      * 
      * @param token If non-null, any history records matching this token will be skipped.
      * @param taskId If non-zero, we'll attempt to skip over records with the same task ID.
@@ -1727,10 +1733,9 @@
             }
             ensurePackageDexOpt(r.intent.getComponent().getPackageName());
             app.thread.scheduleLaunchActivity(new Intent(r.intent), r,
+                    System.identityHashCode(r),
                     r.info, r.icicle, results, newIntents, !andResume,
                     isNextTransitionForward());
-            // Update usage stats for launched activity
-            updateUsageStats(r, true);
         } catch (RemoteException e) {
             if (r.launchFailed) {
                 // This is the second time we failed -- finish activity
@@ -2183,6 +2188,8 @@
             mHandler.sendMessage(msg);
         }
 
+        reportResumedActivity(next);
+        
         next.thumbnail = null;
         setFocusedActivityLocked(next);
         next.resumeKeyDispatchingLocked();
@@ -2453,6 +2460,26 @@
         }
     }
     
+    private void reportResumedActivity(HistoryRecord r) {
+        //Log.i(TAG, "**** REPORT RESUME: " + r);
+        
+        final int identHash = System.identityHashCode(r);
+        updateUsageStats(r, true);
+        
+        int i = mWatchers.beginBroadcast();
+        while (i > 0) {
+            i--;
+            IActivityWatcher w = mWatchers.getBroadcastItem(i);
+            if (w != null) {
+                try {
+                    w.activityResuming(identHash);
+                } catch (RemoteException e) {
+                }
+            }
+        }
+        mWatchers.finishBroadcast();
+    }
+    
     /**
      * Ensure that the top activity in the stack is resumed.
      *
@@ -2641,10 +2668,10 @@
                 EventLog.writeEvent(LOG_AM_RESUME_ACTIVITY,
                         System.identityHashCode(next),
                         next.task.taskId, next.shortComponentName);
-                updateUsageStats(next, true);
                 
                 next.app.thread.scheduleResumeActivity(next,
                         isNextTransitionForward());
+                
                 pauseIfSleepingLocked();
 
             } catch (Exception e) {
@@ -3061,16 +3088,16 @@
             throw new SecurityException(msg);
         }
 
-        if (mWatcher != null) {
+        if (mController != null) {
             boolean abort = false;
             try {
                 // The Intent we give to the watcher has the extra data
                 // stripped off, since it can contain private information.
                 Intent watchIntent = intent.cloneFilter();
-                abort = !mWatcher.activityStarting(watchIntent,
+                abort = !mController.activityStarting(watchIntent,
                         aInfo.applicationInfo.packageName);
             } catch (RemoteException e) {
-                mWatcher = null;
+                mController = null;
             }
 
             if (abort) {
@@ -3495,8 +3522,6 @@
         intent = new Intent(intent);
 
         // Collect information about the target of the Intent.
-        // Must do this before locking, because resolving the intent
-        // may require launching a process to run its content provider.
         ActivityInfo aInfo;
         try {
             ResolveInfo rInfo =
@@ -3630,17 +3655,24 @@
         }
     }
 
-    final int startActivityInPackage(int uid,
+    public final int startActivityInPackage(int uid,
             Intent intent, String resolvedType, IBinder resultTo,
             String resultWho, int requestCode, boolean onlyIfNeeded) {
+        
+        // This is so super not safe, that only the system (or okay root)
+        // can do it.
+        final int callingUid = Binder.getCallingUid();
+        if (callingUid != 0 && callingUid != Process.myUid()) {
+            throw new SecurityException(
+                    "startActivityInPackage only available to the system");
+        }
+        
         final boolean componentSpecified = intent.getComponent() != null;
         
         // Don't modify the client's object!
         intent = new Intent(intent);
 
         // Collect information about the target of the Intent.
-        // Must do this before locking, because resolving the intent
-        // may require launching a process to run its content provider.
         ActivityInfo aInfo;
         try {
             ResolveInfo rInfo =
@@ -3967,16 +3999,16 @@
         }
 
         synchronized(this) {
-            if (mWatcher != null) {
+            if (mController != null) {
                 // Find the first activity that is not finishing.
                 HistoryRecord next = topRunningActivityLocked(token, 0);
                 if (next != null) {
                     // ask watcher if this is allowed
                     boolean resumeOK = true;
                     try {
-                        resumeOK = mWatcher.activityResuming(next.packageName);
+                        resumeOK = mController.activityResuming(next.packageName);
                     } catch (RemoteException e) {
-                        mWatcher = null;
+                        mController = null;
                     }
     
                     if (!resumeOK) {
@@ -4468,9 +4500,9 @@
             }
         }
 
-        if (mWatcher != null) {
+        if (mController != null) {
             try {
-                int res = mWatcher.appNotResponding(app.processName,
+                int res = mController.appNotResponding(app.processName,
                         app.pid, info.toString());
                 if (res != 0) {
                     if (res < 0) {
@@ -4486,7 +4518,7 @@
                     }
                 }
             } catch (RemoteException e) {
-                mWatcher = null;
+                mController = null;
             }
         }
 
@@ -6611,7 +6643,7 @@
     }
     
     /**
-     * TODO: Add mWatcher hook
+     * TODO: Add mController hook
      */
     public void moveTaskToFront(int task) {
         enforceCallingPermission(android.Manifest.permission.REORDER_TASKS,
@@ -6756,7 +6788,7 @@
         // 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
         // current task to be selected.
-        if (mWatcher != null) {
+        if (mController != null) {
             HistoryRecord next = topRunningActivityLocked(null, task);
             if (next == null) {
                 next = topRunningActivityLocked(null, 0);
@@ -6765,9 +6797,9 @@
                 // ask watcher if this is allowed
                 boolean moveOK = true;
                 try {
-                    moveOK = mWatcher.activityResuming(next.packageName);
+                    moveOK = mController.activityResuming(next.packageName);
                 } catch (RemoteException e) {
-                    mWatcher = null;
+                    mController = null;
                 }
                 if (!moveOK) {
                     return false;
@@ -7072,6 +7104,27 @@
                 == PackageManager.PERMISSION_GRANTED) {
             return null;
         }
+        
+        PathPermission[] pps = cpi.pathPermissions;
+        if (pps != null) {
+            int i = pps.length;
+            while (i > 0) {
+                i--;
+                PathPermission pp = pps[i];
+                if (checkComponentPermission(pp.getReadPermission(), callingPid, callingUid,
+                        cpi.exported ? -1 : cpi.applicationInfo.uid)
+                        == PackageManager.PERMISSION_GRANTED
+                        && mode == ParcelFileDescriptor.MODE_READ_ONLY || mode == -1) {
+                    return null;
+                }
+                if (checkComponentPermission(pp.getWritePermission(), callingPid, callingUid,
+                        cpi.exported ? -1 : cpi.applicationInfo.uid)
+                        == PackageManager.PERMISSION_GRANTED) {
+                    return null;
+                }
+            }
+        }
+        
         String msg = "Permission Denial: opening provider " + cpi.name
                 + " from " + (r != null ? r : "(null)") + " (pid=" + callingPid
                 + ", uid=" + callingUid + ") requires "
@@ -7657,14 +7710,22 @@
         }
     }
 
-    public void setActivityWatcher(IActivityWatcher watcher) {
+    public void setActivityController(IActivityController controller) {
         enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
-                "setActivityWatcher()");
+                "setActivityController()");
         synchronized (this) {
-            mWatcher = watcher;
+            mController = controller;
         }
     }
 
+    public void registerActivityWatcher(IActivityWatcher watcher) {
+        mWatchers.register(watcher);
+    }
+
+    public void unregisterActivityWatcher(IActivityWatcher watcher) {
+        mWatchers.unregister(watcher);
+    }
+
     public final void enterSafeMode() {
         synchronized(this) {
             // It only makes sense to do this before the system is ready
@@ -8225,11 +8286,11 @@
                 //Process.sendSignal(MY_PID, Process.SIGNAL_QUIT);
             }
 
-            if (mWatcher != null) {
+            if (mController != null) {
                 try {
                     String name = r != null ? r.processName : null;
                     int pid = r != null ? r.pid : Binder.getCallingPid();
-                    if (!mWatcher.appCrashed(name, pid,
+                    if (!mController.appCrashed(name, pid,
                             shortMsg, longMsg, crashData)) {
                         Log.w(TAG, "Force-killing crashed app " + name
                                 + " at watcher's request");
@@ -8237,7 +8298,7 @@
                         return 0;
                     }
                 } catch (RemoteException e) {
-                    mWatcher = null;
+                    mController = null;
                 }
             }
 
@@ -8663,7 +8724,7 @@
                     + " mDebugTransient=" + mDebugTransient
                     + " mOrigWaitForDebugger=" + mOrigWaitForDebugger);
             pw.println("  mAlwaysFinishActivities=" + mAlwaysFinishActivities
-                    + " mWatcher=" + mWatcher);
+                    + " mController=" + mController);
         }
     }
 
@@ -10810,6 +10871,29 @@
             mHandler.sendEmptyMessage(UPDATE_TIME_ZONE);
         }
 
+        /*
+         * Prevent non-system code (defined here to be non-persistent
+         * processes) from sending protected broadcasts.
+         */
+        if (callingUid == Process.SYSTEM_UID || callingUid == Process.PHONE_UID
+                || callingUid == Process.SHELL_UID || callingUid == 0) {
+            // Always okay.
+        } else if (callerApp == null || !callerApp.persistent) {
+            try {
+                if (ActivityThread.getPackageManager().isProtectedBroadcast(
+                        intent.getAction())) {
+                    String msg = "Permission Denial: not allowed to send broadcast "
+                            + intent.getAction() + " from pid="
+                            + callingPid + ", uid=" + callingUid;
+                    Log.w(TAG, msg);
+                    throw new SecurityException(msg);
+                }
+            } catch (RemoteException e) {
+                Log.w(TAG, "Remote exception", e);
+                return BROADCAST_SUCCESS;
+            }
+        }
+        
         // Add to the sticky list if requested.
         if (sticky) {
             if (checkPermission(android.Manifest.permission.BROADCAST_STICKY,
@@ -11755,10 +11839,12 @@
             config.reqTouchScreen = mConfiguration.touchscreen;
             config.reqKeyboardType = mConfiguration.keyboard;
             config.reqNavigation = mConfiguration.navigation;
-            if (mConfiguration.navigation != Configuration.NAVIGATION_NONAV) {
+            if (mConfiguration.navigation == Configuration.NAVIGATION_DPAD
+                    || mConfiguration.navigation == Configuration.NAVIGATION_TRACKBALL) {
                 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
             }
-            if (mConfiguration.keyboard != Configuration.KEYBOARD_UNDEFINED) {
+            if (mConfiguration.keyboard != Configuration.KEYBOARD_UNDEFINED
+                    && mConfiguration.keyboard != Configuration.KEYBOARD_NOKEYS) {
                 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
             }
         }
diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java
index 39a1ee0..c834b34 100644
--- a/services/java/com/android/server/am/BatteryStatsService.java
+++ b/services/java/com/android/server/am/BatteryStatsService.java
@@ -41,7 +41,7 @@
     
     final BatteryStatsImpl mStats;
     Context mContext;
-    
+
     BatteryStatsService(String filename) {
         mStats = new BatteryStatsImpl(filename);
     }
diff --git a/services/java/com/android/server/am/UsageStatsService.java b/services/java/com/android/server/am/UsageStatsService.java
index 2d58659..d458911 100755
--- a/services/java/com/android/server/am/UsageStatsService.java
+++ b/services/java/com/android/server/am/UsageStatsService.java
@@ -39,6 +39,7 @@
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -617,7 +618,7 @@
     }
     
     private void collectDumpInfoFLOCK(PrintWriter pw, boolean isCompactOutput,
-            boolean deleteAfterPrint) {
+            boolean deleteAfterPrint, HashSet<String> packages) {
         List<String> fileList = getUsageStatsFileListFLOCK();
         if (fileList == null) {
             return;
@@ -633,7 +634,8 @@
             String dateStr = file.substring(FILE_PREFIX.length());
             try {
                 Parcel in = getParcelForFile(dFile);
-                collectDumpInfoFromParcelFLOCK(in, pw, dateStr, isCompactOutput);
+                collectDumpInfoFromParcelFLOCK(in, pw, dateStr, isCompactOutput,
+                        packages);
                 if (deleteAfterPrint) {
                     // Delete old file after collecting info only for checkin requests
                     dFile.delete();
@@ -648,7 +650,7 @@
     }
     
     private void collectDumpInfoFromParcelFLOCK(Parcel in, PrintWriter pw,
-            String date, boolean isCompactOutput) {
+            String date, boolean isCompactOutput, HashSet<String> packages) {
         StringBuilder sb = new StringBuilder(512);
         if (isCompactOutput) {
             sb.append("D:");
@@ -678,7 +680,10 @@
             }
             sb.setLength(0);
             PkgUsageStatsExtended pus = new PkgUsageStatsExtended(in);
-            if (isCompactOutput) {
+            if (packages != null && !packages.contains(pkgName)) {
+                // This package has not been requested -- don't print
+                // anything for it.
+            } else if (isCompactOutput) {
                 sb.append("P:");
                 sb.append(pkgName);
                 sb.append(',');
@@ -765,6 +770,25 @@
         return false;
     }
     
+    /**
+     * Searches array of arguments for the specified string's data
+     * @param args array of argument strings
+     * @param value value to search for
+     * @return the string of data after the arg, or null if there is none
+     */
+    private static String scanArgsData(String[] args, String value) {
+        if (args != null) {
+            final int N = args.length;
+            for (int i=0; i<N; i++) {
+                if (value.equals(args[i])) {
+                    i++;
+                    return i < N ? args[i] : null;
+                }
+            }
+        }
+        return null;
+    }
+    
     @Override
     /*
      * The data persisted to file is parsed and the stats are computed. 
@@ -773,6 +797,7 @@
         final boolean isCheckinRequest = scanArgs(args, "--checkin");
         final boolean isCompactOutput = isCheckinRequest || scanArgs(args, "-c");
         final boolean deleteAfterPrint = isCheckinRequest || scanArgs(args, "-d");
+        final String rawPackages = scanArgsData(args, "--packages");
         
         // Make sure the current stats are written to the file.  This
         // doesn't need to be done if we are deleting files after printing,
@@ -781,8 +806,27 @@
             writeStatsToFile(true);
         }
         
+        HashSet<String> packages = null;
+        if (rawPackages != null) {
+            if (!"*".equals(rawPackages)) {
+                // A * is a wildcard to show all packages.
+                String[] names = rawPackages.split(",");
+                for (String n : names) {
+                    if (packages == null) {
+                        packages = new HashSet<String>();
+                    }
+                    packages.add(n);
+                }
+            }
+        } else if (isCheckinRequest) {
+            // If checkin doesn't specify any packages, then we simply won't
+            // show anything.
+            Log.w(TAG, "Checkin without packages");
+            return;
+        }
+        
         synchronized (mFileLock) {
-            collectDumpInfoFLOCK(pw, isCompactOutput, deleteAfterPrint);
+            collectDumpInfoFLOCK(pw, isCompactOutput, deleteAfterPrint, packages);
         }
     }
 
diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java
index 7a8d4e5e..a4b47b5 100644
--- a/services/java/com/android/server/status/StatusBarPolicy.java
+++ b/services/java/com/android/server/status/StatusBarPolicy.java
@@ -626,7 +626,9 @@
                         && mBatteryThreshold > BATTERY_THRESHOLD_WARNING))) {
             // Broadcast the low battery warning
             mSentLowBatteryBroadcast = true;
-            mContext.sendBroadcast(new Intent(Intent.ACTION_BATTERY_LOW));
+            Intent batIntent = new Intent(Intent.ACTION_BATTERY_LOW);
+            batIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+            mContext.sendBroadcast(batIntent);
 
             if (SHOW_LOW_BATTERY_WARNING) {
                 if (false) {
@@ -644,7 +646,9 @@
         } else if (mBatteryThreshold < BATTERY_THRESHOLD_WARNING) {
             if (mSentLowBatteryBroadcast == true) {
                 mSentLowBatteryBroadcast = false;
-                mContext.sendBroadcast(new Intent(Intent.ACTION_BATTERY_OKAY));
+                Intent batIntent = new Intent(Intent.ACTION_BATTERY_OKAY);
+                batIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+                mContext.sendBroadcast(batIntent);
             }
             if (SHOW_LOW_BATTERY_WARNING) {
                 if (mLowBatteryDialog != null) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index c9dcd8b..ba5c6e7 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -322,7 +322,9 @@
     /**
      * Returns the alphabetic name of current registered operator.
      * <p>
-     * Availability: Only when user is registered to a network
+     * Availability: Only when user is registered to a network. Result may be
+     * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if
+     * on a CDMA network).
      */
     public String getNetworkOperatorName() {
         return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA);
@@ -331,7 +333,9 @@
     /**
      * Returns the numeric name (MCC+MNC) of current registered operator.
      * <p>
-     * Availability: Only when user is registered to a network
+     * Availability: Only when user is registered to a network. Result may be
+     * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if
+     * on a CDMA network).
      */
     public String getNetworkOperator() {
         return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC);
@@ -341,7 +345,7 @@
      * Returns true if the device is considered roaming on the current
      * network, for GSM purposes.
      * <p>
-     * Availability: Only when user registered to a network
+     * Availability: Only when user registered to a network.
      */
     public boolean isNetworkRoaming() {
         return "true".equals(SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING));
@@ -351,7 +355,9 @@
      * Returns the ISO country code equivilent of the current registered
      * operator's MCC (Mobile Country Code).
      * <p>
-     * Availability: Only when user is registered to a network
+     * Availability: Only when user is registered to a network. Result may be
+     * unreliable on CDMA networks (use {@link #getPhoneType()} to determine if
+     * on a CDMA network).
      */
     public String getNetworkCountryIso() {
         return SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY);
diff --git a/telephony/java/android/telephony/cdma/CdmaCellLocation.java b/telephony/java/android/telephony/cdma/CdmaCellLocation.java
index 189959b..b8778f8 100644
--- a/telephony/java/android/telephony/cdma/CdmaCellLocation.java
+++ b/telephony/java/android/telephony/cdma/CdmaCellLocation.java
@@ -27,6 +27,8 @@
     private int mBaseStationId = -1;
     private int mBaseStationLatitude = -1;
     private int mBaseStationLongitude = -1;
+    private int mSystemId = -1;
+    private int mNetworkId = -1;
 
     /**
      * Empty constructor.  Initializes the LAC and CID to -1.
@@ -35,6 +37,8 @@
         this.mBaseStationId = -1;
         this.mBaseStationLatitude = -1;
         this.mBaseStationLongitude = -1;
+        this.mSystemId = -1;
+        this.mNetworkId = -1;
     }
 
     /**
@@ -44,6 +48,8 @@
         this.mBaseStationId = bundleWithValues.getInt("baseStationId");
         this.mBaseStationLatitude = bundleWithValues.getInt("baseStationLatitude");
         this.mBaseStationLongitude = bundleWithValues.getInt("baseStationLongitude");
+        this.mSystemId = bundleWithValues.getInt("systemId");
+        this.mNetworkId = bundleWithValues.getInt("networkId");
     }
 
     /**
@@ -68,12 +74,28 @@
     }
 
     /**
+     * @return cdma system identification number, -1 if unknown
+     */
+    public int getSystemId() {
+        return this.mSystemId;
+    }
+
+    /**
+     * @return cdma network identification number, -1 if unknown
+     */
+    public int getNetworkId() {
+        return this.mNetworkId;
+    }
+
+    /**
      * Invalidate this object.  The cell location data is set to -1.
      */
     public void setStateInvalid() {
         this.mBaseStationId = -1;
         this.mBaseStationLatitude = -1;
         this.mBaseStationLongitude = -1;
+        this.mSystemId = -1;
+        this.mNetworkId = -1;
     }
 
     /**
@@ -87,9 +109,23 @@
          this.mBaseStationLongitude = baseStationLongitude; //values[3];
     }
 
+    /**
+     * Set the cell location data.
+     */
+     public void setCellLocationData(int baseStationId, int baseStationLatitude,
+         int baseStationLongitude, int systemId, int networkId) {
+         // The following values have to be written in the correct sequence
+         this.mBaseStationId = baseStationId;
+         this.mBaseStationLatitude = baseStationLatitude;   //values[2];
+         this.mBaseStationLongitude = baseStationLongitude; //values[3];
+         this.mSystemId = systemId;
+         this.mNetworkId = networkId;
+    }
+
     @Override
     public int hashCode() {
-        return this.mBaseStationId ^ this.mBaseStationLatitude ^ this.mBaseStationLongitude;
+        return this.mBaseStationId ^ this.mBaseStationLatitude ^ this.mBaseStationLongitude
+                ^ this.mSystemId ^ this.mNetworkId;
     }
 
     @Override
@@ -108,7 +144,9 @@
 
         return (equalsHandlesNulls(this.mBaseStationId, s.mBaseStationId) &&
                 equalsHandlesNulls(this.mBaseStationLatitude, s.mBaseStationLatitude) &&
-                equalsHandlesNulls(this.mBaseStationLongitude, s.mBaseStationLongitude)
+                equalsHandlesNulls(this.mBaseStationLongitude, s.mBaseStationLongitude) &&
+                equalsHandlesNulls(this.mSystemId, s.mSystemId) &&
+                equalsHandlesNulls(this.mNetworkId, s.mNetworkId)
         );
     }
 
@@ -116,7 +154,9 @@
     public String toString() {
         return "[" + this.mBaseStationId + ","
                    + this.mBaseStationLatitude + ","
-                   + this.mBaseStationLongitude + "]";
+                   + this.mBaseStationLongitude + ","
+                   + this.mSystemId + ","
+                   + this.mNetworkId + "]";
     }
 
     /**
@@ -139,6 +179,8 @@
         bundleToFill.putInt("baseStationId", this.mBaseStationId);
         bundleToFill.putInt("baseStationLatitude", this.mBaseStationLatitude);
         bundleToFill.putInt("baseStationLongitude", this.mBaseStationLongitude);
+        bundleToFill.putInt("systemId", this.mSystemId);
+        bundleToFill.putInt("networkId", this.mNetworkId);
     }
 
 }
diff --git a/telephony/java/com/android/internal/telephony/CommandsInterface.java b/telephony/java/com/android/internal/telephony/CommandsInterface.java
index 25c512e..e583110 100644
--- a/telephony/java/com/android/internal/telephony/CommandsInterface.java
+++ b/telephony/java/com/android/internal/telephony/CommandsInterface.java
@@ -880,7 +880,7 @@
      *  ar.userObject contains the orignal value of result.obj
      *  ar.result is null on success and failure
      */
-    void sendBurstDtmf(String dtmfString, Message result);
+    void sendBurstDtmf(String dtmfString, int on, int off, Message result);
 
     /**
      * smscPDU is smsc address in PDU form GSM BCD format prefixed
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index c8d384d..7f2b849 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -760,10 +760,12 @@
      * back to caller.
      *
      * @param dtmfString is string representing the dialing digit(s) in the active call
+     * @param on the DTMF ON length in milliseconds, or 0 for default
+     * @param off the DTMF OFF length in milliseconds, or 0 for default
      * @param onCompelte is the callback message when the action is processed by BP
      *
      */
-    void sendBurstDtmf(String dtmfString, Message onComplete);
+    void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete);
 
     /**
      * Sets the radio power on/off state (off is sometimes
diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java
index a26e729..bcb1ccc 100644
--- a/telephony/java/com/android/internal/telephony/PhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/PhoneBase.java
@@ -685,7 +685,7 @@
         return null;
     }
 
-    public void sendBurstDtmf(String dtmfString, Message onComplete) {
+    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
         // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
         Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
     }
diff --git a/telephony/java/com/android/internal/telephony/PhoneProxy.java b/telephony/java/com/android/internal/telephony/PhoneProxy.java
index 5b3c8dd..da00268 100644
--- a/telephony/java/com/android/internal/telephony/PhoneProxy.java
+++ b/telephony/java/com/android/internal/telephony/PhoneProxy.java
@@ -713,8 +713,8 @@
          return mActivePhone.getCdmaEriIconMode();
     }
 
-    public void sendBurstDtmf(String dtmfString, Message onComplete){
-        mActivePhone.sendBurstDtmf(dtmfString,onComplete);
+    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){
+        mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete);
     }
 
     public void exitEmergencyCallbackMode(){
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index 4db3e5b..690b38a 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -1068,10 +1068,13 @@
     }
 
     public void
-    sendBurstDtmf(String dtmfString, Message result) {
+    sendBurstDtmf(String dtmfString, int on, int off, Message result) {
         RILRequest rr = RILRequest.obtain(RIL_REQUEST_CDMA_BURST_DTMF, result);
 
+        rr.mp.writeInt(3);
         rr.mp.writeString(dtmfString);
+        rr.mp.writeString(Integer.toString(on));
+        rr.mp.writeString(Integer.toString(off));
 
         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
                 + " : " + dtmfString);
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index b2e16c7..7834018 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -118,6 +118,12 @@
      */
     int RIL_RESTRICTED_STATE_PS_ALL = 0x10;
 
+    /** Data profile for RIL_REQUEST_SETUP_DATA_CALL */
+    static final int DATA_PROFILE_DEFAULT   = 0;
+    static final int DATA_PROFILE_TETHERED  = 1;
+    static final int DATA_PROFILE_OEM_BASE  = 1000;
+
+
     int RIL_REQUEST_GET_SIM_STATUS = 1;
     int RIL_REQUEST_ENTER_SIM_PIN = 2;
     int RIL_REQUEST_ENTER_SIM_PUK = 3;
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 9152211..02e9800 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -32,6 +32,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_SERVICE_STATE_CHANGED = "android.intent.action.SERVICE_STATE";
 
@@ -50,6 +53,9 @@
      *
      * <p class="note">
      * Requires no permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_RADIO_TECHNOLOGY_CHANGED
             = "android.intent.action.RADIO_TECHNOLOGY";
@@ -66,6 +72,9 @@
      *
      * <p class="note">
      * Requires no permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_EMERGENCY_CALLBACK_MODE_CHANGED
             = "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED";
@@ -89,6 +98,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_SIGNAL_STRENGTH_CHANGED = "android.intent.action.SIG_STR";
 
@@ -110,6 +122,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_ANY_DATA_CONNECTION_STATE_CHANGED
             = "android.intent.action.ANY_DATA_STATE";
@@ -127,6 +142,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_DATA_CONNECTION_FAILED
             = "android.intent.action.DATA_CONNECTION_FAILED";
@@ -148,6 +166,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_SIM_STATE_CHANGED
             = "android.intent.action.SIM_STATE_CHANGED";
@@ -163,6 +184,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_NETWORK_SET_TIME = "android.intent.action.NETWORK_SET_TIME";
 
@@ -178,6 +202,9 @@
      *
      * <p class="note">
      * Requires the READ_PHONE_STATE permission.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_NETWORK_SET_TIMEZONE
             = "android.intent.action.NETWORK_SET_TIMEZONE";
@@ -187,6 +214,9 @@
      * <p class="note">.
      * This is to pop up a notice to show user that the phone is in emergency callback mode
      * and atacalls and outgoing sms are blocked.
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      */
     public static final String ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS
             = "android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS";
@@ -197,6 +227,9 @@
      * <ul>
      *   <li><em>mdn</em> - An Integer of the updated MDN number.</li>
      * </ul>
+     * 
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
      *
      * <p class="note">
      */
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 290e1fc..5ec4020 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -40,14 +40,16 @@
 
     //****** Current Network
 
-    /** Alpha name of current registered operator.
-     *  Availability: when registered to a network
+    /** Alpha name of current registered operator.<p>
+     *  Availability: when registered to a network. Result may be unreliable on
+     *  CDMA networks.
      */
     static final String PROPERTY_OPERATOR_ALPHA = "gsm.operator.alpha";
     //TODO: most of these proprieties are generic, substitute gsm. with phone. bug 1856959
 
-    /** Numeric name (MCC+MNC) of current registered operator.
-     *  Availability: when registered to a network
+    /** Numeric name (MCC+MNC) of current registered operator.<p>
+     *  Availability: when registered to a network. Result may be unreliable on
+     *  CDMA networks.
      */
     static final String PROPERTY_OPERATOR_NUMERIC = "gsm.operator.numeric";
 
@@ -64,8 +66,9 @@
     static final String PROPERTY_OPERATOR_ISROAMING = "gsm.operator.isroaming";
 
     /** The ISO country code equivalent of the current registered operator's
-     *  MCC (Mobile Country Code)
-     *  Availability: when registered to a network
+     *  MCC (Mobile Country Code)<p>
+     *  Availability: when registered to a network. Result may be unreliable on
+     *  CDMA networks.
      */
     static final String PROPERTY_OPERATOR_ISO_COUNTRY = "gsm.operator.iso-country";
 
diff --git a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
index 2984fa8..3bbe0e1 100644
--- a/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
+++ b/telephony/java/com/android/internal/telephony/WspTypeDecoder.java
@@ -187,22 +187,30 @@
     }
 
     /**
-     * Decode the "Extension-media" type for WSP pdu
-     *
-     * @param startIndex The starting position of the "Extension-media" in this pdu
-     *
-     * @return false when error(not a Extension-media) occur
-     *         return value can be retrieved by getValueString() method
-     *         length of data in pdu can be retrieved by getValue32() method
-     */
+    * Decode the "Extension-media" type for WSP PDU.
+    *
+    * @param startIndex The starting position of the "Extension-media" in this PDU.
+    *
+    * @return false on error, such as if there is no Extension-media at startIndex.
+    * Side-effects: updates stringValue (available with getValueString()), which will be
+    * null on error. The length of the data in the PDU is available with getValue32(), 0
+    * on error.
+    */
     public boolean decodeExtensionMedia(int startIndex) {
         int index = startIndex;
-        while (wspData[index] != 0) {
+        dataLength = 0;
+        stringValue = null;
+        int length = wspData.length;
+        boolean rtrn = index < length;
+
+        while (index < length && wspData[index] != 0) {
             index++;
         }
+
         dataLength  = index - startIndex + 1;
         stringValue = new String(wspData, startIndex, dataLength - 1);
-        return true;
+
+        return rtrn;
     }
 
     /**
diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
index 3362de8..23eedfe 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -18,17 +18,23 @@
 
 import android.app.ActivityManagerNative;
 import android.content.Context;
+import android.content.ContentValues;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.content.SharedPreferences;
+import android.database.SQLException;
+import android.net.Uri;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
 import android.os.Registrant;
 import android.os.RegistrantList;
+import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.preference.PreferenceManager;
 import android.provider.Settings;
+import android.provider.Telephony;
 import android.telephony.CellLocation;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
@@ -41,6 +47,10 @@
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.DataConnection;
+// TODO(Moto): need to move MccTable from telephony.gsm to telephony
+// since there is no difference between CDMA and GSM for MccTable and
+// CDMA uses gsm's MccTable is not good.
+import com.android.internal.telephony.gsm.MccTable;
 import com.android.internal.telephony.IccCard;
 import com.android.internal.telephony.IccException;
 import com.android.internal.telephony.IccFileHandler;
@@ -56,6 +66,10 @@
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.TelephonyProperties;
 
+import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
+import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
+import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
+
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -154,6 +168,23 @@
         String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
         mIsPhoneInECMState = inEcm.equals("true");
 
+        // Sets operator alpha property by retrieving from build-time system property
+        String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha");
+        setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha);
+
+        // Sets operator numeric property by retrieving from build-time system property
+        String operatorNumeric = SystemProperties.get("ro.cdma.home.operator.numeric");
+        setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric);
+
+        // Sets iso country property by retrieving from build-time system property
+        setIsoCountryProperty(operatorNumeric);
+
+        // Sets current entry in the telephony carrier table
+        updateCurrentCarrierInProvider(operatorNumeric);
+
+        // Updates MCC MNC device configuration information
+        updateMccMncConfiguration(operatorNumeric);
+
         // Notify voicemails.
         notifier.notifyMessageWaitingChanged(this);
     }
@@ -427,13 +458,7 @@
     }
 
     public String getSubscriberId() {
-        // Subscriber ID is the combination of MCC+MNC+MIN as CDMA IMSI
-        // TODO(Moto): Replace with call to mRuimRecords.getIMSI_M() when implemented.
-        if ((getServiceState().getOperatorNumeric() != null) && (getCdmaMIN() != null)) {
-            return (getServiceState().getOperatorNumeric() + getCdmaMIN());
-        } else {
-            return null;
-        }
+        return mSST.getImsi();
     }
 
     public boolean canConference() {
@@ -630,7 +655,7 @@
         mCM.stopDtmf(null);
     }
 
-    public void sendBurstDtmf(String dtmfString, Message onComplete) {
+    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
         boolean check = true;
         for (int itr = 0;itr < dtmfString.length(); itr++) {
             if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) {
@@ -641,7 +666,7 @@
             }
         }
         if ((mCT.state ==  Phone.State.OFFHOOK)&&(check)) {
-            mCM.sendBurstDtmf(dtmfString, onComplete);
+            mCM.sendBurstDtmf(dtmfString, on, off, onComplete);
         }
      }
 
@@ -1244,4 +1269,66 @@
         editor.commit();
     }
 
+    /**
+     * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property
+     *
+     */
+    private void setIsoCountryProperty(String operatorNumeric) {
+        if (TextUtils.isEmpty(operatorNumeric)) {
+            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, "");
+        } else {
+            String iso = "";
+            try {
+                iso = MccTable.countryCodeForMcc(Integer.parseInt(
+                        operatorNumeric.substring(0,3)));
+            } catch (NumberFormatException ex) {
+                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
+            } catch (StringIndexOutOfBoundsException ex) {
+                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
+            }
+
+            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);
+        }
+    }
+
+    /**
+     * Sets the "current" field in the telephony provider according to the build-time
+     * operator numeric property
+     *
+     * @return true for success; false otherwise.
+     */
+    // TODO(Moto): move this method into PhoneBase, since it looks identical to
+    // the one in GsmPhone
+    private boolean updateCurrentCarrierInProvider(String operatorNumeric) {
+        if (!TextUtils.isEmpty(operatorNumeric)) {
+            try {
+                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
+                ContentValues map = new ContentValues();
+                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
+                getContext().getContentResolver().insert(uri, map);
+                return true;
+            } catch (SQLException e) {
+                Log.e(LOG_TAG, "Can't store current operator", e);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Updates MCC and MNC device configuration information for application retrieving
+     * correct version of resources
+     *
+     */
+    private void updateMccMncConfiguration(String operatorNumeric) {
+        if (operatorNumeric.length() >= 5) {
+            Configuration config = new Configuration();
+            config.mcc = Integer.parseInt(operatorNumeric.substring(0,3));
+            config.mnc = Integer.parseInt(operatorNumeric.substring(3));
+            try {
+                ActivityManagerNative.getDefault().updateConfiguration(config);
+            } catch (RemoteException e) {
+                Log.e(LOG_TAG, "Can't update configuration", e);
+            }
+        }
+    }
 }
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
index f2b07a8..fef6d3c 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
@@ -21,6 +21,7 @@
 import android.util.Log;
 
 import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.DataLink;
 import com.android.internal.telephony.RILConstants;
@@ -142,7 +143,8 @@
         lastFailTime = -1;
         lastFailCause = FailCause.NONE;
         receivedDisconnectReq = false;
-        phone.mCM.setupDataCall(Integer.toString(RILConstants.CDMA_PHONE), null, null, null,
+        phone.mCM.setupDataCall(Integer.toString(RILConstants.CDMA_PHONE),
+                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), null, null,
                 null, obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE));
     }
 
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index e75a333..23a0520 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -19,11 +19,8 @@
 import android.app.AlarmManager;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.ContentValues;
 import android.content.Intent;
 import android.database.ContentObserver;
-import android.database.SQLException;
-import android.net.Uri;
 import android.os.AsyncResult;
 import android.os.Handler;
 import android.os.Message;
@@ -35,7 +32,6 @@
 import android.provider.Checkin;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
-import android.provider.Telephony;
 import android.provider.Telephony.Intents;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
@@ -64,6 +60,7 @@
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISROAMING;
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_NUMERIC;
 import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
+import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -571,7 +568,7 @@
                     try {
                         registrationState = Integer.parseInt(states[0]);
                         radioTechnology = Integer.parseInt(states[3]);
-                        baseStationId = Integer.parseInt(states[4], 16);
+                        baseStationId = Integer.parseInt(states[4]);
                         baseStationLatitude = Integer.parseInt(states[5], 16);
                         baseStationLongitude = Integer.parseInt(states[6], 16);
                         cssIndicator = Integer.parseInt(states[7]);
@@ -608,7 +605,7 @@
 
                 // values are -1 if not available
                 newCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
-                        baseStationLongitude);
+                        baseStationLongitude, systemId, networkId);
 
                 if (reasonForDenial == 0) {
                     mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
@@ -634,27 +631,6 @@
                     } else {
                         newSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
                     }
-
-                    if (!(opNames[2].equals(currentCarrier))) {
-                        // TODO(Moto): jsh asks, "This uses the MCC+MNC of the current registered
-                        // network to set the "current" entry in the APN table. But the correct
-                        // entry should be the MCC+MNC that matches the subscribed operator
-                        // (eg, phone issuer). These can be different when roaming."
-                        try {
-                            // Set the current field of the telephony provider according to
-                            // the CDMA's operator
-                            Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
-                            ContentValues map = new ContentValues();
-                            map.put(Telephony.Carriers.NUMERIC, opNames[2]);
-                            cr.insert(uri, map);
-                            // save current carrier for the next time check
-                            currentCarrier = opNames[2];
-                        } catch (SQLException e) {
-                            Log.e(LOG_TAG, "Can't store current operator", e);
-                        }
-                    } else {
-                        Log.i(LOG_TAG, "current carrier is not changed");
-                    }
                 } else {
                     Log.w(LOG_TAG, "error parsing opNames");
                 }
@@ -665,8 +641,15 @@
 
                 if (cdmaSubscription != null && cdmaSubscription.length >= 4) {
                     mMdn = cdmaSubscription[0];
-                    mHomeSystemId = Integer.parseInt(cdmaSubscription[1], 16);
-                    mHomeNetworkId = Integer.parseInt(cdmaSubscription[2], 16);
+                    // TODO: Only grabbing the first SID/NID for now.
+                    if (cdmaSubscription[1] != null) {
+                        String[] sid = cdmaSubscription[1].split(",");
+                        mHomeSystemId = sid.length > 0 ? Integer.parseInt(sid[0]) : 0;
+                    }
+                    if (cdmaSubscription[2] != null) {
+                        String[] nid = cdmaSubscription[2].split(",");
+                        mHomeNetworkId = nid.length > 0 ? Integer.parseInt(nid[0]) : 0;
+                    }
                     mMin = cdmaSubscription[3];
 
                 } else {
@@ -1437,4 +1420,19 @@
          return mMin;
     }
 
+    /**
+     * Returns IMSI as MCC + MNC + MIN
+     */
+    /*package*/ String getImsi() {
+        // TODO(Moto): When RUIM is enabled, IMSI will come from RUIM
+        // not build-time props. Moto will provide implementation
+        // for RUIM-ready case later.
+        String operatorNumeric = SystemProperties.get(PROPERTY_ICC_OPERATOR_NUMERIC, "");
+
+        if (!TextUtils.isEmpty(operatorNumeric) && getCdmaMin() != null) {
+            return (operatorNumeric + getCdmaMin());
+        } else {
+            return null;
+        }
+    }
 }
diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
index c7e61da..55f48b1 100644
--- a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
+++ b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
@@ -55,8 +55,6 @@
 
     private String mImsi;
     private String mMyMobileNumber;
-    private String mSid;
-    private String mNid;
     private String mMin2Min1;
 
     private String mPrlVersion;
@@ -125,21 +123,12 @@
 
         adnCache.reset();
 
-        phone.setSystemProperty(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, null);
-        phone.setSystemProperty(TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null);
-
         // recordsRequested is set to false indicating that the SIM
         // read requests made so far are not valid. This is set to
         // true only when fresh set of read requests are made.
         recordsRequested = false;
     }
 
-    /** Returns null if RUIM is not yet ready */
-    public String getIMSI_M() {
-        // TODO(Moto): mImsi is not initialized, fix.
-        return mImsi;
-    }
-
     public String getMdnNumber() {
         return mMyMobileNumber;
     }
@@ -242,8 +231,6 @@
                     m_ota_commited = false;
                 }
                 mMyMobileNumber = localTemp[0];
-                mSid = localTemp[1];
-                mNid = localTemp[2];
                 mMin2Min1 = localTemp[3];
                 mPrlVersion = localTemp[4];
 
diff --git a/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java b/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java
index 55e5adc..89de867 100644
--- a/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java
+++ b/telephony/java/com/android/internal/telephony/gsm/PdpConnection.java
@@ -22,6 +22,7 @@
 import android.util.Log;
 
 import com.android.internal.telephony.CommandException;
+import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.DataLink;
 import com.android.internal.telephony.Phone;
@@ -83,7 +84,8 @@
         lastFailCause = FailCause.NONE;
         receivedDisconnectReq = false;
 
-        phone.mCM.setupDataCall(Integer.toString(RILConstants.GSM_PHONE), null, apn.apn, apn.user,
+        phone.mCM.setupDataCall(Integer.toString(RILConstants.GSM_PHONE),
+                Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), apn.apn, apn.user,
                 apn.password, obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE));
     }
 
diff --git a/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java b/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java
index 22adc19..f71ea48 100644
--- a/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/telephony/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -937,7 +937,7 @@
      *  ar.userObject contains the orignal value of result.obj
      *  ar.result is null on success and failure
      */
-    public void sendBurstDtmf(String dtmfString, Message result) {
+    public void sendBurstDtmf(String dtmfString, int on, int off, Message result) {
         resultSuccess(result, null);
     }
 
diff --git a/tests/AndroidTests/AndroidManifest.xml b/tests/AndroidTests/AndroidManifest.xml
index 55d4d64..845f547 100644
--- a/tests/AndroidTests/AndroidManifest.xml
+++ b/tests/AndroidTests/AndroidManifest.xml
@@ -48,6 +48,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WRITE_GSERVICES" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
     <uses-permission android:name="com.android.unit_tests.permission.TEST_GRANTED" />
 
diff --git a/tests/AndroidTests/run_test.sh b/tests/AndroidTests/run_test.sh
index 0cdf63f..7ada698 100755
--- a/tests/AndroidTests/run_test.sh
+++ b/tests/AndroidTests/run_test.sh
@@ -1,4 +1,4 @@
 framework=/system/framework
 bpath=$framework/core.jar:$framework/ext.jar:$framework/framework.jar:$framework/android.test.runner.jar
-adb shell exec dalvikvm  -Xbootclasspath:$bpath -cp system/app/AndroidTests.apk \
+adb shell exec dalvikvm  -Xbootclasspath:$bpath -cp /system/app/AndroidTests.apk:/data/app/com.android.unit_tests.apk \
       com.android.internal.util.WithFramework junit.textui.TestRunner $*
diff --git a/tests/AndroidTests/src/com/android/unit_tests/HtmlTest.java b/tests/AndroidTests/src/com/android/unit_tests/HtmlTest.java
index 27da4f1..027730f 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/HtmlTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/HtmlTest.java
@@ -16,11 +16,25 @@
 
 package com.android.unit_tests;
 
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
 import android.graphics.Typeface;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
-import android.text.*;
-import android.text.style.*;
+import android.text.Html;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.QuoteSpan;
+import android.text.style.StrikethroughSpan;
+import android.text.style.StyleSpan;
+import android.text.style.SubscriptSpan;
+import android.text.style.SuperscriptSpan;
+import android.text.style.TextAppearanceSpan;
+import android.text.style.TypefaceSpan;
+import android.text.style.URLSpan;
+import android.text.style.UnderlineSpan;
 
 import junit.framework.TestCase;
 
@@ -35,14 +49,54 @@
 
         s = Html.fromHtml("<font color=\"#00FF00\">something</font>");
         colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
-        assertEquals(colors[0].getForegroundColor(), 0xFF00FF00);
+        assertEquals(1, colors.length);
+        assertEquals(0xFF00FF00, colors[0].getForegroundColor());
 
         s = Html.fromHtml("<font color=\"navy\">something</font>");
         colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
-        assertEquals(colors[0].getForegroundColor(), 0xFF000080);
+        assertEquals(1, colors.length);
+        assertEquals(0xFF000080, colors[0].getForegroundColor());
 
         s = Html.fromHtml("<font color=\"gibberish\">something</font>");
         colors = s.getSpans(0, s.length(), ForegroundColorSpan.class);
+        assertEquals(0, colors.length);
+    }
+
+    @MediumTest
+    public void testResourceColor() throws Exception {
+        ColorStateList c =
+                Resources.getSystem().getColorStateList(android.R.color.primary_text_dark);
+        Spanned s;
+        TextAppearanceSpan[] colors;
+
+        s = Html.fromHtml("<font color=\"@android:color/primary_text_dark\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
+        assertEquals(1, colors.length);
+        assertEquals(c.toString(), colors[0].getTextColor().toString());
+
+        s = Html.fromHtml("<font color=\"@android:primary_text_dark\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
+        assertEquals(1, colors.length);
+        assertEquals(c.toString(), colors[0].getTextColor().toString());
+
+        s = Html.fromHtml("<font color=\"@color/primary_text_dark\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
+        assertEquals(1, colors.length);
+        assertEquals(c.toString(), colors[0].getTextColor().toString());
+
+        s = Html.fromHtml("<font color=\"@primary_text_dark\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
+        assertEquals(1, colors.length);
+        assertEquals(c.toString(), colors[0].getTextColor().toString());
+
+        s = Html.fromHtml("<font color=\"@" + android.R.color.primary_text_dark
+                + "\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
+        assertEquals(1, colors.length);
+        assertEquals(c.toString(), colors[0].getTextColor().toString());
+
+        s = Html.fromHtml("<font color=\"gibberish\">something</font>");
+        colors = s.getSpans(0, s.length(), TextAppearanceSpan.class);
         assertEquals(colors.length, 0);
     }
 
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
index c4f1ab6..4c5fefc 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
@@ -107,8 +107,6 @@
     }
 
     // Checks that the search UI is not visible.
-    // This checks both the SearchManager and the SearchManagerService,
-    // since SearchManager keeps a local variable for the visibility.
     private void assertSearchNotVisible() {
         SearchManager searchManager = (SearchManager)
                 mContext.getSystemService(Context.SEARCH_SERVICE);
@@ -245,22 +243,4 @@
         assertSearchNotVisible();
     }
 
-    @MediumTest
-    public void testSearchDialogState() throws Exception {
-        SearchManager searchManager = (SearchManager)
-                mContext.getSystemService(Context.SEARCH_SERVICE);
-        assertNotNull(searchManager);
-
-        Bundle searchState;
-
-        // search dialog not visible, so no state should be stored
-        searchState = searchManager.saveSearchDialog();
-        assertNull(searchState);
-
-        searchManager.startSearch("test search string", true, SEARCHABLE_ACTIVITY, null, false);
-        searchState = searchManager.saveSearchDialog();
-        assertNotNull(searchState);
-        searchManager.stopSearch();
-    }
-
 }
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
index ecc8dfe..4e5f7a9 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
@@ -93,8 +93,8 @@
         Context appContext = si.getActivityContext(mContext);
         assertNotNull(appContext);
         MoreAsserts.assertNotEqual(appContext, mContext);
-        assertEquals("Android Search", appContext.getString(si.getHintId()));
-        assertEquals("Google", appContext.getString(si.getLabelId()));
+        assertEquals("Quick Search Box", appContext.getString(si.getHintId()));
+        assertEquals("Quick Search Box", appContext.getString(si.getLabelId()));
     }
     
     /**
diff --git a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
index 130beeb..0abbc9a 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/UriTest.java
@@ -499,4 +499,41 @@
 
         assertEquals(uriString, uri.toString());
     }
+
+    public void testEmptyToStringNotNull() {
+        assertNotNull(Uri.EMPTY.toString());
+    }
+
+    @SmallTest
+    public void testParcellingWithoutFragment() {
+        parcelAndUnparcel(Uri.parse("foo:bob%20lee"));
+        parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment"));
+        parcelAndUnparcel(new Uri.Builder()
+            .scheme("http")
+            .authority("crazybob.org")
+            .path("/rss/")
+            .encodedQuery("a=b")
+            .build());
+    }
+
+    public void testGetQueryParameter() {
+        String nestedUrl = "http://crazybob.org/?a=1&b=2";
+        Uri uri = Uri.parse("http://test/").buildUpon()
+                .appendQueryParameter("foo", "bar")
+                .appendQueryParameter("nested", nestedUrl).build();
+        assertEquals(nestedUrl, uri.getQueryParameter("nested"));
+        assertEquals(nestedUrl, uri.getQueryParameters("nested").get(0));
+    }
+
+    public void testGetQueryParameterWorkaround() {
+        // This was a workaround for a bug where getQueryParameter called
+        // getQuery() instead of getEncodedQuery().
+        String nestedUrl = "http://crazybob.org/?a=1&b=2";
+        Uri uri = Uri.parse("http://test/").buildUpon()
+                .appendQueryParameter("foo", "bar")
+                .appendQueryParameter("nested", Uri.encode(nestedUrl)).build();
+        assertEquals(nestedUrl, Uri.decode(uri.getQueryParameter("nested")));
+        assertEquals(nestedUrl,
+                Uri.decode(uri.getQueryParameters("nested").get(0)));
+    }
 }
diff --git a/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java b/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java
new file mode 100755
index 0000000..7dc1314
--- /dev/null
+++ b/tests/AndroidTests/src/com/android/unit_tests/VpnTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.unit_tests;
+
+import android.net.vpn.L2tpIpsecProfile;
+import android.net.vpn.VpnType;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Unit test class to test VPN api
+ * Use the below command to run the vpn unit test only
+ * runtest vpntest or
+ * adb shell am instrument -e class 'com.android.unit_tests.VpnTest'
+ *   -w com.android.unit_tests/android.test.InstrumentationTestRunner
+ */
+public class VpnTest extends AndroidTestCase {
+
+    @Override
+    public void setUp() {
+    }
+
+    @Override
+    public void tearDown() {
+    }
+
+    @SmallTest
+    public void testGetType() {
+        L2tpIpsecProfile li = new L2tpIpsecProfile();
+        assertTrue(VpnType.L2TP_IPSEC== li.getType());
+    }
+}
diff --git a/tests/AndroidTests/src/com/android/unit_tests/activity/ServiceTest.java b/tests/AndroidTests/src/com/android/unit_tests/activity/ServiceTest.java
index db523dc..95f6e36 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/activity/ServiceTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/activity/ServiceTest.java
@@ -27,10 +27,14 @@
 import android.os.Parcel;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.Suppress;
 import android.util.Log;
 
 // These test binders purport to support an interface whose canonical
 // interface name is ServiceTest.SERVICE_LOCAL
+// Temporarily suppress, this test is causing unit test suite run to fail
+// TODO: remove this suppress
+@Suppress
 public class ServiceTest extends ActivityTestsBase {
 
     public static final String SERVICE_LOCAL =
@@ -131,7 +135,7 @@
             mSetReporter = setReporter;
             mMonitor = !setReporter;
         }
-        
+
         void setMonitor(boolean v) {
             mMonitor = v;
         }
@@ -148,7 +152,7 @@
                 }
                 data.recycle();
             }
-            
+
             if (mMonitor) {
                 mCount++;
                 if (mStartState == STATE_START_1) {
@@ -260,7 +264,7 @@
         waitForResultOrThrow(5 * 1000, "existing connection to lose service");
 
         getContext().unbindService(conn);
-        
+
         conn = new TestConnection(true, true);
         success = false;
         try {
@@ -290,7 +294,7 @@
         waitForResultOrThrow(5 * 1000, "existing connection to lose service");
 
         getContext().unbindService(conn);
-        
+
         conn = new TestConnection(true, true);
         success = false;
         try {
@@ -318,12 +322,12 @@
         mStartState = STATE_UNBIND_ONLY;
         getContext().unbindService(conn);
         waitForResultOrThrow(5 * 1000, "existing connection to unbind service");
-        
+
         // Expect to see the service rebound.
         mStartState = STATE_REBIND;
         getContext().bindService(service, conn, 0);
         waitForResultOrThrow(5 * 1000, "existing connection to rebind service");
-        
+
         // Expect to see the service unbind and then destroyed.
         mStartState = STATE_UNBIND;
         getContext().stopService(service);
diff --git a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
index e6639d3..a065d70 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/content/ConfigTest.java
@@ -133,7 +133,7 @@
                 case DENSITY:
                     // this is the ratio from the standard
 
-                    mMetrics.density = (((float)value)/((float)DisplayMetrics.DEFAULT_DENSITY));
+                    mMetrics.density = (((float)value)/((float)DisplayMetrics.DENSITY_DEFAULT));
                     break;
                 default:
                     assert(false);
diff --git a/tests/DpiTest/AndroidManifest.xml b/tests/DpiTest/AndroidManifest.xml
index 64ad7be..68ecc6e 100644
--- a/tests/DpiTest/AndroidManifest.xml
+++ b/tests/DpiTest/AndroidManifest.xml
@@ -19,10 +19,15 @@
     <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="3" />
     <supports-screens android:smallScreens="true" />
     <application android:label="DpiTest">
-        <activity android:name="DpiTestActivity" android:label="DpiTest">
+        <activity android:name="DpiTestActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="DpiTestNoCompatActivity" android:label="DpiTestNoCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
diff --git a/tests/DpiTest/res/drawable-nodpi/logonodpi120.png b/tests/DpiTest/res/drawable-nodpi/logonodpi120.png
new file mode 100644
index 0000000..46bbd5b
--- /dev/null
+++ b/tests/DpiTest/res/drawable-nodpi/logonodpi120.png
Binary files differ
diff --git a/tests/DpiTest/res/drawable-nodpi/logonodpi160.png b/tests/DpiTest/res/drawable-nodpi/logonodpi160.png
new file mode 100644
index 0000000..c23b2ce
--- /dev/null
+++ b/tests/DpiTest/res/drawable-nodpi/logonodpi160.png
Binary files differ
diff --git a/tests/DpiTest/res/drawable-nodpi/logonodpi240.png b/tests/DpiTest/res/drawable-nodpi/logonodpi240.png
new file mode 100644
index 0000000..4d717a8
--- /dev/null
+++ b/tests/DpiTest/res/drawable-nodpi/logonodpi240.png
Binary files differ
diff --git a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
index 5a9f3f5..8c69305 100644
--- a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
+++ b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestActivity.java
@@ -17,6 +17,8 @@
 package com.google.android.test.dpi;
 
 import android.app.Activity;
+import android.app.ActivityThread;
+import android.app.Application;
 import android.os.Bundle;
 import android.graphics.BitmapFactory;
 import android.graphics.Bitmap;
@@ -28,8 +30,42 @@
 import android.widget.ScrollView;
 import android.view.View;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.CompatibilityInfo;
+import android.util.DisplayMetrics;
 
 public class DpiTestActivity extends Activity {
+    public DpiTestActivity() {
+        super();
+        init(false);
+    }
+    
+    public DpiTestActivity(boolean noCompat) {
+        super();
+        init(noCompat);
+    }
+    
+    public void init(boolean noCompat) {
+        try {
+            // This is all a dirty hack.  Don't think a real application should
+            // be doing it.
+            Application app = ActivityThread.currentActivityThread().getApplication();
+            ApplicationInfo ai = app.getPackageManager().getApplicationInfo(
+                    "com.google.android.test.dpi",
+                    PackageManager.GET_SUPPORTS_DENSITIES);
+            if (noCompat) {
+                ai.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS
+                    | ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS
+                    | ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS;
+                ai.supportsDensities = new int[] { ApplicationInfo.ANY_DENSITY };
+                app.getResources().setCompatibilityInfo(new CompatibilityInfo(ai));
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            throw new RuntimeException("ouch", e);
+        }
+    }
+    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -73,6 +109,13 @@
         addLabelToRoot(root, "Autoscaled bitmap");
         addChildToRoot(root, layout);
 
+        layout = new LinearLayout(this);
+        addResourceDrawable(layout, R.drawable.logonodpi120);
+        addResourceDrawable(layout, R.drawable.logonodpi160);
+        addResourceDrawable(layout, R.drawable.logonodpi240);
+        addLabelToRoot(root, "No-dpi resource drawable");
+        addChildToRoot(root, layout);
+
         setContentView(scrollWrap(root));
     }
 
@@ -155,7 +198,10 @@
         @Override
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
             super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-            setMeasuredDimension(mBitmap.getScaledWidth(), mBitmap.getScaledHeight());
+            final DisplayMetrics metrics = getResources().getDisplayMetrics();
+            setMeasuredDimension(
+                    mBitmap.getScaledWidth(metrics),
+                    mBitmap.getScaledHeight(metrics));
         }
 
         @Override
diff --git a/tests/DpiTest/src/com/google/android/test/dpi/DpiTestNoCompatActivity.java b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestNoCompatActivity.java
new file mode 100644
index 0000000..4d25e08
--- /dev/null
+++ b/tests/DpiTest/src/com/google/android/test/dpi/DpiTestNoCompatActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.android.test.dpi;
+
+public class DpiTestNoCompatActivity extends DpiTestActivity {
+    public DpiTestNoCompatActivity() {
+        super(true);
+    }
+}
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
index cbcac6c..ba46197 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java
@@ -72,6 +72,11 @@
         // Run tests
         runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis);
 
+        activity.clearCache();
+        try {
+            Thread.sleep(5000);
+        } catch (InterruptedException e) {
+        }
         dumpMemoryInfo();
 
         // Kill activity
diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
index 0d22eca..09f7cbc 100644
--- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
+++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java
@@ -87,6 +87,10 @@
         }
     }
 
+    public void clearCache() {
+      mWebView.clearCache(true);
+    }
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
diff --git a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
index 14d3d73..c782045 100644
--- a/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
+++ b/tests/permission/src/com/android/framework/permission/tests/ActivityManagerPermissionTests.java
@@ -134,8 +134,8 @@
     @SmallTest
     public void testSET_ACTIVITY_WATCHER() {
         try {
-            mAm.setActivityWatcher(null);
-            fail("IActivityManager.setActivityWatcher did not throw SecurityException as"
+            mAm.setActivityController(null);
+            fail("IActivityManager.setActivityController did not throw SecurityException as"
                     + " expected");
         } catch (SecurityException e) {
             // expected
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 67af116..14cad2f 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -654,9 +654,15 @@
                                     ResTable_config* out)
 {
     if (strcmp(name, kWildcardName) == 0) {
-        if (out) out->density = 0;
+        if (out) out->density = ResTable_config::DENSITY_DEFAULT;
         return true;
     }
+    
+    if (strcmp(name, "nodpi") == 0) {
+        if (out) out->density = ResTable_config::DENSITY_NONE;
+        return true;
+    }
+    
     char* c = (char*)name;
     while (*c >= '0' && *c <= '9') {
         c++;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index d0a1c46..fd77d51 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -286,8 +286,8 @@
         }
 
         return computeLayout(layoutDescription, projectKey,
-                screenWidth, screenHeight, DisplayMetrics.DEFAULT_DENSITY,
-                DisplayMetrics.DEFAULT_DENSITY, DisplayMetrics.DEFAULT_DENSITY,
+                screenWidth, screenHeight, DisplayMetrics.DENSITY_DEFAULT,
+                DisplayMetrics.DENSITY_DEFAULT, DisplayMetrics.DENSITY_DEFAULT,
                 themeName, isProjectTheme,
                 projectResources, frameworkResources, customViewLoader, logger);
     }
@@ -304,8 +304,8 @@
             Map<String, Map<String, IResourceValue>> frameworkResources,
             IProjectCallback customViewLoader, ILayoutLog logger) {
         return computeLayout(layoutDescription, projectKey,
-                screenWidth, screenHeight, DisplayMetrics.DEFAULT_DENSITY,
-                DisplayMetrics.DEFAULT_DENSITY, DisplayMetrics.DEFAULT_DENSITY,
+                screenWidth, screenHeight, DisplayMetrics.DENSITY_DEFAULT,
+                DisplayMetrics.DENSITY_DEFAULT, DisplayMetrics.DENSITY_DEFAULT,
                 themeName, isProjectTheme,
                 projectResources, frameworkResources, customViewLoader, logger);
     }
@@ -340,7 +340,7 @@
         try {
             // setup the display Metrics.
             DisplayMetrics metrics = new DisplayMetrics();
-            metrics.density = density / (float) DisplayMetrics.DEFAULT_DENSITY;
+            metrics.density = density / (float) DisplayMetrics.DENSITY_DEFAULT;
             metrics.scaledDensity = metrics.density;
             metrics.widthPixels = screenWidth;
             metrics.heightPixels = screenHeight;
diff --git a/vpn/java/android/net/vpn/VpnManager.java b/vpn/java/android/net/vpn/VpnManager.java
index dc70b26..0bf2346 100644
--- a/vpn/java/android/net/vpn/VpnManager.java
+++ b/vpn/java/android/net/vpn/VpnManager.java
@@ -42,6 +42,15 @@
     public static final String BROADCAST_PROFILE_NAME = "profile_name";
     /** Key to the connectivity state of a connectivity broadcast event. */
     public static final String BROADCAST_CONNECTION_STATE = "connection_state";
+    /** Key to the error code of a connectivity broadcast event. */
+    public static final String BROADCAST_ERROR_CODE = "err";
+    /** Error code to indicate an error from authentication. */
+    public static final int VPN_ERROR_AUTH = 1;
+    /** Error code to indicate the connection attempt failed. */
+    public static final int VPN_ERROR_CONNECTION_FAILED = 2;
+    /** Error code to indicate the server is not known. */
+    public static final int VPN_ERROR_UNKNOWN_SERVER = 3;
+    private static final int VPN_ERROR_NO_ERROR = 0;
 
     public static final String PROFILES_PATH = "/data/misc/vpn/profiles";
 
@@ -52,7 +61,8 @@
     private static final String ACTION_VPN_SERVICE = PACKAGE_PREFIX + "SERVICE";
 
     // Action to start VPN settings
-    private static final String ACTION_VPN_SETTINGS = PACKAGE_PREFIX + "SETTINGS";
+    private static final String ACTION_VPN_SETTINGS =
+            PACKAGE_PREFIX + "SETTINGS";
 
     private static final String TAG = VpnManager.class.getSimpleName();
 
@@ -130,9 +140,18 @@
 
     /** Broadcasts the connectivity state of the specified profile. */
     public void broadcastConnectivity(String profileName, VpnState s) {
+        broadcastConnectivity(profileName, s, VPN_ERROR_NO_ERROR);
+    }
+
+    /** Broadcasts the connectivity state with an error code. */
+    public void broadcastConnectivity(String profileName, VpnState s,
+            int error) {
         Intent intent = new Intent(ACTION_VPN_CONNECTIVITY);
         intent.putExtra(BROADCAST_PROFILE_NAME, profileName);
         intent.putExtra(BROADCAST_CONNECTION_STATE, s);
+        if (error != VPN_ERROR_NO_ERROR) {
+            intent.putExtra(BROADCAST_ERROR_CODE, error);
+        }
         mContext.sendBroadcast(intent);
     }
 
diff --git a/vpn/java/android/net/vpn/VpnState.java b/vpn/java/android/net/vpn/VpnState.java
index ebd9364..6e61f9c 100644
--- a/vpn/java/android/net/vpn/VpnState.java
+++ b/vpn/java/android/net/vpn/VpnState.java
@@ -26,8 +26,13 @@
  * {@link DISCONNECTING} and then {@link IDLE}.
  * {@link CANCELLED} is a state when a VPN connection attempt is aborted, and
  * is in transition to {@link IDLE}.
+ * The {@link UNUSABLE} state indicates that the profile is not in a state for
+ * connecting due to possibly the integrity of the fields or another profile is
+ * connecting etc.
+ * The {@link UNKNOWN} state indicates that the profile state is to be
+ * determined.
  * {@hide}
  */
 public enum VpnState {
-    CONNECTING, DISCONNECTING, CANCELLED, CONNECTED, IDLE
+    CONNECTING, DISCONNECTING, CANCELLED, CONNECTED, IDLE, UNUSABLE, UNKNOWN
 }
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 3d65d3c..fa328e8 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -40,7 +40,7 @@
 
     boolean pingSupplicant();
 
-    boolean startScan();
+    boolean startScan(boolean forceActive);
 
     List<ScanResult> getScanResults();
 
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 7a15f27..1f73bec 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -476,9 +476,27 @@
      * on completion of the scan.
      * @return {@code true} if the operation succeeded, i.e., the scan was initiated
      */
-    public boolean  startScan() {
+    public boolean startScan() {
         try {
-            return mService.startScan();
+            return mService.startScan(false);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Request a scan for access points. Returns immediately. The availability
+     * of the results is made known later by means of an asynchronous event sent
+     * on completion of the scan.
+     * This is a variant of startScan that forces an active scan, even if passive
+     * scans are the current default
+     * @return {@code true} if the operation succeeded, i.e., the scan was initiated
+     *
+     * @hide
+     */
+    public boolean startScanActive() {
+        try {
+            return mService.startScan(true);
         } catch (RemoteException e) {
             return false;
         }
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 3851ac0..0799f5f 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -51,7 +51,7 @@
 
     public native static boolean pingCommand();
 
-    public native static boolean scanCommand();
+    public native static boolean scanCommand(boolean forceActive);
     
     public native static boolean setScanModeCommand(boolean setActive);
 
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 2fbc779..3aa31bf 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -239,6 +239,7 @@
     
     private boolean mIsScanModeActive;
     private boolean mIsScanModeSetDueToAHiddenNetwork;
+    private boolean mEnableRssiPolling;
 
     // Wi-Fi run states:
     private static final int RUN_STATE_STARTING = 1;
@@ -338,6 +339,7 @@
     private void setSupplicantState(SupplicantState state) {
         mWifiInfo.setSupplicantState(state);
         updateNetworkInfo();
+        checkPollTimer();
     }
 
     public SupplicantState getSupplicantState() {
@@ -352,6 +354,7 @@
     private void setSupplicantState(String stateName) {
         mWifiInfo.setSupplicantState(stateName);
         updateNetworkInfo();
+        checkPollTimer();
     }
 
     /**
@@ -540,8 +543,10 @@
      * Set the interval timer for polling connection information
      * that is not delivered asynchronously.
      */
-    private synchronized void setPollTimer () {
-        if (!hasMessages(EVENT_POLL_INTERVAL)) {
+    private synchronized void checkPollTimer() {
+        if (mEnableRssiPolling &&
+                mWifiInfo.getSupplicantState() == SupplicantState.COMPLETED &&
+                !hasMessages(EVENT_POLL_INTERVAL)) {
             sendEmptyMessageDelayed(EVENT_POLL_INTERVAL, POLL_STATUS_INTERVAL_MSECS);
         }
     }
@@ -637,6 +642,13 @@
         setBluetoothScanMode(isBluetoothPlaying);
     }
 
+    public void enableRssiPolling(boolean enable) {
+        if (mEnableRssiPolling != enable) {
+            mEnableRssiPolling = enable;
+            checkPollTimer();
+        }
+    }
+
     @Override
     public void releaseWakeLock() {
         if (mReleaseWakeLockCallback != null) {
@@ -1022,9 +1034,7 @@
             case EVENT_POLL_INTERVAL:
                 if (mWifiInfo.getSupplicantState() != SupplicantState.UNINITIALIZED) {
                     requestPolledInfo(mWifiInfo);
-                    if (mWifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
-                        setPollTimer();
-                    }
+                    checkPollTimer();
                 }
                 break;
             
@@ -1121,7 +1131,7 @@
                             } else {
                                 // In some situations, supplicant needs to be kickstarted to
                                 // start the background scanning
-                                WifiNative.scanCommand();
+                                WifiNative.scanCommand(true);
                             }
                         }
                     }
@@ -1163,7 +1173,7 @@
     }
 
     private void configureInterface() {
-        setPollTimer();
+        checkPollTimer();
         mLastSignalLevel = -1;
         if (!mUseStaticIp) {
             if (!mHaveIpAddress && !mObtainingIpAddress) {