am 16502e94: Merge "Allow users to create shortcuts to the VPN settings on the Home Screen."

Merge commit '16502e9479f96e3fc484192e0cd4c852c4fc8ea6' into gingerbread-plus-aosp

* commit '16502e9479f96e3fc484192e0cd4c852c4fc8ea6':
  Allow users to create shortcuts to the VPN settings on the Home Screen.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 1f9ebe4..1c1bb6d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -352,10 +352,10 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="ManageApplications"
+        <activity android:name=".applications.ManageApplications"
                   android:label="@string/manageapplications_settings_title"
                   android:clearTaskOnLaunch="true"
-                  android:configChanges="orientation|keyboardHidden">
+                  android:theme="@android:style/Theme.NoTitleBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.MANAGE_PACKAGE_STORAGE" />
@@ -367,17 +367,25 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="InstalledAppDetails" android:label="@string/application_info_label">
+        <!-- Keep compatibility with old shortcuts. -->
+        <activity-alias android:name=".ManageApplications"
+            android:targetActivity=".applications.ManageApplications"
+            android:exported="true" />
+        
+        <activity android:name=".applications.InstalledAppDetails"
+                android:theme="@android:style/Theme.NoTitleBar"
+                android:label="@string/application_info_label">
             <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
+                <action android:name="android.settings.APPLICATION_DETAILS_SETTINGS" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <data android:scheme="package" />
             </intent-filter>
         </activity>
 
-        <activity android:name="RunningServices"
-                  android:label="@string/runningservices_settings_title"
-                  android:clearTaskOnLaunch="true">
+        <!-- Provide direct entry into manage apps showing running services. -->
+        <activity-alias android:name=".RunningServices"
+                android:label="@string/runningservices_settings_title"
+            android:targetActivity=".applications.ManageApplications">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -385,6 +393,24 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
+        </activity-alias>
+        
+        <!-- Provide direct entry into manage apps showing running services. -->
+        <activity-alias android:name=".applications.StorageUse"
+                android:label="@string/storageuse_settings_title"
+            android:targetActivity=".applications.ManageApplications">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.MONKEY" />
+                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+        </activity-alias>
+        
+        <activity android:name=".applications.RunningServiceDetails"
+                android:theme="@android:style/Theme.NoTitleBar"
+                android:label="@string/runningservicedetails_settings_title">
         </activity>
 
         <activity android:name="SecuritySettings"
@@ -689,13 +715,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".battery_history.BatteryHistory" android:label="@string/battery_history_label">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
-            </intent-filter>
-        </activity>
-
         <activity android:name="Display" android:label="@string/display_label"
                 android:configChanges="fontScale">
             <intent-filter>
@@ -765,6 +784,7 @@
         </activity>
 
         <activity android:name=".fuelgauge.PowerUsageSummary"
+                android:theme="@android:style/Theme.NoTitleBar"
                 android:label="@string/power_usage_summary_title"
                 android:clearTaskOnLaunch="true"
                 >
@@ -777,6 +797,7 @@
         </activity>
 
         <activity android:name=".fuelgauge.PowerUsageDetail"
+                android:theme="@android:style/Theme.NoTitleBar"
                 android:label="@string/details_title">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -784,13 +805,23 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".fuelgauge.BatteryHistoryDetail"
+                android:theme="@android:style/Theme.NoTitleBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <receiver android:name=".widget.SettingsAppWidgetProvider" android:label="@string/gadget_title">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                 <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                 <action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
                 <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
-                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" /> <!-- pick up misc changes -->
+                <action android:name="android.location.PROVIDERS_CHANGED" />
+                <!-- hack: using CLOSE_SYSTEM_DIALOGS to pick up (possible) sync changes -->
+                <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
             </intent-filter>
             <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" />
         </receiver>
diff --git a/res/layout/battery_history.xml b/res/layout/battery_history.xml
deleted file mode 100644
index b46d97b..0000000
--- a/res/layout/battery_history.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/topLayout"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content" />
-
-    <LinearLayout
-        android:id="@+id/graphLayout"
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <Spinner
-            android:id="@+id/typeSpinner"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:entries="@array/battery_history_type_spinner" />
-
-        <Spinner
-            android:id="@+id/whichSpinner"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:entries="@array/battery_history_which_spinner" />
-
-        <ScrollView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" >
-
-        <LinearLayout
-            android:orientation="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" >
-            
-        <TextView
-            android:id="@+id/messageText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_horizontal"
-            android:textSize="17dp"
-            android:visibility="gone" />
-
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button0"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button1"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button2"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button3"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button4"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button5"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button6"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-    
-        <com.android.settings.battery_history.GraphableButton
-            android:id="@+id/button7"
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_marginLeft="4dp"
-            android:layout_marginRight="4dp"
-            android:layout_marginBottom="4dp"
-            android:layout_weight="1" />
-
-        </LinearLayout>
-        </ScrollView>
-
-    </LinearLayout>
-
-    <LinearLayout
-        android:id="@+id/textLayout"
-        android:visibility="gone"
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <ScrollView
-            android:layout_width="match_parent"
-            android:layout_height="match_parent" >
-            <TextView
-                android:id="@+id/detailsText"
-                android:layout_width="match_parent"
-                android:textSize="17dp"
-                android:layout_height="1000dp"/>
-        </ScrollView>
-
-    </LinearLayout>
-
-</LinearLayout>
diff --git a/res/layout/compute_sizes.xml b/res/layout/compute_sizes.xml
deleted file mode 100755
index 4ba5b3e..0000000
--- a/res/layout/compute_sizes.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<ListView 
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@android:id/list"
-    android:drawSelectorOnTop="false"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent" />
diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml
index 3243672..fff1975 100644
--- a/res/layout/installed_app_details.xml
+++ b/res/layout/installed_app_details.xml
@@ -25,7 +25,6 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:paddingRight="6dip"
-        android:paddingTop="5dip"
         android:paddingBottom="5dip"
         android:orientation="vertical">
 
diff --git a/res/layout/manage_applications.xml b/res/layout/manage_applications.xml
new file mode 100755
index 0000000..2716460
--- /dev/null
+++ b/res/layout/manage_applications.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <FrameLayout android:id="@+id/list_container"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone">
+        <ListView android:id="@android:id/list"
+            android:drawSelectorOnTop="false"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+        <TextView android:id="@android:id/empty"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:text="@string/no_applications"
+                android:textAppearance="?android:attr/textAppearanceLarge" />
+    </FrameLayout>
+
+    <view class="com.android.settings.applications.RunningProcessesView"
+            android:id="@+id/running_processes"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone" />
+
+    <LinearLayout android:id="@+id/loading_container"
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone"
+            android:gravity="center">
+
+        <ProgressBar style="?android:attr/progressBarStyleLarge"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+        <TextView android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:text="@string/settings_safetylegal_activity_loading"
+                android:paddingTop="4dip"
+                android:singleLine="true" />
+
+    </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/manage_applications_item.xml b/res/layout/manage_applications_item.xml
index cdf4c9d..c4b0937 100755
--- a/res/layout/manage_applications_item.xml
+++ b/res/layout/manage_applications_item.xml
@@ -31,7 +31,6 @@
     <ImageView android:id="@+id/app_icon"
         android:layout_width="@android:dimen/app_icon_size"
         android:layout_height="@android:dimen/app_icon_size"
-        android:layout_marginLeft="5dip"
         android:layout_marginRight="11dip"
         android:layout_gravity="center_vertical"
         android:scaleType="fitCenter"/>
@@ -48,12 +47,28 @@
             android:singleLine="true"
             android:ellipsize="marquee"
             android:layout_marginBottom="2dip" />
-        <TextView android:id="@+id/app_size"
-            android:layout_marginTop="-4dip"
-            android:layout_gravity="center_vertical"
-            android:layout_width="wrap_content"
+        <LinearLayout
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceSmall" />
+            android:baselineAlignedChildIndex="0" >
+            <TextView android:id="@+id/app_size"
+                android:layout_marginTop="-4dip"
+                android:layout_gravity="center_vertical|left"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:textAppearance="?android:attr/textAppearanceSmall" />
+            <TextView android:id="@+id/app_disabled"
+                android:layout_marginTop="-4dip"
+                android:layout_gravity="center_vertical|right"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:visibility="gone"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:text="@string/disabled" />
+        </LinearLayout>
     </LinearLayout>
 </LinearLayout>
 
diff --git a/res/layout/preference_batteryhistory.xml b/res/layout/preference_batteryhistory.xml
new file mode 100644
index 0000000..53dce74
--- /dev/null
+++ b/res/layout/preference_batteryhistory.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<com.android.settings.fuelgauge.BatteryHistoryChart
+        xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical"
+    android:id="@+android:id/battery_history_chart"
+    android:paddingRight="?android:attr/scrollbarSize"
+    android:textAppearance="?android:attr/textAppearanceMedium"
+    android:shadowRadius="4"
+    android:shadowColor="?android:attr/colorBackground"
+    android:shadowDx="2"
+    android:shadowDy="2">
+</com.android.settings.fuelgauge.BatteryHistoryChart>
diff --git a/res/layout/running_services_item.xml b/res/layout/running_processes_item.xml
similarity index 70%
rename from res/layout/running_services_item.xml
rename to res/layout/running_processes_item.xml
index f8a0c97..dacee9e 100644
--- a/res/layout/running_services_item.xml
+++ b/res/layout/running_processes_item.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 /*
-** Copyright 2008, The Android Open Source Project
+** Copyright 2010, The Android Open Source Project
 **
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
@@ -24,11 +24,6 @@
     android:orientation="vertical"
     android:gravity="fill" >
 
-    <ImageView android:id="@+id/separator"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:src="?android:attr/listDivider"/>
-    
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -41,7 +36,6 @@
         <ImageView android:id="@+id/icon"
             android:layout_width="@android:dimen/app_icon_size"
             android:layout_height="@android:dimen/app_icon_size"
-            android:layout_marginLeft="5dip"
             android:layout_marginRight="11dip"
             android:layout_gravity="center_vertical"
             android:scaleType="fitCenter"/>
@@ -55,15 +49,16 @@
                 android:baselineAlignedChildIndex="0"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content">
-	            <TextView android:id="@+id/name"
-	                android:layout_width="wrap_content"
-	                android:layout_height="wrap_content"
+                <TextView android:id="@+id/name"
+                    android:layout_width="0px"
+                    android:layout_height="wrap_content"
                     android:layout_weight="1"
-	                android:textAppearance="?android:attr/textAppearanceMedium"
-	                android:textStyle="bold"
-	                android:singleLine="true"
-	                android:ellipsize="marquee"
-	                android:layout_marginBottom="2dip" />
+                    android:paddingRight="4dip"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:textStyle="bold"
+                    android:singleLine="true"
+                    android:ellipsize="marquee"
+                    android:layout_marginBottom="2dip" />
                 <TextView android:id="@+id/size"
                     android:layout_gravity="center_vertical|right"
                     android:layout_width="wrap_content"
@@ -72,15 +67,28 @@
                     android:singleLine="true"
                     android:textAppearance="?android:attr/textAppearanceSmall" />
             </LinearLayout>
+            <LinearLayout
+                android:orientation="horizontal"
+                android:baselineAlignedChildIndex="0"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content">
                 <TextView android:id="@+id/description"
-                    android:layout_marginTop="-4dip"
                     android:layout_gravity="center_vertical|left"
-                    android:layout_width="wrap_content"
+                    android:layout_width="0px"
                     android:layout_height="wrap_content"
+                    android:layout_weight="1"
                     android:paddingRight="4dip"
                     android:singleLine="true"
                     android:ellipsize="marquee"
                     android:textAppearance="?android:attr/textAppearanceSmall" />
+                <TextView android:id="@+id/uptime"
+                    android:layout_gravity="center_vertical|right"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="0"
+                    android:singleLine="true"
+                    android:textAppearance="?android:attr/textAppearanceSmall" />
+            </LinearLayout>
         </LinearLayout>
     </LinearLayout>
 </LinearLayout>
diff --git a/res/layout/running_services.xml b/res/layout/running_processes_view.xml
similarity index 64%
rename from res/layout/running_services.xml
rename to res/layout/running_processes_view.xml
index 5c0da6f..6810ba0 100644
--- a/res/layout/running_services.xml
+++ b/res/layout/running_processes_view.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- 
- * Copyright (C) 2008 Google Inc.
+ * Copyright (C) 2010 Google Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,26 +16,26 @@
  -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	    android:layout_width="match_parent"
-	    android:layout_height="match_parent"
-	    android:orientation="vertical">
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
     <FrameLayout
-		    android:layout_width="match_parent"
-		    android:layout_height="0px"
-		    android:layout_weight="1">
-	    <ListView android:id="@android:id/list"
-	            android:layout_width="match_parent" 
-	            android:layout_height="match_parent"
-	            android:drawSelectorOnTop="false"
-	            android:fastScrollEnabled="true" />
-	    <TextView android:id="@android:id/empty"
-	            android:layout_width="match_parent"
-	            android:layout_height="match_parent"
-	            android:gravity="center"
-	            android:text="@string/no_running_services"
-	            android:textAppearance="?android:attr/textAppearanceLarge" />
+            android:layout_width="match_parent"
+            android:layout_height="0px"
+            android:layout_weight="1">
+        <ListView android:id="@android:id/list"
+                android:layout_width="match_parent" 
+                android:layout_height="match_parent"
+                android:drawSelectorOnTop="false"
+                android:fastScrollEnabled="true" />
+        <TextView android:id="@android:id/empty"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                android:text="@string/no_running_services"
+                android:textAppearance="?android:attr/textAppearanceLarge" />
     </FrameLayout>
-    <view class="com.android.settings.RunningServices$LinearColorBar"
+    <view class="com.android.settings.applications.RunningProcessesView$LinearColorBar"
             android:id="@+id/color_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/res/layout/running_service_details.xml b/res/layout/running_service_details.xml
new file mode 100644
index 0000000..98c144c
--- /dev/null
+++ b/res/layout/running_service_details.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <LinearLayout
+        android:id="@+id/all_details"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <!-- Summary information as per previous screen -->
+        <include
+            layout="@layout/running_processes_item"
+            android:id="@+id/snippet"/>
+
+    </LinearLayout>
+</ScrollView>
+
diff --git a/res/layout/running_service_details_process.xml b/res/layout/running_service_details_process.xml
new file mode 100644
index 0000000..d12b486
--- /dev/null
+++ b/res/layout/running_service_details_process.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    
+    <!-- Icon and label of the service. -->
+    <include
+        layout="@layout/running_processes_item"
+        android:id="@+id/service"/>
+
+    <TextView android:id="@+id/comp_description"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:paddingLeft="14dip"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+</LinearLayout>
diff --git a/res/layout/running_service_details_service.xml b/res/layout/running_service_details_service.xml
new file mode 100644
index 0000000..b9f9bbe
--- /dev/null
+++ b/res/layout/running_service_details_service.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <!--    
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:src="?android:attr/listDivider"/>
+    -->
+        
+    <!-- Icon and label of the service. -->
+    <include
+        layout="@layout/running_processes_item"
+        android:id="@+id/service"/>
+
+    <TextView android:id="@+id/comp_description"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:paddingLeft="14dip"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <include
+        layout="@layout/two_buttons_panel"
+        android:id="@+id/control_buttons_panel"/>
+
+</LinearLayout>
diff --git a/res/layout/separator_label.xml b/res/layout/separator_label.xml
new file mode 100644
index 0000000..b0e69fa
--- /dev/null
+++ b/res/layout/separator_label.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** 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.
+*/
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    style="?android:attr/listSeparatorTextViewStyle" />
diff --git a/res/values-cs/arrays.xml b/res/values-cs/arrays.xml
index e91ac4b..00e605e 100644
--- a/res/values-cs/arrays.xml
+++ b/res/values-cs/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nikdy, je-li zapnuto napájení"</item>
     <item msgid="1986753720941888596">"Nikdy"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Využití CPU"</item>
-    <item msgid="6401018715947316517">"Využití sítě"</item>
-    <item msgid="188092590354892392">"Využití GPS"</item>
-    <item msgid="8414109131222049141">"Využití senzoru"</item>
-    <item msgid="1327904325081257093">"Použití při částečném probuzení"</item>
-    <item msgid="4832254146664706277">"Další využití"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Od posledního odpojení"</item>
-    <item msgid="166936313535197598">"Celkem od spuštění"</item>
-    <item msgid="4793941382744963893">"Celkem za celou dobu"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Doba použití"</item>
     <item msgid="1908750532762193304">"Počet spuštění"</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 398d49e..4a18c36 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Zvolit činnost"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Info o zařízení"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Info o baterii"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Historie baterie"</string>
     <string name="display_label" msgid="7403874003169865762">"Zobrazení"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Info o telefonu"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Karta SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Určit, kdy přepnout ze sítě Wi-Fi na mobilní datový přenos"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Při nastavení zásad pro režim spánku došlo k problému."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Adresa MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Adresa IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Nastavení adresy IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Uložit"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Zrušit"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Zobrazuje polohu v aplikacích (jako Mapy) pomocí bezdrátových sítí"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Poloha je zaměřena pomocí WiFi nebo mobilních sítí"</string>
     <string name="location_gps" msgid="6296125378829097831">"Použít satelity GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Zaměření je s přesností na úrovni ulic (zrušením této volby lze šetřit baterii)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Zaměření je s přesností na úrovni ulic."</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Umožňuje zaměřit na úrovni ulic (vetší spotřeba baterie a nutný výhled na oblohu)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Použít systém A-GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Vylepšit funkčnost GPS pomocí serveru (deaktivací této funkce snížíte využití sítě)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplikace"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Data"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Odinstalovat"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Vypnout"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Povolit"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Mazání dat"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Odinstalovat aktualizace"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Aplikace byla nastavena, aby se pro některé akce spouštěla jako výchozí."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Není výchozí pro žádné akce."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Vymazat výchozí nastavení"</string>
     <string name="unknown" msgid="1592123443519355854">"Neznámé"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Řadit"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Seřadit dle jména"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Řadit podle velikosti"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Správa paměti"</string>
     <string name="filter" msgid="2018011724373033887">"Filtrovat"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Stažené"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Spuštěné"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Na kartě SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Načítání..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Deaktivováno"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Žádné aplikace."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Přepočítávání velikosti..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Smazat"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Veškerá data (všechny soubory, nastavení, účty, databáze apod.) této aplikace budou trvale vymazána."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Zadané místo pro instalaci není platné."</string>
     <string name="system_package" msgid="1030561474413022831">"Aktualizace systému nelze nainstalovat na externí média."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Vynutit zastavení"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Tato aplikace bude okamžitě restartována. Opravdu chcete vynutit její zastavení?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Vynucené zastavení může způsobit nepředvídatelné chování aplikace. Jste si jisti?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Přesun aplikace"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Přesunutí aplikace se nezdařilo. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Preferované umístění pro instalaci"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Změna preferovaného umístění pro instalaci nových aplikací"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Využití úložiště"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Spuštěné služby"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Probíhá restartování"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Žádné spuštěné služby"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Zastavit službu?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Služba zůstane vypnutá, dokud nebude znovu spuštěna. To může mít nežádoucí vliv na aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Zastavit"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Zrušit"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Spuštěno aplikací: dotykem zastavíte"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: spravovat dotykem"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"K dispozici: <xliff:g id="FREE">%2$s</xliff:g> + <xliff:g id="MEMORY">%3$s</xliff:g> v <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Ostatní: <xliff:g id="MEMORY">%2$s</xliff:g> v <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proces: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Nic není spuštěno."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Spuštěno aplikací."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"volné: <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"používáno <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"Počet procesů: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; počet služeb: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"Počet procesů: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; počet služeb: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"Počet procesů: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; počet služeb: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"Počet procesů: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; počet služeb: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Spuštěná aplikace"</string>
+    <string name="no_services" msgid="7133900764462288263">"Neaktivní"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Služby"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Procesy"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Zastavit"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Nastavení"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Tato služba byla spuštěna svou aplikací. Pokud ji zastavíte, může dojít k selhání aplikace."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Tuto aplikaci nelze bezpečně zastavit. Mohlo by dojít ke ztrátě části vaší aktuální práce."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: právě se používá. Ovládací prvky zobrazte dotykem na Nastavení."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Hlavní proces, který se používá."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Služba <xliff:g id="COMP_NAME">%1$s</xliff:g> se používá."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Poskytovatel <xliff:g id="COMP_NAME">%1$s</xliff:g> se používá."</string>
     <string name="language_settings" msgid="502219872342167227">"Jazyk a klávesnice"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Nastavení jazyka a klávesnice"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Nastavení jazyka a oblasti, způsobu zadávání textu a automatických oprav"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testování"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Info o telefonu"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Info o baterii"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Historie baterie"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Rychlé spuštění"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Umožňuje nastavit klávesové zkratky pro spouštění aplikací"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Přiřadit aplikaci"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Ladění USB je určeno pouze pro účely vývoje. Lze pomocí něho kopírovat data mezi počítačem a zařízením, instalovat aplikace do zařízení bez upozornění a číst data protokolů."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Zvolte gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Zvolte widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Podrobnosti pro UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Podrobnosti o používání sítě aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Přijato bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Odesláno bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Celkem bytů: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Podrobnosti o využívání CPU aplikací <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Čas uživatele:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systémový čas:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Celková doba:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Počet spuštění: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> dní <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> min <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Balíčky sdílející toto UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Údaje o využití baterie nejsou k dispozici"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Senzor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Částečný zámek probuzení:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Senzor je používán následujícími balíčky:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Použito <xliff:g id="COUNT">%1$d</xliff:g>krát balíčkem <xliff:g id="PACKAGE">%2$s</xliff:g>\n"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Použito <xliff:g id="COUNT">%1$d</xliff:g>krát některým z následujících:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Spuštěné"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Obrazovka zapnutá"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon zapnutý"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Doba bez režimu spánku:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Doba se zapnutou obrazovkou:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Doba se zapnutým telefonem:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Na baterii:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Připojeno:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Statistika použití"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Statistika použití"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Řadit podle:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Co využívá baterii"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Využití baterie od odpojení"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Využití baterie od obnovení"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"doba provozu na baterii: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> od odpojení"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Nabíjení"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Obrazovka zapnutá"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS aktivní"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Probudit"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Signál telefonu"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Doba provozu zařízení"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefon v pohotovostním režimu"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Doba provozu procesoru"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU v popředí"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Zakázat režim spánku"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Odeslaná data"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Využití baterie technologií Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Vypněte technologii Bluetooth, když ji nepoužíváte."</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Zkuste se připojit k jinému zařízení bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Využití baterie spuštěnými aplikacemi"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Spotřeba energie podle aplikací"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Ukončete aplikaci nebo ji odinstalujte"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Nepoužíváte-li systém GPS, vypněte jej."</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"GPS můžete ručně nastavit, aby jej aplikace nemohly používat."</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Tato aplikace může nabízet nastavení pro snížení využití baterie"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> od odpojení"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Při posledním odpojení pro <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Není nainstalováno"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Žena"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Muž"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Ovládací prvek napájení"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Probíhá aktualizace nastavení Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Probíhá aktualizace nastavení Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Úložiště pověření je vymazáno."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Úložiště pověření je aktivováno."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Úložiště pověření je deaktivováno."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Systém souborů EFS (Encrypted File System)"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Šifrovat soukromá uživatelská data"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Aktivovat v tomto zařízení úložiště pro soukromá uživatelská data, které využívá šifrovaný systém souborů "</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Aktivace systému souborů EFS vyžaduje vymazání dat ze zařízení."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Deaktivace systému souborů EFS vyžaduje vymazání dat ze zařízení."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Povolit"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Vypnout"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Zrušit"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Změna režimu systému souborů EFS byla zrušena."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Upozornění systému souborů EFS."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tísňové vyzvánění"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Nastavit chování při tísňovém volání"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Ochrana osobních údajů"</string>
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index 567e194..97b1cc3 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Aldrig når tilsluttet"</item>
     <item msgid="1986753720941888596">"Aldrig"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU-brug"</item>
-    <item msgid="6401018715947316517">"Netværksbrug"</item>
-    <item msgid="188092590354892392">"GPS-brug"</item>
-    <item msgid="8414109131222049141">"Sensorbrug"</item>
-    <item msgid="1327904325081257093">"Delvis vågen brug"</item>
-    <item msgid="4832254146664706277">"Anden brug"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Siden sidste afbrydelse"</item>
-    <item msgid="166936313535197598">"I alt siden start"</item>
-    <item msgid="4793941382744963893">"I alt hele tiden"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Brugstid"</item>
     <item msgid="1908750532762193304">"Start optælling"</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 3a139e1..a519313 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Vælg aktivitet"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Enhedsoplysninger"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Batterioplysninger"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Batterioversigt"</string>
     <string name="display_label" msgid="7403874003169865762">"Visning"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefonoplysninger"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD-kort"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Angiv, hvornår der skal skiftes fra Wi-Fi til mobile data"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Der opstod et problem med indstillingen af dvalepolitikken."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC-adresse"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-adresse"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP-indstillinger"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Gem"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Annuller"</string>
@@ -411,7 +411,7 @@
     <string name="vibrate_summary" msgid="7378130397830790458">"Vibration ved opkald og underretninger"</string>
     <string name="notification_sound_title" msgid="6316316069880531693">"Ringetone for meddelelser"</string>
     <string name="notification_sound_summary" msgid="2953599929394109819"></string>
-    <string name="notification_pulse_title" msgid="1247988024534030629">"Blinkende underretningslys"</string>
+    <string name="notification_pulse_title" msgid="1247988024534030629">"Blinkende meddelelseslys"</string>
     <string name="notification_pulse_summary" msgid="6899220780534617152">"Gentagne lysblink i trackball ved nye meddelelser"</string>
     <string name="incoming_call_volume_title" msgid="8073714801365904099">"Ringetone"</string>
     <string name="notification_volume_title" msgid="2012640760341080408">"Meddelelse"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Se placering i programmer (som f.eks. Maps) ved hjælp af trådløse netværk"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Placering afgøres af Wi-Fi og/eller mobilnetværk"</string>
     <string name="location_gps" msgid="6296125378829097831">"Brug GPS-satellitter"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Præcis placering på gadeplan (slå fra for at spare på batteriet)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Præcis placering på gadeplan"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Placering på gadeplan (mere batterikrævende, skal bruges i det fri)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Brug assisteret GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Brug serveren til at assistere GPS (fjern markering for at mindske netværksforbrug)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Program"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Data"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Afinstaller"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Deaktiver"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Aktiver"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Ryd data"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Afinstaller opdateringer"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Du har valgt at starte dette program som standard for nogle handlinger."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Der er ikke angivet nogen standarder."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Ryd standarder"</string>
     <string name="unknown" msgid="1592123443519355854">"Ukendte"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sorter"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Sorter efter navn"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Sorter efter størrelse"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Administrer plads"</string>
     <string name="filter" msgid="2018011724373033887">"Filter"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Overført"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Kørende"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"På SD-kort"</string>
-    <string name="loading" msgid="3200408047793887917">"Indlæser ..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Deaktiveret"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Ingen programmer."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Beregner størrelse igen ..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Slet"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Alle dette programs data slettes permanent. Det omfatter alle filer, indstillinger, konti, databaser osv."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Den angivne sti til installation er ikke gyldig."</string>
     <string name="system_package" msgid="1030561474413022831">"Systemopdateringerne kan ikke installeres på eksterne medier."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Tving til at standse"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Dette program bliver genstartet med det samme. Er du sikker på, at du vil tvangsstandse?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"At tvinge et program til at stoppe kan medføre, at det ikke fungerer korrekt. Er du sikker?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Flyt program"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Programmet kunne ikke flyttes. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Foretrukken installationsplacering"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Skift den foretrukne installationsplacering for nye programmer."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Lagerforbrug"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Kørende tjenester"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Vis og kontroller kørende tjenester"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Genstarter"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Der er ingen kørende tjenester"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Stop tjeneste?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Denne tjeneste kører ikke, før den startes igen. Det kan have uønskede konsekvenser for programmet <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Stop"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Annuller"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Startet af program: tryk for at stoppe"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: tryk for at administrere"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Ledig: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> i <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Andre: <xliff:g id="MEMORY">%2$s</xliff:g> i <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proces: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Intet kører."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Startet af program."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> ledig"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> i brug"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proces og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjeneste"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proces og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjenester"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processer og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjeneste"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processer og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjenester"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Program i gang"</string>
+    <string name="no_services" msgid="7133900764462288263">"Ikke aktiv"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Tjenester"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processer"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Stop"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Indstillinger"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Denne tjeneste er startet af dens program. Hvis du stopper den, mislykkes programmet."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Dette program kan ikke stoppes på en sikker måde. Det kan slette noget af dit seneste arbejde."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: aktuelt i brug. Tryk på Indstillinger for at håndtere."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Den hovedproces, der er i brug."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Tjenesten <xliff:g id="COMP_NAME">%1$s</xliff:g> er i brug."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Udbyderen <xliff:g id="COMP_NAME">%1$s</xliff:g> er i brug."</string>
     <string name="language_settings" msgid="502219872342167227">"Sprog og tastatur"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Indstillinger for sprog og tastatur"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Angiv landestandard (sprog og område), tekstinput…"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Tester"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefonoplysninger"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Batterioplysninger"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Batterioversigt"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Hurtig start"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Angiv tastaturgenveje til start af programmer"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Tildel program"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB-fejlretning er kun beregnet til udvikling og kan bruges til at kopiere data mellem din computer og enheden, installere programmer på enheden uden meddelelser og læse logdata."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Vælg gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Vælg widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detaljer for UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Netværksbrugsdetaljer for <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Modtagne bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Sendte bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Bytes i alt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"CPU-brugsdetaljer for <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Brugertid:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systemtid:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tid i alt:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Start: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>t <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>t <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>S"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pakker, der deler denne UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Der er ingen tilgængelige batteribrugsdata"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Delvis Wakelock:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor brugt af pakker:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Brugt <xliff:g id="COUNT">%1$d</xliff:g> gange af <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Brugt <xliff:g id="COUNT">%1$d</xliff:g> gange af en af:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Kørende"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Skærm til"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon til"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tid brugt uden dvale:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tid brugt med skærmen tændt:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tid brugt med telefonen tændt:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"På batteri:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Tilsluttet:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Brugerstatistikker"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Brugerstatistikker"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sorter efter:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Hvad der har brugt batteriet"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Batteriforbrug siden afbrydelse"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Batteriforbrug siden nulstilling"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> på batteri"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> siden afbrydelse"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Oplader"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Skærm til"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS slået til"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktiv"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefonsignal"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Enhedens opvågningstid"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefonen er ikke aktiv"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU i alt"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU forgrund"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Hold aktiv"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Data sendt"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batteri brugt af Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Slå Bluetooth fra, når du ikke bruger det"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Prøv at oprette forbindelse til en anden Bluetooth-enhed"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batteri brugt af programmer, når de kører"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batteri brugt af program"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Stop eller afinstaller programmet"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Slå GPS fra, når den ikke bruges"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Administrer GPS manuelt for at forhindre programmet i at bruge den"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Dette program har muligvis indstillinger, der kan mindske batteriforbruget"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> siden afbrydelse"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Siden sidste afbrydelse for <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Ikke installeret"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Kvinde"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Mand"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Strømkontrol"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Opdaterer indstillinger for Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Opdaterer Bluetooth-indstilling"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Oplysningslagringen er slettet."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Oplysningslagring er aktiveret."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Oplysningslagring er deaktiveret."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Krypteret filsystem"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Krypter private brugerdata"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Aktiver krypteret filsystemlager for private brugerdata på denne enhed"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Aktivering af krypterede filsystemer kræver en enhedsdatasletter."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Deaktivering af krypterede filsystemer kræver en enhedsdatasletter."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Aktivér"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Deaktiver"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Annuller"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Ændring af tilstand for krypterede filsystemer blev anulleret."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Advarsel for krypterede filsystemer."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Nødtone"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Angiv adfærd ved nødopkald"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Fortrolighed"</string>
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index b8e9fc0..a72b6c7 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Niemals, wenn im Netzbetrieb"</item>
     <item msgid="1986753720941888596">"Niemals"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU-Verwendung"</item>
-    <item msgid="6401018715947316517">"Netzwerknutzung"</item>
-    <item msgid="188092590354892392">"GPS-Verwendung"</item>
-    <item msgid="8414109131222049141">"Sensornutzung"</item>
-    <item msgid="1327904325081257093">"Verwendung im Teilwachzustand"</item>
-    <item msgid="4832254146664706277">"Andere Verwendung"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Seit dem letzten Ausstecken"</item>
-    <item msgid="166936313535197598">"Seit Start insgesamt"</item>
-    <item msgid="4793941382744963893">"Insgesamt in Gesamtzeit"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Nutzungszeit"</item>
     <item msgid="1908750532762193304">"Startzähler"</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 28fe013..43a6520 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Aktion auswählen"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Geräteinfo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Akkuinfo"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Akkuprotokoll"</string>
     <string name="display_label" msgid="7403874003169865762">"Display"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefoninfo"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD-Karte"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Festlegen, wann von WLAN auf mobile Daten umgeschaltet werden soll"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Beim Einrichten der Standby-Richtlinie ist ein Problem aufgetreten."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC-Adresse"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-Adresse"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP-Einstellungen"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Speichern"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Abbrechen"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Standort über Drahtlosnetzwerke bestimmen (z. B. in Google Maps)"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Standort bestimmt von WLAN und/oder mobilen Netzwerken"</string>
     <string name="location_gps" msgid="6296125378829097831">"GPS-Satelliten"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Auf Straßenebene lokalisieren (deaktivieren, um Akku zu sparen)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Genau auf Straßenebene lokalisieren"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Auf Straßenebene lokalisieren (höherer Akkuverbrauch, im Freien)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Unterstütztes GPS verwenden"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Server zur Unterstützung von GPS verwenden (zur Verringerung der Netzwerkauslastung nicht auswählen)"</string>
@@ -629,7 +629,7 @@
     <string name="settings_safetylegal_title" msgid="1289483965535937431">"Sicherheitsinformationen"</string>
     <string name="settings_safetylegal_activity_title" msgid="6901214628496951727">"Sicherheitsinformationen"</string>
     <string name="settings_safetylegal_activity_unreachable" msgid="3198912875259612887">"Ihr Telefon ist mit keinem Datendienst verbunden. Um diese Informationen jetzt anzuzeigen, rufen Sie %s von einem beliebigen, mit dem Internet verbundenen Computer auf."</string>
-    <string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Ladevorgang läuft..."</string>
+    <string name="settings_safetylegal_activity_loading" msgid="8059022597639516348">"Wird geladen..."</string>
     <string name="lockpassword_choose_your_password_header" msgid="8624900666929394990">"Passwort auswählen"</string>
     <string name="lockpassword_choose_your_pin_header" msgid="7598849519816138302">"PIN auswählen"</string>
     <string name="lockpassword_confirm_your_password_header" msgid="6308478184889846633">"Passwort bestätigen"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Anwendung"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Daten"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Deinstallieren"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Deaktivieren"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Aktivieren"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Daten löschen"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Updates deinstallieren"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Sie haben diese Anwendung für einige Aktionen als Standard festgelegt."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Kein Standard"</string>
     <string name="clear_activities" msgid="7408923511535174430">"Standardeinstellung löschen"</string>
     <string name="unknown" msgid="1592123443519355854">"Unbekannt"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sortieren"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Nach Namen sortieren"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Nach Größe sortieren"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Speicherplatz verwalten"</string>
     <string name="filter" msgid="2018011724373033887">"Filter"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Heruntergeladen"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Wird ausgeführt"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Auf SD-Karte"</string>
-    <string name="loading" msgid="3200408047793887917">"Wird geladen..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Deaktiviert"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Keine Anwendungen"</string>
     <string name="recompute_size" msgid="7722567982831691718">"Größe wird neu berechnet..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Löschen"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"All diese Anwendungsdaten werden dauerhaft gelöscht. Dazu zählen alle Dateien, Einstellungen, Konten, Datenbanken und so weiter."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Der angegebene Installationsort ist nicht gültig."</string>
     <string name="system_package" msgid="1030561474413022831">"Systemupdates können nicht auf externen Datenträgern installiert werden."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Stoppen erzwingen"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Diese Anwendung wird sofort neu gestartet. Möchten Sie das Beenden wirklich erzwingen?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Das Anhalten einer Anwendung kann zu unerwünschtem Verhalten führen. Sind Sie sicher?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Anwendung verschieben"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Verschieben der Anwendung fehlgeschlagen. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Bevorzugter Installationspfad"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Bevorzugten Installationspfad für neue Anwendungen ändern"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Speichernutzung"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktive Dienste"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Derzeit ausgeführte Dienste anzeigen und steuern"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Neustart wird durchgeführt."</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Es werden keine Dienste ausgeführt."</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Dienst beenden?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Der Dienst muss neu gestartet werden. Dies kann unerwünschte Auswirkungen auf die Anwendung \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" haben."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Beenden"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Abbrechen"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Gestartet: Zum Beenden berühren"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: Zum Verwalten berühren"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Verfügbar: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Sonstige: <xliff:g id="MEMORY">%2$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Prozess: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Nichts wird ausgeführt."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Von der Anwendung gestartet."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> verfügbar"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> wird verwendet"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> Prozess und <xliff:g id="NUMSERVICES">%2$d</xliff:g> Dienst"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> Prozess und <xliff:g id="NUMSERVICES">%2$d</xliff:g> Dienste"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> Prozesse und <xliff:g id="NUMSERVICES">%2$d</xliff:g> Dienst"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> Prozesse und <xliff:g id="NUMSERVICES">%2$d</xliff:g> Dienste"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Laufende Anwendung"</string>
+    <string name="no_services" msgid="7133900764462288263">"Nicht aktiv"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Dienste"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Prozesse"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Beenden"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Einstellungen"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Dieser Dienst wurde von seiner Anwendung gestartet. Wird er beendet, kann die Anwendung eventuell nicht mehr ausgeführt werden."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Diese Anwendung kann nicht sicher beendet werden. Beim Beenden könnten aktuelle Daten verloren gehen."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: wird derzeit verwendet. Berühren Sie zum Steuern die Einstellungen."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Hauptprozess, der verwendet wird."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Dienst <xliff:g id="COMP_NAME">%1$s</xliff:g> wird verwendet."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Anbieter <xliff:g id="COMP_NAME">%1$s</xliff:g> wird verwendet."</string>
     <string name="language_settings" msgid="502219872342167227">"Sprache &amp; Tastatur"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Einstellungen für Sprache &amp; Tastatur"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Optionen für Sprache und Region, Texteingabe und Autokorrektur festlegen"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Test"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefoninformation"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Akkuinformationen"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Akkuprotokoll"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Schnellstart"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Tastenkombinationen zum Starten von Anwendungen festlegen"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Anwendung zuweisen"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB-Debugging ist nur für Entwicklungszwecke vorgesehen. Damit können Sie Daten zwischen Ihrem Computer und Ihrem Gerät kopieren, Anwendungen auf Ihrem Gerät ohne Benachrichtigung installieren und Protokolldaten lesen."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Gadget auswählen"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Widget auswählen"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Details für UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Netzwerk-Nutzungsdetails für <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Empfangene Bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Gesendete Bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Bytes insgesamt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"CPU-Nutzungsdetails für <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Nutzerzeit:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systemzeit:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Gesamtzeit:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Startet: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> m <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pakete, die diese UID teilen:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Keine Akku-Nutzungsdaten verfügbar"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Sperre im Teilwachzustand:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor verwendet von Paketen:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="COUNT">%1$d</xliff:g> mal von <xliff:g id="PACKAGE">%2$s</xliff:g> verwendet"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"<xliff:g id="COUNT">%1$d</xliff:g> mal von einem der folgenden verwendet:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Wird ausgeführt"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Bildschirm aktiviert"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon aktiviert"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Zeit ohne Schlafmodus:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Zeit mit Display eingeschaltet:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Zeit mit eingeschaltetem Telefon:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Auf Akku:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Eingesteckt:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Nutzungsstatistik"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Nutzungsstatistik"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sortieren nach:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Was zum Akkuverbrauch beiträgt"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Akkuverbrauch seit dem Ausstecken"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Akkuverbrauch seit dem Zurücksetzen"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> auf Akku"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> seit dem Ausstecken"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Wird geladen"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Bildschirm aktiviert"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS aktiviert"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WLAN"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktiv"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefonsignal"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Aktivzeit des Geräts"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefon inaktiv"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU insgesamt"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU Vordergrund"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Aktiv lassen"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Gesendete Daten"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Akkuverbrauch durch Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Bluetooth bei Nichtverwendung deaktivieren"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Mit einem anderen Bluetooth-Gerät verbinden"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Akkuverbrauch durch ausgeführte Anwendungen"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Akkuverbrauch durch Anwendung"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Anwendung beenden oder deinstallieren"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"GPS bei Nichtverwendung deaktivieren"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"GPS manuell steuern, damit Anwendung es nicht verwenden kann"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Die Anwendung bietet unter Umständen Einstellungen für einen geringeren Akkuverbrauch."</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> seit dem Ausstecken"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Seit dem letzten Ausstecken für <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Nicht installiert"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Weiblich"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Männlich"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Energiesteuerung"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Aktualisieren der WLAN-Einstellung"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Aktualisieren der Bluetooth-Einstellung"</string>
@@ -1069,6 +1074,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Der Anmeldeinformationsspeicher wurde gelöscht."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Der Anmeldeinformationsspeicher ist aktiviert."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Der Anmeldeinformationsspeicher ist deaktiviert."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Encrypted File System"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Private Nutzerdaten verschlüsseln"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Encrypted File System-Speicherung für private Nutzerdaten auf diesem Gerät aktivieren"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Für das Aktivieren von Encrypted File Systems müssen die Gerätedaten zurückgesetzt werden."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Für das Deaktivieren von Encrypted File Systems müssen die Gerätedaten zurückgesetzt werden."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Aktivieren"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Deaktivieren"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Abbrechen"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Encrypted File Systems-Modusänderung abgebrochen"</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Encrypted File Systems-Warnung"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Notfallsignal"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Verhalten bei einem Notruf festlegen"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Datenschutz"</string>
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index 5ffc387..4e8d75a 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Ποτέ όταν είναι συνδεδεμένο"</item>
     <item msgid="1986753720941888596">"Ποτέ"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Χρήση CPU"</item>
-    <item msgid="6401018715947316517">"Χρήση δικτύου"</item>
-    <item msgid="188092590354892392">"Χρήση GPS"</item>
-    <item msgid="8414109131222049141">"Χρήση αισθητήρα"</item>
-    <item msgid="1327904325081257093">"μερική χρήση αφύπνισης"</item>
-    <item msgid="4832254146664706277">"Άλλη χρήση"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Από την τελευταία φορά που αποσυνδέθηκε"</item>
-    <item msgid="166936313535197598">"Συνολικά από την εκκίνηση"</item>
-    <item msgid="4793941382744963893">"Συνολικά για όλο το χρονικό διάστημα"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Χρόνος χρήσης"</item>
     <item msgid="1908750532762193304">"Εκκίνηση καταμέτρησης"</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 4d8a769..440d5da 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Επιλογή δραστηριότητας"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Πληροφορίες συσκευής"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Πληροφορίες μπαταρίας"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Ιστορικό μπαταρίας"</string>
     <string name="display_label" msgid="7403874003169865762">"Προβολή"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Πληροφορίες τηλεφώνου"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Κάρτα SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Ορισμός εναλλαγής από δεδομένα Wi-Fi σε δεδομένα κινητού"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Παρουσιάστηκε ένα πρόβλημα κατά τη ρύθμιση της πολιτικής κατάστασης αδράνειας."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Διεύθυνση MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Διεύθυνση IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Ρυθμίσεις IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Αποθ/ση"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Ακύρωση"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Προβ.τοποθ.σε εφαρμ.(όπως π.χ. στους Χάρτες) με χρήση ασύρ.δικτ."</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Η τοποθ.προσδ.από δίκτ.Wi-Fi και/ή δίκτ.κινητ.τηλεφ."</string>
     <string name="location_gps" msgid="6296125378829097831">"Χρήση δορυφόρων GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Κατά την εύρεση τοποθεσίας, η ακρίβεια είναι σε επίπεδο δρόμου (αποεπιλογή για εξοικονόμηση μπαταρίας)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Κατά την εύρεση τοποθεσίας, η ακρίβεια είναι σε επίπεδο δρόμου"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Εντοπ.σε επίπ.δρόμου (απαιτ.μεγ.καταν.μπαταρ.και μετάβ.σε ανοικτό χώρο)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Χρήση υποβοηθούμενου GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Χρήση διακομιστή για βοήθεια GPS (αποεπιλογή για να μειώσετε τη χρήση του δικτύου)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Εφαρμογή"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Δεδομένα"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Κατάργηση εγκατάστασης"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Απενεργοποίηση"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Ενεργοποίηση"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Εκκαθάριση δεδομένων"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Κατάργηση εγκατάστασης ενημερώσεων"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Επιλέξατε την εκτέλεση αυτής της εφαρμογής από προεπιλογή για ορισμένες ενέργειες."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Δεν έχουν οριστεί προεπιλογές."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Εκκαθάριση προεπιλογών"</string>
     <string name="unknown" msgid="1592123443519355854">"Άγνωστο"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Ταξινόμηση"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ταξινόμηση κατά όνομα"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Ταξινόμηση με βάση μέγεθος"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Διαχείριση χώρου"</string>
     <string name="filter" msgid="2018011724373033887">"Φίλτρο"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Η λήψη ολοκληρώθηκε"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Εκτελείται"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Στην κάρτα SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Φόρτωση..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Απενεργοποιημένο"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Δεν υπάρχουν εφαρμογές."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Εκ νέου υπολογισμός μεγέθους..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Διαγραφή"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Όλα τα δεδομένα της εφαρμογής θα διαγραφούν μόνιμα. Αυτό περιλαμβάνει όλα τα αρχεία, τις ρυθμίσεις, τους λογαριασμούς, τις βάσεις δεδομένων και τα λοιπά."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Η καθορισμένη τοποθεσία εγκατάστασης δεν είναι έγκυρη."</string>
     <string name="system_package" msgid="1030561474413022831">"Δεν είναι δυνατή η αποθήκευση των ενημερώσεων συστήματος σε εξωτερικά μέσα."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Αναγκαστική διακοπή"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Θα γίνει αμέσως επανεκκίνηση αυτής της εφαρμογής. Είστε βέβαιοι ότι θέλετε να γίνει διακοπή;"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Η αναγκαστική διακοπή μιας εφαρμογής μπορεί να προκαλέσει πρόβλημα στη λειτουργία της. Είστε σίγουροι;"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Μετακίνηση εφαρμογής"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Η μετακίνηση της εφαρμογής απέτυχε. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Προτιμώμενη θέση εγκατάστασης"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Αλλαγή της προτιμώμενης θέσης εγκατάστασης για νέες εφαρμογές."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Αποθηκευτικός χώρος"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Υπηρεσίες που εκτελούνται"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Γίνεται επανεκκίνηση"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Δεν εκτελούνται υπηρεσίες"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Διακοπή υπηρεσίας;"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Η υπηρεσία δεν θα εκτελείται έως ότου επανεκκινηθεί. Αυτό ενδέχεται να έχει μη επιθυμητά αποτελέσματα στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Διακοπή"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Άκυρο"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Έγινε εκκίνηση από εφαρμογή: άγγιγμα για παύση"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: αγγίξτε για διαχείριση"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Διαθ.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> στα <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Άλλο: <xliff:g id="MEMORY">%2$s</xliff:g> στα <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Διεργασία: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Τίποτα σε εξέλιξη."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Έναρξη από την εφαρμογή."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> διαθέσιμη"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> σε χρήση"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> διεργασία και <xliff:g id="NUMSERVICES">%2$d</xliff:g> υπηρεσία"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> διεργασία και <xliff:g id="NUMSERVICES">%2$d</xliff:g> υπηρεσίες"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> διεργασίες και <xliff:g id="NUMSERVICES">%2$d</xliff:g> υπηρεσία"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> διεργασίες και <xliff:g id="NUMSERVICES">%2$d</xliff:g> υπηρεσίες"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Εκτέλεση εφαρμογής"</string>
+    <string name="no_services" msgid="7133900764462288263">"Ανενεργό"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Υπηρεσίες"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Διεργασίες"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Διακοπή"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Ρυθμίσεις"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Αυτή η υπηρεσία εκκινήθηκε από αυτή την εφαρμογή. Η διακοπή της μπορεί να προκαλέσει αποτυχία της εφαρμογής."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Αυτή η εφαρμογή δεν μπορεί να διακοπεί με ασφάλεια. Αν το κάνετε, μπορεί να χάσετε την τρέχουσα εργασία σας."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: χρησιμοποιείται. Πατήστε την επιλογή \"Ρυθμίσεις\" για έλεγχο."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Κύρια διεργασία σε χρήση."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Η υπηρεσία <xliff:g id="COMP_NAME">%1$s</xliff:g> χρησιμοποιείται."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Ο πάροχος <xliff:g id="COMP_NAME">%1$s</xliff:g> χρησιμοποιείται."</string>
     <string name="language_settings" msgid="502219872342167227">"Γλώσσα και πληκτρολόγιο"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Ρυθμίσεις γλώσσας και πληκτρολογίου"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Ορισμ.τοπ.ρυθμ.(γλώσσα και περιοχή), είσ.κειμ.και επιλ.αυτόμ.διόρθ."</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Δοκιμή"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Πληροφορίες τηλεφώνου"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Πληροφορίες μπαταρίας"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Ιστορικό μπαταρίας"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Γρήγορη εκκίνηση"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Ορισμός συντομεύσεων πληκτρολογίου για την εκκίνηση εφαρμογών"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Ορισμός εφαρμογής"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Ο εντοπισμός σφαλμάτων USB προορίζεται μόνο για σκοπούς προγραμματισμού. Μπορεί να χρησιμοποιηθεί για αντιγραφή δεδομένων μεταξύ του υπολογιστή και της συσκευής σας, για την εγκατάσταση εφαρμογών στη συσκευή σας χωρίς προειδοποίηση και για την ανάγνωση δεδομένων καταγραφής."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Επιλογή gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Επιλογή γραφικού στοιχείου"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Λεπτομέρειες για UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Λεπτομέρειες χρήσης δικτύου για <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Αριθμός byte που ελήφθησαν: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Αριθμός byte που απεστάλησαν: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Συνολικό μέγεθος σε bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Λεπτομέρειες χρήσης CPU για <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Χρόνος χρήστη:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Ώρα συστήματος:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Συνολικός χρόνος:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Ξεκινά: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>η <xliff:g id="HOURS">%2$d</xliff:g>ω <xliff:g id="MINUTES">%3$d</xliff:g>λ <xliff:g id="SECONDS">%4$d</xliff:g>δ"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>ω <xliff:g id="MINUTES">%2$d</xliff:g>λ <xliff:g id="SECONDS">%3$d</xliff:g>δ"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>λ <xliff:g id="SECONDS">%2$d</xliff:g>δ"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>δ"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Πακέτα που μοιράζονται αυτό το UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Δεν υπάρχουν διαθέσιμα δεδομένα χρήσης μπαταρίας"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Αισθητήρας:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Μερικό κλείδωμα αφύπνισης"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Αισθητήρας που χρησιμοποιείται από πακέτα:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Χρησιμοποιήθηκε <xliff:g id="COUNT">%1$d</xliff:g> φορές από <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Χρησιμοποιήθηκε <xliff:g id="COUNT">%1$d</xliff:g> φορές από ένα εκ των:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Εκτελείται"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Οθόνη ενεργοποιημένη"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Τηλέφωνο ενεργοποιημένο"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Χρόνος εκτός κατάστασης αδράνειας:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Χρόνος που παρήλθε με ενεργοποιημένη οθόνη:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Χρόνος που παρήλθε με ενεργοποιημένο τηλέφωνο:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Ενεργοποιημένη μπαταρία:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Συνδεδεμένο σε:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Στατιστικά χρήσης"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Στατιστικά χρήσης"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Ταξινόμηση με βάση:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Τι χρησιμοποιούσε την μπαταρία"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Χρήση μπαταρίας από τη στιγμή της αποσύνδεσης από την τροφοδοσία"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Χρήση μπαταρίας από τη στιγμή της επαναφοράς"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> με μπαταρία"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> από την αποσύνδεση"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Φόρτιση"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Οθόνη ενεργοποιημένη"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS ενεργοποιημένο"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WIFI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Κανον. λειτ."</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Σήμα τηλεφώνου"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Χρόνος ενεργοποίησης της συσκευής"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Το τηλέφωνο είναι αδρανές"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Συνολικός χρόνος CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"Προσκήνιο CPU"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Διατήρηση λειτουρ."</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Τηλέφωνο"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Τα δεδομένα εστάλησαν"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Μπαταρία που χρησιμοποιείται από το Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Απενεργοποίηση του Bluetooth όταν δεν το χρησιμοποιείτε"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Δοκιμή σύνδεσης σε διαφορετική συσκευή bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Χρήση μπαταρίας κατά την εκτέλεση των εφαρμογών"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Μπαταρία που χρησιμοποιείται από την εφαρμογή"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Τερματισμός ή κατάργηση εγκατάστασης της εφαρμογής"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Απενεργοποίηση του GPS όταν δεν χρησιμοποιείται"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Χειροκίνητος έλεγχος του GPS για την αποφυγή χρήσης του από την εφαρμογή"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Η εφαρμογή ενδέχεται να προσφέρει ρυθμίσεις που θα μειώσουν τη χρήση της μπαταρίας"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> από την αποσύνδεση"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Από την τελευταία αποσύνδεση για <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Δεν έχει εγκατασταθεί"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Γυναίκα"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Άντρας"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Έλεγχος ισχύος"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Ενημέρωση ρύθμισης Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Ενημέρωση ρύθμισης Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Αυτός ο χώρος αποθήκευσης διαπιστευτηρίων διαγράφτηκε."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Ο χώρος αποθήκευσης διαπιστευτηρίων ενεργοποιήθηκε."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Ο χώρος αποθήκευσης διαπιστευτηρίων απενεργοποιήθηκε."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Κρυπτογραφημένο σύστημα αρχείων"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Κρυπτογράφηση ιδιωτικών δεδομένων χρήστη"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Ενεργοποίηση αποθήκευσης κρυπτογραφημένου συστήματος αρχείων για ιδιωτικά δεδομένα χρήστη σε αυτήν τη συσκευή"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Για την ενεργοποίηση των κρυπτογραφημένων συστημάτων αρχείων απαιτείται σβήσιμο των δεδομένων συσκευής."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Για την απενεργοποίηση των κρυπτογραφημένων συστημάτων αρχείων απαιτείται σβήσιμο των δεδομένων συσκευής."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Ενεργοποίηση"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Απενεργοποίηση"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Ακύρωση"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Η αλλαγή λειτουργίας κρυπτογραφημένων συστημάτων αρχείων ακυρώθηκε."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Προειδοποίηση κρυπτογραφημένων συστημάτων αρχείων."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Τόνος επείγουσας ανάγκης"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Ορισμός συμπεριφοράς κατά την πραγματοποίηση κλήσης επείγουσας ανάγκης"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Απόρρητο"</string>
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index 099f3fc..e429620 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nunca cuando está conectado"</item>
     <item msgid="1986753720941888596">"Nunca"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Uso de CPU"</item>
-    <item msgid="6401018715947316517">"Uso de red"</item>
-    <item msgid="188092590354892392">"Uso de GPS"</item>
-    <item msgid="8414109131222049141">"Uso del sensor"</item>
-    <item msgid="1327904325081257093">"Uso de despertador parcial"</item>
-    <item msgid="4832254146664706277">"Otro uso"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Desde la última vez que se desconectó"</item>
-    <item msgid="166936313535197598">"Total desde el reinicio"</item>
-    <item msgid="4793941382744963893">"Total en todo el tiempo"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Hora de uso"</item>
     <item msgid="1908750532762193304">"Lanzar recuento"</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 5822bfb..c9bdf00 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Seleccionar actividad"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Información de dispositivo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Información de la batería"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Historial de batería"</string>
     <string name="display_label" msgid="7403874003169865762">"Mostrar"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Información del teléfono"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Tarjeta SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Especificar cuándo se debe cambiar de Wi-Fi a datos de celular"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Se ha producido un problema al establecer la política de estado de inactividad."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Dirección de MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Dirección IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Configuración de IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Guardar"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Cancelar"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Ver ubicación en las aplicaciones (como Mapas) mediante redes inalámbricas"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Ubicación determinada por Wi-Fi o redes de celulares"</string>
     <string name="location_gps" msgid="6296125378829097831">"Utilizar satélites de GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Localiz. con precisión del nivel de calle (anular la sel. para ahorrar bat.)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Cuando se está ubicando, que sea preciso hasta el nivel de la calle."</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localiz. a nivel de calle (nec. más batería además de la vista del cielo)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Utilizar GPS asistido"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Utilizar el servidor para asistir el GPS (anular la selección para reducir el uso de la red)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplicación"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Datos"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Desinstalar..."</string>
+    <string name="disable_text" msgid="6544054052049395202">"Inhabilitar"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Habilitar"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Borrar datos"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Desinstalar las actualizaciones"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Has elegido lanzar esta aplicación de manera predeterminada para algunas acciones."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"No hay configuraciones predeterminadas establecidas."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Borrar configuraciones predeterminadas"</string>
     <string name="unknown" msgid="1592123443519355854">"Desconocido"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Ordenar"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ordenar por nombre"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Ordenar por tamaño"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Administrar el espacio"</string>
     <string name="filter" msgid="2018011724373033887">"Filtro"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Descargado"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"En ejecución"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"En tarjeta SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Cargando…"</string>
+    <string name="disabled" msgid="9206776641295849915">"Desactivado"</string>
+    <string name="no_applications" msgid="5190227407135243904">"No hay aplicaciones."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Recalculando el tamaño…"</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Suprimir"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Todos los datos de esta aplicación se suprimirán de forma permanente. Esto incluye todos los archivos, las configuraciones, las cuentas, las bases de datos, etc."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"La ubicación específica de la instalación no es válida."</string>
     <string name="system_package" msgid="1030561474413022831">"Las actualizaciones del sistema no se pueden instalar en medios externos."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Provocar la detención"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Esta aplicación se reiniciará inmediatamente. ¿Estás seguro de que deseas provocar la detención?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Si detienes una aplicación a la fuerza, puedes alterar su comportamiento. ¿Estas seguro de que deseas hacerlo?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Mover aplicación"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Error al mover la aplicación. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Ubicación de instalación preferida"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Cambiar la ubicación de instalación preferida para nuevas aplicaciones"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Uso del almacenamiento "</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en ejecución"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar servicios actuales en ejecución"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Volver a comenzar"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Sin servicios en ejecución"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"¿Deseas detener el servicio?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"El servicio no ejecutará más hasta que comience de nuevo. Esto puede tener consecuencias no deseadas en la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Detener"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Cancelar"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Comenz. aplic.: tocar para detener"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: tocar para administrar"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disp.:<xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> en <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Otro: <xliff:g id="MEMORY">%2$s</xliff:g> en <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proceso: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"No hay nada activo."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Comenzado por aplicación."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponible"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> en uso"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicios"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicios"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicio"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicios"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Ejecutando aplicación"</string>
+    <string name="no_services" msgid="7133900764462288263">"Inactivo"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Servicios"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Procesos"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Detener"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Config."</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Este servicio fue iniciado por su aplicación. Detenerlo puede provocar que falle la aplicación. "</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Esta aplicación no puede detenerse de manera segura. Al hacerlo, puedes perder parte de tu trabajo actual."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: actualmente en uso. Toca los parámetros de configuración para controlarlo."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Proceso principal en uso."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"El servicio <xliff:g id="COMP_NAME">%1$s</xliff:g> está en uso."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"El proveedor <xliff:g id="COMP_NAME">%1$s</xliff:g> está en uso."</string>
     <string name="language_settings" msgid="502219872342167227">"Idioma &amp; del teclado"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Idioma y Configuración del teclado"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Establecer opciones de país (idioma y región), ingreso de texto y corrección automática"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Probando"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Información del teléfono"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Información sobre la batería"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Historial de batería"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Lanzamiento rápido"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Establecer métodos abreviados de teclado para lanzar aplicaciones"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Asignar aplicación"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"La depuración de USB está prevista sólo con fines de desarrollo. Se puede utilizar para copiar datos entre tu computadora y tu dispositivo, instalar aplicaciones en tu dispositivo sin aviso y leer los datos de registro."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Elegir gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Elegir control"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detalles de UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"ID de usuario <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Detalles de uso de la red para <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Bytes recibidos: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Bytes enviados: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Total de bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Detalles de uso de CPU para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Hora del usuario:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Hora del sistema:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tiempo total:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Comienza: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>días <xliff:g id="HOURS">%2$d</xliff:g>h <xliff:g id="MINUTES">%3$d</xliff:g>min <xliff:g id="SECONDS">%4$d</xliff:g>seg"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>h <xliff:g id="MINUTES">%2$d</xliff:g>min <xliff:g id="SECONDS">%3$d</xliff:g>seg"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Paquetes que comparten esta UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"No hay datos disponibles del uso de la batería"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Bloqueo de despertador parcial:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor utilizado por los paquetes:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> veces por <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> veces por uno de:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"En ejecución"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Pantalla encendida"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Teléfono encendido"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tiempo de encendido sin estar en estado de inactividad:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tiempo de encendido de la pantalla:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tiempo de encendido del teléfono:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"En la batería:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Conectado:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Estadísticas de uso"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Estadísticas de uso"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Ordenar por:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Lo que ha utilizado la batería"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Uso de la batería desde que se desconectó"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Uso de la batería desde que se restableció"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> en la batería"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> desde que se desconectó"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Cargando"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Pantalla encendida"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS encendido"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WIFI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Encender"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Señal del teléfono "</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Hora de activación del dispositivo"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Teléfono inactivo"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU total"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"Primer plano de la CPU"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Mantener en funcionamiento"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Teléfono"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Datos enviados"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"La batería está siendo utilizada por bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Desactiva Bluetooth cuando no lo utilizas"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Intentar conectarse a un dispositivo Bluetooth diferente"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"La batería es utilizada por las aplicaciones durante el roaming"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"La batería está siendo utilizada por la aplicación"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Detener o desinstalar la aplicación"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Desactivar el GPS cuando no lo utilizas"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Controle manualmente el GPS para que la aplicación no lo use."</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"La aplicación podrá ofrecer una configuración para reducir el uso de la batería"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> desde que se desconectó"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Durante la última desconexión para <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"No se ha instalado."</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Femenino"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Masculino"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Control de energía"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Actualizando configuración de Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Actualización de la configuración de Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"El almacenamiento de la credencial se ha borrado."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"El almacenamiento de la credencial está activado."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"El almacenamiento de la credencial está inhabilitado."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Sistema de encriptado de archivos"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Encriptar los datos privados del usuario"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Habilitar el almacenamiento del sistema de encriptado de archivos para los datos privados del usuario en este dispositivo"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Si se habilitan los sistemas de encriptado de archivos, se requiere la eliminación de datos del dispositivo."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Si se deshabilitan los sistemas de encriptado de archivos, se requiere la eliminación de datos del dispositivo."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Activar"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Desactivar"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Cancelar"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Cambio en el modo de sistemas de encriptado de archivos cancelado"</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Advertencia de los sistemas de encriptado de archivos."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tono de emergencia"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Establecer el comportamiento cuando se establece una llamada de emergencia"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacidad"</string>
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index 598474c..202508f 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nunca si se está cargando la batería"</item>
     <item msgid="1986753720941888596">"Nunca"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Uso de CPU"</item>
-    <item msgid="6401018715947316517">"Uso de red"</item>
-    <item msgid="188092590354892392">"Uso de GPS"</item>
-    <item msgid="8414109131222049141">"Uso del sensor"</item>
-    <item msgid="1327904325081257093">"Uso de actividad parcial"</item>
-    <item msgid="4832254146664706277">"Otro uso"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Desde la última vez que se cargó"</item>
-    <item msgid="166936313535197598">"Total desde inicio"</item>
-    <item msgid="4793941382744963893">"Total durante todo el tiempo"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Tiempo de uso"</item>
     <item msgid="1908750532762193304">"Número de inicios"</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 471b940..2756bbc 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Seleccionar actividad"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Información del dispositivo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Información sobre la batería"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Historial de la batería"</string>
     <string name="display_label" msgid="7403874003169865762">"Pantalla"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Información sobre el teléfono"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Tarjeta SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Especificar cuándo cambiar de Wi-Fi a datos móviles"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Se ha producido un problema al intentar establecer la política de suspensión."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Dirección MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Dirección IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Ajustes de IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Guardar"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Cancelar"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Para ver una ubicación en aplicaciones (por ejemplo, Google Maps)"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Ubicación determinada por redes móviles o Wi-Fi"</string>
     <string name="location_gps" msgid="6296125378829097831">"Utilizar satélites GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Para detectar ubicación (desactivar para ahorrar batería)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Ubicación precisa a nivel de calle"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localizar en nivel de calle (requiere más batería además de la vista aérea)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Utilizar GPS asistido"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Utilizar el servidor para asistir al GPS (desactivar para reducir el uso de la red)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplicación"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Datos"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Desinstalar"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Inhabilitar"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Habilitar"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Borrar datos"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Desinstalar actualizaciones"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Has elegido ejecutar la aplicación de forma predeterminada para algunas acciones."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"No se han establecido valores predeterminados."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Borrar valores predeterminados"</string>
     <string name="unknown" msgid="1592123443519355854">"Desconocido"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Ordenar"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ordenar por nombre"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Ordenar por tamaño"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Administrar espacio"</string>
     <string name="filter" msgid="2018011724373033887">"Filtrar"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Descargada"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"En ejecución"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"En tarjeta SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Cargando..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Inhabilitada"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Sin aplicaciones"</string>
     <string name="recompute_size" msgid="7722567982831691718">"Recalculando tamaño..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Eliminar"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Todos los datos de la aplicación se eliminarán de forma permanente, incluidos todos los archivos, la configuración, las cuentas, las bases de datos, etc."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"La ubicación de instalación especificada no es válida."</string>
     <string name="system_package" msgid="1030561474413022831">"Las actualizaciones del sistema no se pueden instalar en medios externos."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Forzar detención"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Esta aplicación se reiniciará de forma inmediata. ¿Estás seguro de que deseas forzar la detención?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Forzar la detención de una aplicación puede dar lugar a un comportamiento inadecuado. ¿Seguro que quieres continuar?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Mover aplicación"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"No se ha podido mover la aplicación. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Ubicación de instalación preferida"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Modificar ubicación de instalación preferida para nuevas aplicaciones"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Uso de almacenamiento"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en ejecución"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en ejecución"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Reiniciando"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"No hay servicios en ejecución."</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"¿Quieres detener el servicio?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"El servicio no se ejecutará hasta que se vuelva a iniciar, lo que puede provocar consecuencias no deseadas en la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Detener"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Cancelar"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Iniciado por la aplicación: tocar para detener"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: tocar para administrar"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disp.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> en <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Otros: <xliff:g id="MEMORY">%2$s</xliff:g> en <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proceso: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"No hay nada en ejecución."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Iniciado por la aplicación."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponible"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> en uso"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proceso y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicio"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proceso y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicios"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicio"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> procesos y <xliff:g id="NUMSERVICES">%2$d</xliff:g> servicios"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Aplicación en ejecución"</string>
+    <string name="no_services" msgid="7133900764462288263">"Inactivos"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Servicios"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Procesos"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Detener"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Ajustes"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Servicio iniciado por su aplicación. Si se detiene, se puede producir un error en la aplicación."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"No se puede detener la aplicación de forma segura. Si lo haces, puedes perder parte de tu trabajo."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: actualmente en uso. Toca en \"Ajustes\" para controlarlo."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Proceso principal en uso"</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Servicio <xliff:g id="COMP_NAME">%1$s</xliff:g> en uso"</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Proveedor <xliff:g id="COMP_NAME">%1$s</xliff:g> en uso"</string>
     <string name="language_settings" msgid="502219872342167227">"Idioma y teclado"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Ajustes de teclado y de idioma"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Configuración regional, opciones de autocorrección e introducción de texto"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Prueba"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Información sobre el teléfono"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Información sobre la batería"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Historial de la batería"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Inicio rápido"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Establecer accesos rápidos del teclado para ejecutar aplicaciones"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Asignar aplicación"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"La depuración USB solo está indicada para actividades de desarrollo. Se puede utilizar para intercambiar datos entre el equipo y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Seleccionar gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Seleccionar widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detalles del ID único <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"ID único <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Detalles de uso de red para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Bytes recibidos: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Bytes enviados: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Bytes totales: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Detalles de uso de CPU para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Tiempo de usuario:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Tiempo del sistema:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tiempo total"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Inicios: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> min <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Paquetes que comparten este ID único:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"No hay datos disponibles sobre el uso de la batería."</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Bloqueo de actividad parcial:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor utilizado por paquetes:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> veces por <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> veces por uno de:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"En ejecución"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Pantalla encendida"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Teléfono encendido"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tiempo transcurrido sin suspensión:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tiempo transcurrido con la pantalla encendida:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tiempo transcurrido con el teléfono encendido:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"En la batería:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Cargando:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Estadísticas de uso"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Estadísticas de uso"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Ordenar por:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Consumo de la batería"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Uso de la batería desde que se cargó"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Uso de la batería desde que se restableció"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> de batería"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> desde que se cargó"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Cargando..."</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Pantalla encendida"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS activado"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WIFI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Activa"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Señal del teléfono"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Tiempo de actividad del dispositivo"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Teléfono inactivo"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Total de CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"Primer plano de la CPU"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Mantener activo"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Teléfono"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Datos enviados"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batería utilizada por Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Desactiva el Bluetooth cuando no lo estés utilizando."</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Intenta conectarte a un dispositivo Bluetooth diferente."</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batería utilizada por aplicaciones en ejecución"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batería utilizada por aplicación"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Detener o desinstalar la aplicación"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Desactivar GPS cuando no se esté utilizando"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Controlar el GPS manualmente para evitar que la aplicación lo utilice"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"La aplicación puede incluir opciones que permitan reducir el uso de la batería."</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> desde que se desenchufó"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Desde la última vez que se desenchufó para <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Sin instalar"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Mujer"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Hombre"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Control de energía"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Actualización de la configuración de la conexión Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Actualización de la configuración de la conexión Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Se ha borrado el almacenamiento de credenciales."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Almacenamiento de credenciales habilitado"</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Almacenamiento de credenciales inhabilitado"</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Sistema de archivos encriptados"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Encriptar datos de usuario privados"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Habilitar almacenamiento de sistema de archivos encriptados para datos de usuario privados en este dispositivo"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Es necesario eliminar los datos del dispositivo para habilitar los sistemas de archivos encriptados."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Es necesario eliminar los datos del dispositivo para inhabilitar los sistemas de archivos encriptados."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Habilitar"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Inhabilitar"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Cancelar"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Se ha cancelado el cambio de modo de sistemas de archivos encriptados."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Advertencia de sistemas de archivos encriptados"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tono de emergencia"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Establecer comportamiento al realizar una llamada de emergencia"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacidad"</string>
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 5840edf..e9633f6 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Jamais si branché"</item>
     <item msgid="1986753720941888596">"Jamais"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Utilisation de l\'UC"</item>
-    <item msgid="6401018715947316517">"Utilisation du réseau"</item>
-    <item msgid="188092590354892392">"Utilisation du GPS"</item>
-    <item msgid="8414109131222049141">"Utilisation du capteur"</item>
-    <item msgid="1327904325081257093">"Utilisation en activité partielle"</item>
-    <item msgid="4832254146664706277">"Autre utilisation"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Depuis le dernier débranchement"</item>
-    <item msgid="166936313535197598">"Total depuis le démarrage"</item>
-    <item msgid="4793941382744963893">"Total toutes périodes comprises"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Temps d\'utilisation"</item>
     <item msgid="1908750532762193304">"Nombre de lancements"</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index d102205..332b7a5 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Sélectionner une activité"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Informations sur l\'appareil"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Informations sur la batterie"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Historique de la batterie"</string>
     <string name="display_label" msgid="7403874003169865762">"Afficher"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Informations sur le téléphone"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Carte SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Indiquer quand basculer du Wi-Fi sur le réseau de données mobile"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Un problème est survenu lors du paramétrage de la politique de veille."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Adresse MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Adresse IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Paramètres IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Enregistrer"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Annuler"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Afficher ma position dans les applications (comme Google Maps)"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Position géographique déterminée par réseaux Wi-Fi et/ou mobile"</string>
     <string name="location_gps" msgid="6296125378829097831">"Utiliser les satellites GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Localisation à la rue près (décocher pour économiser la batterie)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Lors de la géolocalisation, localisation à la rue près"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localiser au niveau rue (requiert + de batterie et une vue dégagée)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Utiliser le GPS assisté"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Utiliser le serveur pour assister le GPS (désactiver pour réduire l\'utilisation du réseau)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Application"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Données"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Désinstaller"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Désactiver"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Activer"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Effacer les données"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Désinstaller les mises à jour"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Vous avez choisi de lancer cette application par défaut pour certaines actions."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Aucun paramètre par défaut défini"</string>
     <string name="clear_activities" msgid="7408923511535174430">"Effacer les actions par défaut"</string>
     <string name="unknown" msgid="1592123443519355854">"Inconnu"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Trier"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Trier par nom"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Trier par taille"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Gérer l\'espace"</string>
     <string name="filter" msgid="2018011724373033887">"Filtrer"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Téléchargées"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"En cours d\'exécution"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Sur la carte SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Chargement..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Désactivée"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Aucune application"</string>
     <string name="recompute_size" msgid="7722567982831691718">"Calcul de la taille..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Supprimer"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Toutes les données de cette application vont être définitivement supprimées, y compris tous les fichiers, les paramètres, les comptes, les bases de données, etc."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"L\'emplacement d\'installation indiqué n\'est pas valide."</string>
     <string name="system_package" msgid="1030561474413022831">"Les mises à jour du système ne peuvent pas être installées sur des supports externes."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Forcer l\'arrêt"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Cette application sera immédiatement redémarrée. Voulez-vous vraiment forcer sa fermeture ?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Êtes-vous sûr ? Forcer l\'arrêt d\'une application peut entraîner des dysfonctionnements."</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Déplacer l\'application"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Échec du déplacement de l\'application. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Emplacement d\'installation souhaité"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Modifiez l\'emplacement d\'installation par défaut pour les nouvelles applications."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Utilisation du stockage"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Services en cours d\'exécution"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Afficher et contrôler les services en cours d\'exécution"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Redémarrage en cours"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Aucun service en cours d\'exécution"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Arrêter le service ?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Le service ne sera plus exécuté tant qu\'il ne sera pas relancé. Cette configuration peut avoir des conséquences gênantes sur l\'application <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Arrêter"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Annuler"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Démarré par appl. : appuyez pr arrêter"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g> : appuyez dessus pour gérer le service."</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disponible : <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> dans <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Autres : <xliff:g id="MEMORY">%2$s</xliff:g> dans <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Processus : <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Pas de services en cours"</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Service démarré par l\'application"</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponible"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"En cours d\'utilisation : <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processus et <xliff:g id="NUMSERVICES">%2$d</xliff:g> service"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processus et <xliff:g id="NUMSERVICES">%2$d</xliff:g> services"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processus et <xliff:g id="NUMSERVICES">%2$d</xliff:g> service"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processus et <xliff:g id="NUMSERVICES">%2$d</xliff:g> services"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Application en cours d\'exécution"</string>
+    <string name="no_services" msgid="7133900764462288263">"Inactifs"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Services"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processus"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Arrêter"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Paramètres"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Ce service a été démarré par son application. Si vous l\'arrêtez, cette dernière risque de se bloquer."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Impossible d\'arrêter correctement cette application. Si vous continuez, vous risquez de perdre une partie des travaux en cours."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"En cours d\'utilisation : <xliff:g id="CLIENT_NAME">%1$s</xliff:g>. Appuyez sur Paramètres pour contrôler ce client."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Principal processus actuellement utilisé"</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Le service <xliff:g id="COMP_NAME">%1$s</xliff:g> est actuellement utilisé."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"L\'opérateur <xliff:g id="COMP_NAME">%1$s</xliff:g> est actuellement utilisé."</string>
     <string name="language_settings" msgid="502219872342167227">"Langue et clavier"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Paramètres de langue et clavier"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Définir la langue et la région, la saisie de texte et la correction automatique"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Test"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Informations sur le téléphone"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Informations sur la batterie"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Historique de la batterie"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Lancement rapide"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Configurer des raccourcis clavier pour lancer des applications"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Choisir une application"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Le débogage USB est conçu à des fins de développement uniquement. Il peut servir à copier des données entre votre ordinateur et votre appareil, à installer des applications sur votre appareil sans notification et à lire les données de journal."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Choisir un gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Choisir un widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Détails de l\'UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Données d\'utilisation du réseau pour <xliff:g id="APP_NAME">%1$s</xliff:g> :"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Octets reçus : <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Octets envoyés :<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Octets au total :<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Données d\'utilisation de l\'UC pour <xliff:g id="APP_NAME">%1$s</xliff:g> :"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Heure utilisateur :"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Heure système :"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Temps total :"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Démarrages : <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> j <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> mn <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> mn <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> mn <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Paquets partageant cet UID :"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Aucune donnée sur l\'utilisation de la batterie disponible"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Capteur :"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Verrouillage en veille partielle :"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Capteur utilisé par les kits :"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Utilisé <xliff:g id="COUNT">%1$d</xliff:g> fois par <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Utilisé <xliff:g id="COUNT">%1$d</xliff:g> fois par l\'une des applications suivantes :"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"En cours d\'exécution"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Écran activé"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Téléphone allumé"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Autonomie sans mise en veille :"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Temps utilisé avec l\'écran activé :"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Autonomie avec le téléphone allumé :"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Sur la batterie :"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Branchée :"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Données statistiques"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Données statistiques"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Trier par :"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Répartition de l\'utilisation de la batterie"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Utilisation de la batterie depuis le débranchement"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Utilisation de la batterie depuis la dernière réinitialisation"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"Sur la batterie : <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"Débranché depuis <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Batterie en charge"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Écran activé"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS activé"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WI-FI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"En activité"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Signal du téléphone"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Durée de fonctionnement de l\'appareil"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Téléphone inactif"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"UC - Durée totale"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"UC - Premier plan"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Maintenir activé"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Téléphone"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Données envoyées"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batterie utilisée par Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Désactivez Bluetooth lorsque vous ne l\'utilisez pas."</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Essayez de vous connecter à un autre appareil Bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batterie utilisée par les applications en cours d\'exécution"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batterie utilisée par l\'application"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Arrêter ou désinstaller l\'application"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Désactivez le GPS lorsque vous ne l\'utilisez pas."</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Contrôlez manuellement le GPS pour éviter que l\'application ne l\'utilise."</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"L\'application dispose peut-être de paramètres permettant de réduire l\'utilisation de la batterie."</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"Débranché depuis <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Depuis le dernier débranchement (<xliff:g id="UNPLUGGED">%1$s</xliff:g>)"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Non installée"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Femme"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Homme"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Contrôle de l\'alimentation"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Mise à jour des paramètres Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Mise à jour des paramètres Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Le stockage des identifiants est effacé."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Stockage des identifiants activé"</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Stockage des identifiants désactivé"</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Système de fichiers cryptés"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Crypter les données utilisateur privées"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Activer le stockage des données utilisateur privées dans les systèmes de fichiers cryptés de ce périphérique"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Pour activer les systèmes de fichiers cryptés, vous devez disposer d\'un outil de nettoyage des données."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Pour désactiver des systèmes de fichiers cryptés, vous devez disposer d\'un outil de nettoyage des données."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Activer"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Désactiver"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Annuler"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"La modification apportée au mode Systèmes de fichiers cryptés a été annulée."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Avertissement relatif aux systèmes de fichiers cryptés"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Sonnerie d\'urgence"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Définir le comportement en cas d\'appel d\'urgence"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Confidentialité"</string>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index 4954dd4..138a100 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Mai quando collegato"</item>
     <item msgid="1986753720941888596">"Mai"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Utilizzo CPU"</item>
-    <item msgid="6401018715947316517">"Utilizzo della rete"</item>
-    <item msgid="188092590354892392">"Utilizzo GPS"</item>
-    <item msgid="8414109131222049141">"Utilizzo sensore"</item>
-    <item msgid="1327904325081257093">"Utilizzo riattivazione parziale"</item>
-    <item msgid="4832254146664706277">"Altro utilizzo"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Da ultimo scollegamento"</item>
-    <item msgid="166936313535197598">"Totale dall\'avvio"</item>
-    <item msgid="4793941382744963893">"Totale generale"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Tempo di utilizzo"</item>
     <item msgid="1908750532762193304">"Conteggio avvii"</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 56f980b..03aa4a2 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Seleziona attività"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Info dispositivo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Info batteria"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Cronologia batteria"</string>
     <string name="display_label" msgid="7403874003169865762">"Display"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Info telefono"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Scheda SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Specifica quando passare da Wi-Fi a dati cellulare"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Errore durante l\'impostazione dei criteri di sospensione."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Indirizzo MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Indirizzo IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Impostazioni IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Salva"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Annulla"</string>
@@ -481,7 +481,7 @@
     <string name="sim_pins_dont_match" msgid="4664611595579163214">"I PIN non corrispondono."</string>
     <string name="sim_change_failed" msgid="4823538458798362222">"Impossibile cambiare il PIN."\n"Il PIN potrebbe essere errato."</string>
     <string name="sim_change_succeeded" msgid="8556135413096489627">"PIN della SIM modificato"</string>
-    <string name="sim_lock_failed" msgid="6676748290838006404">\n"Impossibile modificare lo stato di blocco della SIM."\n"Il PIN potrebbe essere errato."</string>
+    <string name="sim_lock_failed" msgid="6676748290838006404">\n"Impossibile modificare lo stato di blocco della SIM.BREAKIl PIN potrebbe essere errato."</string>
     <string name="sim_enter_ok" msgid="6475946836899218919">"OK"</string>
     <string name="sim_enter_cancel" msgid="6240422158517208036">"Annulla"</string>
     <string name="device_info_settings" msgid="475872867864762157">"Stato telefono"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Visualizza la posizione nelle applicazioni (ad esempio Maps) utilizzando le reti wireless"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Posizione determinata dalle reti mobili e/o Wi-Fi"</string>
     <string name="location_gps" msgid="6296125378829097831">"Utilizza satelliti GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Accuratezza a livello stradale (deseleziona per risparmiare batteria)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Nel rilevamento della posizione, precisione a livello stradale"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localizza a livello stradale (richiede più batteria e la vista del cielo)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Utilizza GPS assistito"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Utilizza il server per assistere il GPS (deseleziona per ridurre l\'utilizzo della rete)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Applicazione"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Dati"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Disinstalla"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Disattiva"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Attiva"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Cancella dati"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Disinstalla aggiornamenti"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Hai scelto di avviare per impostazione predefinita questa applicazione per alcune azioni."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Nessuna applicazione predefinita impostata."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Cancella predefinite"</string>
     <string name="unknown" msgid="1592123443519355854">"Sconosciuta"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Ordina"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ordina per nome"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Ordina per dimensioni"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Gestisci spazio"</string>
     <string name="filter" msgid="2018011724373033887">"Filtra"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Scaricate"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"In esecuzione"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Scheda SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Caricamento..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Disattivato"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Nessuna applicazione."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Ricalcolo dimensioni..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Elimina"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Tutti i dati dell\'applicazione verranno eliminati definitivamente, inclusi tutti i file, le impostazioni, gli account, i database e così via."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Il percorso di installazione specificato non è valido."</string>
     <string name="system_package" msgid="1030561474413022831">"Impossibile installare aggiornamenti di sistema su supporti esterni."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Termina"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Questa applicazione verrà riavviata immediatamente. Procedere con l\'interruzione forzata?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Terminare un\'applicazione in modo forzato può causarne il cattivo funzionamento. Sicuro?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Sposta applicazione"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Spostamento applicazione non riuscito. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Percorso di installazione"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Cambia il percorso preferito per l\'installazione di nuove applicazioni."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Utilizzo memoria"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Servizi in esecuzione"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizza e controlla i servizi attualmente in esecuzione"</string>
     <string name="service_restarting" msgid="2242747937372354306">"In fase di riavvio"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Nessun servizio in esecuzione"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Interrompere il servizio?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Il servizio non verrà più eseguito fino al riavvio. Questa operazione potrebbe avere conseguenze indesiderate sull\'applicazione <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Interrompi"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Annulla"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Avviato dall\'applicaz.: tocca per interr."</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: tocca per la gestione"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disponibile: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Altro: <xliff:g id="MEMORY">%2$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Processo: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Niente in esecuzione."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Avviato dall\'applicazione."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponibile"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> in uso"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> servizio"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> servizi"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processi e <xliff:g id="NUMSERVICES">%2$d</xliff:g> servizio"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processi e <xliff:g id="NUMSERVICES">%2$d</xliff:g> servizi"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Applicazione in esecuzione"</string>
+    <string name="no_services" msgid="7133900764462288263">"Non attivi"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Servizi"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processi"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Interrompi"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Impostazioni"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Questo servizio è stato avviato dalla sua applicazione. L\'interruzione potrebbe bloccare l\'applicazione."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Questa applicazione non può essere interrotta in modo sicuro. Procedendo potresti perdere parte del lavoro corrente."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: attualmente in uso. Tocca Impostazioni per controllare."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Il processo principale in uso."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Il servizio <xliff:g id="COMP_NAME">%1$s</xliff:g> è in uso."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Il provider <xliff:g id="COMP_NAME">%1$s</xliff:g> è in uso."</string>
     <string name="language_settings" msgid="502219872342167227">"Lingua e tastiera"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Impostazioni lingua e tastiera"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Impostazioni internazionali (lingua e regione), di inserimento e correzione automatica del testo"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Verifica in corso"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Informazioni telefono"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Informazioni batteria"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Cronologia batteria"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Avvio rapido"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Imposta scorciatoie da tastiera per avviare le applicazioni"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Assegna applicazione"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Il debug USB è solo a scopo di sviluppo. Può servire per copiare dati tra il computer e il dispositivo, per installare applicazioni sul tuo dispositivo senza notifica e per leggere i dati dei log."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Scegli gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Scegli widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Dettagli per UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Dettagli di utilizzo della rete per <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Byte ricevuti: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Byte inviati: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Byte totali: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Dettagli di utilizzo della CPU per <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Tempo utente:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Tempo sistema:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tempo totale:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Avvii: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> g <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> m <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pacchetti che condividono questo UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Dati sull\'utilizzo della batteria non disponibili"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensore:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Wakelock parziale:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensore usato dai pacchetti:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Usato <xliff:g id="COUNT">%1$d</xliff:g> volte da <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Usato <xliff:g id="COUNT">%1$d</xliff:g> volte da uno di:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"In esecuzione"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Schermo acceso"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Cellulare acceso"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tempo trascorso senza sospensione:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tempo trascorso con schermo acceso:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tempo trascorso con cellulare acceso:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"A batteria:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Collegato:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Statistiche di utilizzo"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Statistiche di utilizzo"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Ordina per:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Consumo batteria"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Utilizzo batteria dallo scollegamento"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Utilizzo batteria dal ripristino"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> con la batteria"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> dallo scollegamento"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"In carica"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Schermo acceso"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS attivo"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Attivo"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Segnale telefono"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Tempo di attività dispositivo"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefono inattivo"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Totale CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU in primo piano"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Mantieni attivo"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefono"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Dati inviati"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batteria utilizzata da Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Disattiva Bluetooth quando non è in uso"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Prova a connetterti a un altro dispositivo Bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batteria utilizzata dalle applicazioni in esecuzione"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batteria utilizzata dall\'applicazione"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Interrompi o disinstalla l\'applicazione"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Disattiva GPS quando non è in uso"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Controlla manualmente il GPS per impedire all\'applicazione di utilizzarlo"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"L\'applicazione potrebbe offrire impostazioni per ridurre l\'utilizzo della batteria"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> dallo scollegamento"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Durante ultimo scollegamento per <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Non installata"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Femminile"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Maschile"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Controllo risparmio energia"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Aggiornamento impostazione Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Aggiornamento impostazione Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"L\'archivio di credenziali è cancellato."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"L\'archivio di credenziali è attivo."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"L\'archivio di credenziali non è attivo."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"File system crittografato"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Crittografa dati privati utente"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Abilita l\'archiviazione dei file system crittografati per i dati privati dell\'utente in questo dispositivo"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Per l\'attivazione dei file system crittografati è necessaria la cancellazione dei dati del dispositivo."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Per la disattivazione dei file system crittografati è necessaria la cancellazione dei dati del dispositivo."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Attiva"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Disattiva"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Annulla"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Modifica della modalità dei file system crittografati annullata."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Avviso file system crittografati."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tono chiamate emergenza"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Imposta il comportamento in caso di chiamata di emergenza"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacy"</string>
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
index b508452..3524fc5 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"電源接続時はスリープにしない"</item>
     <item msgid="1986753720941888596">"スリープにしない"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU使用状況"</item>
-    <item msgid="6401018715947316517">"ネットワーク使用状況"</item>
-    <item msgid="188092590354892392">"GPS使用状況"</item>
-    <item msgid="8414109131222049141">"センサー使用状況"</item>
-    <item msgid="1327904325081257093">"部分起動状況"</item>
-    <item msgid="4832254146664706277">"その他の使用状況"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"充電池使用時間"</item>
-    <item msgid="166936313535197598">"起動時間合計"</item>
-    <item msgid="4793941382744963893">"総時間"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"使用時間"</item>
     <item msgid="1908750532762193304">"起動回数"</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 0642299..afc6ad9 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"操作の選択"</string>
     <string name="device_info_label" msgid="6551553813651711205">"端末情報"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"電池情報"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"充電池データ"</string>
     <string name="display_label" msgid="7403874003169865762">"ディスプレイ"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"携帯電話情報"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SDカード"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Wi-Fiをスリープに切り替えるタイミング"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"スリープポリシーの設定で問題が発生しました。"</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MACアドレス"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IPアドレス"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP設定"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"保存"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"キャンセル"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"無線ネットワーク使用のアプリケーション(地図など)で位置を表示する"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Wi-Fi/モバイルネットワークで位置を検出する"</string>
     <string name="location_gps" msgid="6296125378829097831">"GPS機能を使用"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"高精度測位(電池の消費を節約する場合はOFFにしてください)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"高精度測位"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"高精度測位(電池消費増、電波が良好な場所で使用)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"A-GPSを使用"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"サーバーでGPSを補助します(OFFにするとネットワーク使用率が減少します)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"アプリケーション"</string>
     <string name="data_size_label" msgid="8679376373625710107">"データ"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"アンインストール"</string>
+    <string name="disable_text" msgid="6544054052049395202">"無効にする"</string>
+    <string name="enable_text" msgid="9217362512327828987">"有効にする"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"データを消去"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"アップデートのアンインストール"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"特定の操作で使用する既定アプリケーションとして設定されています。"</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"設定されていません。"</string>
     <string name="clear_activities" msgid="7408923511535174430">"設定を消去"</string>
     <string name="unknown" msgid="1592123443519355854">"不明"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"並べ替え"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"名前順に表示する"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"サイズ順"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"容量を管理"</string>
     <string name="filter" msgid="2018011724373033887">"フィルタ"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"ダウンロード済み"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"実行中"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"SDカード上"</string>
-    <string name="loading" msgid="3200408047793887917">"読み込み中..."</string>
+    <string name="disabled" msgid="9206776641295849915">"無効"</string>
+    <string name="no_applications" msgid="5190227407135243904">"アプリケーションはありません"</string>
     <string name="recompute_size" msgid="7722567982831691718">"サイズを再計算中..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"削除"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"このアプリケーションのすべてのデータ(ファイル、設定、アカウント、データベースを含む)が完全に削除されます。"</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"指定したインストール先が無効です。"</string>
     <string name="system_package" msgid="1030561474413022831">"システムアップデートは外部メディアにはインストールできません。"</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"強制停止"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"このアプリケーションはすぐに再起動されます。強制停止してもよろしいですか?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"アプリケーションを強制終了すると正常に動作しない場合があります。終了してもよろしいですか?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"アプリケーションを移動"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"アプリケーションを移動できません。<xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"優先インストール先"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"新しいアプリケーションの優先インストール先を変更する"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"ストレージ使用状況"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"実行中のサービス"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"現在実行中のサービスを表示して制御する"</string>
     <string name="service_restarting" msgid="2242747937372354306">"再起動中"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"実行中のサービスはありません"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"サービスを停止しますか?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"このサービスは、再起動するまで実行されません。アプリケーション<xliff:g id="APPLICATION">%1$s</xliff:g>にとって望ましくない結果になることがあります。"</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"停止"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"キャンセル"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"アプリケーションから起動: 停止するにはタップしてください"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: タップして管理"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"空き: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g>(<xliff:g id="COUNT">%1$d</xliff:g>)"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"その他: <xliff:g id="MEMORY">%2$s</xliff:g>(<xliff:g id="COUNT">%1$d</xliff:g>)"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"プロセス: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"実行中のサービスはありません"</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"アプリケーションによって起動されたサービス。"</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"空きメモリ: <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"使用メモリ: <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g>のプロセスと<xliff:g id="NUMSERVICES">%2$d</xliff:g>のサービス"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g>のプロセスと<xliff:g id="NUMSERVICES">%2$d</xliff:g>のサービス"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g>のプロセスと<xliff:g id="NUMSERVICES">%2$d</xliff:g>のサービス"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g>のプロセスと<xliff:g id="NUMSERVICES">%2$d</xliff:g>のサービス"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"実行中のアプリケーション"</string>
+    <string name="no_services" msgid="7133900764462288263">"アクティブなサービスはありません"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"サービス"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"プロセス"</string>
+    <string name="service_stop" msgid="6369807553277527248">"停止"</string>
+    <string name="service_manage" msgid="1876642087421959194">"設定"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"このサービスはアプリケーションによって起動されました。停止するとアプリケーションに問題が発生するおそれがあります。"</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"このアプリケーションを安全に停止できません。停止すると現在の作業が一部失われるおそれがあります。"</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: 現在使用中です。管理するには[設定]をタップしてください。"</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"使用中のメインプロセスです。"</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"サービス<xliff:g id="COMP_NAME">%1$s</xliff:g>は使用中です。"</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"プロバイダ<xliff:g id="COMP_NAME">%1$s</xliff:g>は使用中です。"</string>
     <string name="language_settings" msgid="502219872342167227">"言語とキーボード"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"言語とキーボードの設定"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"言語と地域、文字入力の設定"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"テスト中"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"携帯電話情報"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"電池情報"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"充電池データ"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"クイック起動"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"アプリケーションの起動にショートカットキーを割り当てる"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"アプリを選択"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USBデバッグは開発専用に設計されています。コンピュータと端末の間でデータをコピーする場合、アプリケーションを通知なしで端末にインストールする場合、ログ データを読み取る場合に使用できます。"</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"ガジェットを選択"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"ウィジェットを選択"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"UID <xliff:g id="NUMBER">%d</xliff:g>の詳細"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"<xliff:g id="APP_NAME">%1$s</xliff:g>のネットワーク使用詳細:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"受信バイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"送信済みバイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"合計バイト数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"<xliff:g id="APP_NAME">%1$s</xliff:g>のCPU使用詳細:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"ユーザー利用時間:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"システム利用時間:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"合計時間:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"起動: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間<xliff:g id="MINUTES">%3$d</xliff:g>分<xliff:g id="SECONDS">%4$d</xliff:g>秒"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分<xliff:g id="SECONDS">%3$d</xliff:g>秒"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"このUIDを共有するパッケージ:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"充電池使用データなし"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"センサー:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"部分起動ロック:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"パッケージで使用されるセンサー:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="PACKAGE">%2$s</xliff:g>により<xliff:g id="COUNT">%1$d</xliff:g>回使用"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"次のいずれかにより<xliff:g id="COUNT">%1$d</xliff:g>回使用:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"実行中"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"画面点灯"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"電源ON"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"実動時間(スリープ除く):"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"画面バックライトの点灯時間:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"端末電源入の時間:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"充電池使用:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"電源接続:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"使用統計情報"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"使用統計情報"</string>
     <string name="display_order_text" msgid="8592776965827565271">"並べ替え:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"電池を使用している操作"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"電池使用時間"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"リセット後の電池使用量"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"電池使用時間: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"電池使用時間: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"充電中"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"画面点灯"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPSがON"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"スリープなし"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"電波状態"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"端末使用時間"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"アイドル状態"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU合計"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPUフォアグラウンド"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"スリープモードにしない"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"電話"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"送信されたデータ"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Bluetoothの電池使用量"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"未使用時はBluetoothをOFFにします"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"別のBluetooth端末に接続してみてください"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"アプリケーションの実行時の電池使用量"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"アプリケーションの電池使用量"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"アプリケーションを停止またはアンインストールします"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"未使用時はGPSをOFFにします"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"GPSをアプリケーションが使用しないように手動で管理する"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"アプリケーション側の設定で電池使用量を抑えられる場合があります"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"電池使用時間: <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"電池使用時間: <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"未インストール"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"女性"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"男性"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"電源管理"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Wi-Fi設定の更新"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Bluetooth設定の更新"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"認証情報ストレージが消去されました。"</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"認証情報ストレージが有効になりました。"</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"認証情報ストレージが無効になりました。"</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"暗号化ファイルシステム"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"個人データの暗号化"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"この携帯電話の個人データを格納するために暗号化ファイルシステムを有効にする"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"暗号化ファイルシステムを有効にするには、携帯電話データの消去が必要です。"</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"暗号化ファイルシステムを無効にするには、携帯電話データの消去が必要です。"</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"有効にする"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"無効にする"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"キャンセル"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"暗号化ファイルシステムのモードの変更がキャンセルされました。"</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"暗号化ファイルシステムの警告。"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"緊急時の音"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"緊急通報時の動作を設定します"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"プライバシー"</string>
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index 5d6e854..494a946 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"전원에 연결되었을 때는 절전 모드로 전환되지 않음"</item>
     <item msgid="1986753720941888596">"절전 모드로 전환 안함"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU 사용량"</item>
-    <item msgid="6401018715947316517">"네트워크 사용량"</item>
-    <item msgid="188092590354892392">"GPS 사용량"</item>
-    <item msgid="8414109131222049141">"센서 사용량"</item>
-    <item msgid="1327904325081257093">"부분 가동 사용량"</item>
-    <item msgid="4832254146664706277">"기타 사용량"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"마지막으로 플러그를 뽑은 이후"</item>
-    <item msgid="166936313535197598">"부팅 후 총 사용 시간"</item>
-    <item msgid="4793941382744963893">"총 사용 시간"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"사용 시간"</item>
     <item msgid="1908750532762193304">"계수 시작"</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 59bf85d..16a12e0 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"활동 선택"</string>
     <string name="device_info_label" msgid="6551553813651711205">"장치정보"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"배터리 정보"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"배터리 기록"</string>
     <string name="display_label" msgid="7403874003169865762">"디스플레이"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"휴대전화 정보"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD 카드"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Wi-Fi에서 모바일 데이터로 전환될 때 표시"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"절전 정책을 설정하는 동안 문제가 발행했습니다."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC 주소"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP 주소"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP 설정"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"저장"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"취소"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"무선 네트워크를 사용하는 애플리케이션(예: 지도)에서 위치 보기"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Wi-Fi 및/또는 모바일 네트워크에서 측정된 위치"</string>
     <string name="location_gps" msgid="6296125378829097831">"GPS 위성 사용"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"도로 수준으로 정확하게 탐색(배터리를 절약하려면 선택 취소)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"도로 수준으로 정확하게 탐색"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"도로 수준으로 탐색(항공사진이 더해져 배터리 추가로 필요)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"GPS 도우미 사용"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"서버를 사용하여 GPS 보조(네트워크 사용량을 줄이려면 선택 취소)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"애플리케이션"</string>
     <string name="data_size_label" msgid="8679376373625710107">"데이터"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"제거"</string>
+    <string name="disable_text" msgid="6544054052049395202">"사용 안함"</string>
+    <string name="enable_text" msgid="9217362512327828987">"사용"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"데이터 지우기"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"업데이트 제거"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"이 애플리케이션을 해당 작업에 대한 기본 프로그램으로 실행하도록 선택했습니다."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"기본값이 설정되지 않았습니다."</string>
     <string name="clear_activities" msgid="7408923511535174430">"기본 작업 지우기"</string>
     <string name="unknown" msgid="1592123443519355854">"알 수 없음"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"정렬"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"이름별 정렬"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"크기별 정렬"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"공간 관리"</string>
     <string name="filter" msgid="2018011724373033887">"필터"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"다운로드됨"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"실행 중"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"SD 카드"</string>
-    <string name="loading" msgid="3200408047793887917">"로드 중..."</string>
+    <string name="disabled" msgid="9206776641295849915">"사용 안함"</string>
+    <string name="no_applications" msgid="5190227407135243904">"애플리케이션이 없습니다."</string>
     <string name="recompute_size" msgid="7722567982831691718">"크기 다시 계산 중..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"삭제"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"애플리케이션의 전체 데이터가 영구적으로 삭제됩니다. 여기에는 모든 파일, 설정, 계정, 데이터베이스 등이 포함됩니다."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"지정된 설치 위치가 잘못되었습니다."</string>
     <string name="system_package" msgid="1030561474413022831">"외부 미디어에 시스템 업데이트를 설치할 수 없습니다. "</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"강제 종료"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"애플리케이션은 바로 다시 시작됩니다. 강제로 종료하시겠습니까?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"강제로 애플리케이션을 종료하면 예기치 않은 오류가 발생할 수 있습니다. 계속하시겠습니까?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"애플리케이션 이동"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"애플리케이션을 이동하지 못했습니다. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"기본 설치 위치"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"새 애플리케이션에 대한 기본 설치 위치를 변경합니다."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"저장공간 사용량"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"실행 중인 서비스"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"현재 실행 중인 서비스 보기 및 제어"</string>
     <string name="service_restarting" msgid="2242747937372354306">"다시 시작하는 중"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"실행 중인 서비스 없음"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"서비스를 중지할까요?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"다시 시작할 때까지 서비스가 더 이상 실행되지 않습니다. 이로 인해 <xliff:g id="APPLICATION">%1$s</xliff:g> 애플리케이션에서 원하지 않는 결과가 발생할 수 있습니다."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"중지"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"취소"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"애플리케이션에서 시작: 중지하려면 터치"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: 관리하려면 터치"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"사용: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g>(<xliff:g id="COUNT">%1$d</xliff:g>개 프로세스)"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"기타: <xliff:g id="MEMORY">%2$s</xliff:g>(<xliff:g id="COUNT">%1$d</xliff:g>개 프로세스)"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"프로세스: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"실행 중인 서비스가 없습니다."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"애플리케이션에서 시작했습니다."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> 사용 가능"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> 사용 중"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"프로세스 <xliff:g id="NUMPROCESS">%1$d</xliff:g>개 및 서비스 <xliff:g id="NUMSERVICES">%2$d</xliff:g>개"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"프로세스 <xliff:g id="NUMPROCESS">%1$d</xliff:g>개 및 서비스 <xliff:g id="NUMSERVICES">%2$d</xliff:g>개"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"프로세스 <xliff:g id="NUMPROCESS">%1$d</xliff:g>개 및 서비스 <xliff:g id="NUMSERVICES">%2$d</xliff:g>개"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"프로세스 <xliff:g id="NUMPROCESS">%1$d</xliff:g>개 및 서비스 <xliff:g id="NUMSERVICES">%2$d</xliff:g>개"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"실행 중인 애플리케이션"</string>
+    <string name="no_services" msgid="7133900764462288263">"사용중인 서비스 없음"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"서비스"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"프로세스"</string>
+    <string name="service_stop" msgid="6369807553277527248">"중지"</string>
+    <string name="service_manage" msgid="1876642087421959194">"설정"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"이 서비스는 해당 애플리케이션에서 시작했습니다. 중지할 경우 애플리케이션에 장애가 발생할 수 있습니다."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"이 애플리케이션을 안전하게 중지할 수 없습니다. 중지할 경우 현재 작업의 일부가 유실될 수 있습니다."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>이(가) 현재 사용 중입니다. 조정하려면 설정을 터치하세요."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"사용 중인 기본 프로세스입니다."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"서비스 <xliff:g id="COMP_NAME">%1$s</xliff:g>이(가) 사용 중입니다."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"제공업체(<xliff:g id="COMP_NAME">%1$s</xliff:g>)를 사용 중입니다."</string>
     <string name="language_settings" msgid="502219872342167227">"언어 및 키보드"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"언어 및 키보드 설정"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"로케일(언어 및 지역), 텍스트 입력 및 자동 수정 옵션 설정"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"테스트 중"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"휴대전화 정보"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"배터리 정보"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"배터리 기록"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"빠른실행"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"애플리케이션을 실행하는 바로가기 설정"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"애플리케이션 할당"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB 디버깅은 개발용으로만 설계되었습니다. 이 기능을 사용하면 컴퓨터와 장치 간에 데이터를 복사하고 알림 없이 장치에 애플리케이션을 설치하며 로그 데이터를 읽을 수 있습니다."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"가젯 선택"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"위젯 선택"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"UID <xliff:g id="NUMBER">%d</xliff:g>의 세부정보"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 네트워크 사용 세부정보"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"받은 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"보낸 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"총 바이트 수: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 CPU 사용 세부정보"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"사용자 시간:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"시스템 시간:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"시간 합계:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"시작: <xliff:g id="STARTS">%1$d</xliff:g>번"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간 <xliff:g id="MINUTES">%3$d</xliff:g>분 <xliff:g id="SECONDS">%4$d</xliff:g>초"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분 <xliff:g id="SECONDS">%3$d</xliff:g>초"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"이 UID를 공유하는 패키지"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"배터리 사용 데이터가 없습니다."</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"센서:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"부분적 가동 잠금:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"패키지가 사용한 센서:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="PACKAGE">%2$s</xliff:g>에서 <xliff:g id="COUNT">%1$d</xliff:g>번 사용"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"다음 중 하나가 <xliff:g id="COUNT">%1$d</xliff:g>번 사용:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"실행 중"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"화면 켜짐"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"휴대전화 켜짐"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"절전 모드로 전환되지 않고 사용한 시간:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"화면을 켠 상태에서 소비한 시간:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"휴대전화가 켜진 상태로 사용한 시간:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"배터리 켜짐 시간: "</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"연결됨:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"사용 통계"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"사용 통계"</string>
     <string name="display_order_text" msgid="8592776965827565271">"정렬 기준:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"배터리를 사용한 항목"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"플러그를 뽑은 이후 배터리 전원 사용"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"재설정 이후 배터리 사용"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"배터리 사용 시간: <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"플러그를 뽑은 후 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"충전 중"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"화면 켜짐"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS 사용"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"켜짐"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"신호 강도"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"장치 무중단 가동 시간"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"휴대전화 유휴 상태"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"총 CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU 포그라운드"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"켜진 상태로 유지"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"휴대전화"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"보낸 데이터"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"블루투스에서 배터리 사용"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"사용 중이 아닐 때에는 Bluetooth 끄기"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"다른 블루투스 장치로 연결 시도"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"실행 중에 애플리케이션에서 배터리 사용"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"애플리케이션 배터리 사용량"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"애플리케이션 중지 또는 제거"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"사용 중이 아닌 경우 GPS 사용 안함"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"애플리케이션이 GPS를 사용할 수 없도록 수동으로 제어"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"애플리케이션에서 배터리 사용을 줄일 수 있는 설정을 제공할 수 있습니다."</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"플러그를 뽑은 후 <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"마지막으로 플러그를 뽑은 이후 <xliff:g id="UNPLUGGED">%1$s</xliff:g> 동안"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"설치되지 않음"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"여성"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"남성"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"전원 컨트롤"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Wi-Fi 설정 업데이트"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"블루투스 설정 업데이트"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"자격증명 저장소가 삭제되었습니다."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"자격증명 저장소를 사용합니다."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"자격증명 저장소를 사용 중지했습니다."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"암호화된 파일 시스템"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"비공개 사용자 데이터 암호화"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"기기의 비공개 사용자 데이터에 대해 암호화된 파일 시스템 저장소 사용"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"암호화된 파일 시스템을 사용하려면 기기 데이터를 지워야 합니다."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"암호화된 파일 시스템의 사용을 중지하려면 기기 데이터를 지워야 합니다."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"사용"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"사용 중지"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"취소"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"암호화된 파일 시스템 모드 변경이 취소되었습니다."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"암호화된 파일 시스템 경고"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"긴급 신호음"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"긴급 통화 중 동작 설정"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"개인정보 보호"</string>
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
index 9631987..4612b8c 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Aldri når tilkoblet"</item>
     <item msgid="1986753720941888596">"Aldri"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU-bruk"</item>
-    <item msgid="6401018715947316517">"Nettverksbruk"</item>
-    <item msgid="188092590354892392">"GPS-bruk"</item>
-    <item msgid="8414109131222049141">"Sensorbruk"</item>
-    <item msgid="1327904325081257093">"Delvis våken bruk"</item>
-    <item msgid="4832254146664706277">"Annen bruk"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Siden sist uten strøm"</item>
-    <item msgid="166936313535197598">"Totalt siden oppstart"</item>
-    <item msgid="4793941382744963893">"Totalt hele tiden"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Brukstid"</item>
     <item msgid="1908750532762193304">"Start telling"</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 92e4364..36d23ea 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Velg aktivitet"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Enhetsinformasjon"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Batteriinformasjon"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Batterihistorikk"</string>
     <string name="display_label" msgid="7403874003169865762">"Skjerm"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefoninformasjon"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Minnekort"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Spesifiser når telefonen skal bytte fra trådløsnett til mobiltelefonidata"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Det oppsto et problem under setting av soveinnstilling."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC-adresse"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-adresse"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP-innstillinger"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Lagre"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Avbryt"</string>
@@ -444,7 +444,7 @@
     <string name="dock_audio_summary_unknown" msgid="4465059868974255693">"Innstillinger for festet forankring"</string>
     <string name="dock_not_found_title" msgid="3290961741828952424">"Finner ikke forankringsstasjon"</string>
     <string name="dock_not_found_text" msgid="3035260358985111855">"Telefonen må være plassert i forankringsstasjonen for å konfigurere forankringslyden"</string>
-    <string name="dock_sounds_enable_title" msgid="3659084028644948905">"Lyd ved innsetting i forankringsstasjon"</string>
+    <string name="dock_sounds_enable_title" msgid="3659084028644948905">"Lyd ved innsetting"</string>
     <string name="dock_sounds_enable_summary_on" msgid="8491180514199743771">"Spill av lyd når telefonen settes inn eller tas ut av forankringsstasjonen"</string>
     <string name="dock_sounds_enable_summary_off" msgid="3151046599205265919">"Ikke spill av lyd når telefonen settes inn eller tas ut av forankringsstasjonen"</string>
     <string name="sync_settings" msgid="9186125469300013491">"Kontoer/synkronisering"</string>
@@ -590,7 +590,7 @@
     <string name="call_settings_summary" msgid="7291195704801002886">"Telefonsvarer, viderekobling, samtale venter, nummervisning"</string>
     <string name="tether_settings_title_usb" msgid="4315031513434087777">"Tilknytning"</string>
     <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Flyttbar trådløs sone"</string>
-    <string name="tether_settings_title_both" msgid="2734066355556891504">"Tilknytning og flyttbar trådløs sone"</string>
+    <string name="tether_settings_title_both" msgid="2734066355556891504">"Tilknytning og trådløs sone"</string>
     <string name="tether_settings_summary_usb" msgid="3562431455625637370">"Del mobilens datatilkobling via USB-tilknytning"</string>
     <string name="tether_settings_summary_wifi" msgid="4690912027002467246">"Del telefonens datatilkobling via en flyttbar trådløs sone"</string>
     <string name="tether_settings_summary_both" msgid="7460063951190682635">"Del telefonens datatilkobling via USB eller en flyttbar trådløs sone"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Se plassering i applikasjoner (som kart) ved hjelp av trådløse nettverk"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Plassering bestemmes ved hjelp av trådløse og/eller mobile nettverk"</string>
     <string name="location_gps" msgid="6296125378829097831">"Bruk GPS-satellitter"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Nøyaktig til gatenivå (slå av for å spare batteri)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Nøyaktig til gatenivå"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Finn plassering på gatenivå (bruker mer batteri, og trenger fri sikt til himmelen)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Aktiver GPS med hjelp"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Bruk tjener til å hjelpe GPS (opphev for å redusere nettverksbruken)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Applikasjon"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Data"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Avinstaller"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Deaktiver"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Aktiver"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Fjern data"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Avinstaller oppdateringer"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Du har valgt å starte denne applikasjonen som standard for noen handlinger."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Ingen standardvalg satt."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Fjern standardvalg"</string>
     <string name="unknown" msgid="1592123443519355854">"Ukjent"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sorter"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Sorter etter navn"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Sorter etter størrelse"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Styr plass"</string>
     <string name="filter" msgid="2018011724373033887">"Filter"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Tredjeparts"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Kjører"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"På minnekort"</string>
-    <string name="loading" msgid="3200408047793887917">"Laster…"</string>
+    <string name="disabled" msgid="9206776641295849915">"Deaktivert"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Ingen programmer."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Beregner størrelse på nytt…"</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Slett"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"All informasjon du har lagret i denne applikasjonen vil bli fjernet permanent."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Den angitte installasjonsplasseringen er ikke gyldig."</string>
     <string name="system_package" msgid="1030561474413022831">"Systemoppdateringer kan ikke installeres på eksterne medier."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Tving avslutning"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Programmet startes på nytt med en gang. Er du sikker på at du vil avslutte?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Hvis du slår av et program ved tvang, kan det slutte å fungere. Er du sikker på at du vil fortsette?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Flytt program"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Fikk ikke flyttet programmet. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Foretrukket installeringssted"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Endre foretrukket plassering for installasjon av nye programmer."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Bruk av lagringsplass"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Kjørende tjenester"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Vis og kontroller tjenester som kjører for øyeblikket"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Starter på nytt"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Ingen kjørende tjenester"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Stoppe tjenesten?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Tjenesten kjører ikke før den startes på nytt. Dette kan føre til uønskede konsekvenser for <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Stopp"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Avbryt"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Startet av applikasjon: trykk for å stoppe"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: trykk for å endre"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Tilgj.:<xliff:g id="FREE">%2$s</xliff:g> + <xliff:g id="MEMORY">%3$s</xliff:g> i <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Andre: <xliff:g id="MEMORY">%2$s</xliff:g> (<xliff:g id="COUNT">%1$d</xliff:g> pros.)"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Prosess: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Ingenting kjører."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Startet av program."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> tilgjengelig"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> i bruk"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> prosess og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjeneste"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> prosesser og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjenester"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> prosesser og <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjeneste"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g><xliff:g id="NUMSERVICES">%2$d</xliff:g> prosesser og tjenester"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Programmet som kjører"</string>
+    <string name="no_services" msgid="7133900764462288263">"Ikke aktiv"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Tjenester"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Prosesser"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Stopp"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Innstillinger"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Denne tjenesten ble startet av det tilhørende programmet. Hvis du stopper tjenesten, er det ikke sikkert programmet fungerer slik det skal."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Dette programmet kan ikke stoppes på en trygg måte. Noe av arbeidet ditt kan gå tapt."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: for øyeblikket i bruk. Berør Innstillinger for å endre."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Hovedprosess som er i bruk."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Tjenesten <xliff:g id="COMP_NAME">%1$s</xliff:g> er i bruk."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Leverandøren <xliff:g id="COMP_NAME">%1$s</xliff:g> er i bruk."</string>
     <string name="language_settings" msgid="502219872342167227">"Språk og tastatur"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Språk og tastatur"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Innstillinger for språk, region, skriving av tekst og feilretting"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testing"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefoninformasjon"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Batteriinformasjon"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Batterihistorikk"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Hurtigtaster"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Tastatursnarveier for å starte applikasjoner"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Tilordne applikasjon"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB-debugging er kun ment for utviklere. Det kan brukes for å kopiere data mellom datamaskinen og telefonen, installere applikasjoner på telefonen i det stille, og lese loggdata."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Velg gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Velg skrivebordselement"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detaljer for UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Nettbruk av <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Byte mottatt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Byte sendt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Totalt antall byte: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"CPU-bruk av <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Brukertid:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systemtid:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Total tid:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Oppstarter: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>t <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>t <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pakker som deler denne UID-en:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Ingen batterihistorikk tilgjengelig"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Delvis våkelås:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor brukt av pakker:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Brukt <xliff:g id="COUNT">%1$d</xliff:g> ganger av <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Brukt <xliff:g id="COUNT">%1$d</xliff:g> ganger av en av:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Kjørende"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Skjerm på"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon på"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tid brukt uten å sove:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tid brukt med skjermen på:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tid brukt med telefonen på:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"På batteri:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"På nettstrøm:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Bruksstatistikk"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Bruksstatistikk"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sorter etter:"</string>
@@ -859,13 +852,20 @@
     <string name="accessibility_service_no_apps_title" msgid="898893674114288531">"Finner ingen tilgjengelighetsprogrammer"</string>
     <string name="accessibility_service_no_apps_message" msgid="2450056749545404807">"Du har ikke installert et tilgjengelighetsprogram."\n\n"Du kan laste ned en skjermleser for enheten på Android-markedet."\n\n"Klikk på OK for å installere skjermleseren."</string>
     <string name="accessibility_power_button_category" msgid="8545885236482339928">"På/av-knapp"</string>
-    <string name="accessibility_power_button_ends_call" msgid="7698764194501089533">"Avslutt samtale med på/av-knappen"</string>
+    <string name="accessibility_power_button_ends_call" msgid="7698764194501089533">"Legg på med på/av"</string>
     <string name="accessibility_power_button_ends_call_summary" msgid="8878097632186291462">"Ved å trykke på av-knappen under en samtale, avsluttes samtalen i stedet for at skjermen slås av"</string>
     <string name="power_usage_summary_title" msgid="5180282911164282324">"Batteribruk"</string>
     <string name="power_usage_summary" msgid="7237084831082848168">"Hva som har brukt batteri"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Batteribruk siden strømmen ble trukket ut"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Batteribruk siden omstart"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> på batteri"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> siden strømmen ble frakoblet"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Lader"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Skjerm på"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS på"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Trådløst nettverk"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktiv"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefonsignal"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Tid enheten har vært våken"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefonen ikke i bruk"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Prosessor totalt"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"Prosessor i forgrunnen"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Behold aktiv"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Data sendt"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batteri brukt av Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Slå av Bluetooth når det ikke er i bruk"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Prøv å koble til en annen Bluetooth-enhet"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batteri brukt av applikasjoner som ikke kjøres"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batteri brukt av program"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Stopp eller avinstaller applikasjonen"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Skru av GPS når den ikke er i bruk"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Kontroller GPS manuelt, for å forhindre at programmer bruker funksjonen"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Applikasjonen har muligens innstillinger som kan redusere batteribruken"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> siden strømmen ble frakoblet"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Siste gang uten strøm i <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Ikke installert"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Kvinne"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Mann"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Strømkontroll"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Oppdaterer innstilling for Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Oppdatere Bluetooth-innstilling"</string>
@@ -1068,13 +1073,23 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Akkreditivlageret ble tømt."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Akkreditivlageret er aktivert."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Akkreditivlageret er deaktivert."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Kryptert filsystem"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Krypter private brukerdata"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Aktiver lagring av krypterte filer for private brukerdata på denne enheten"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Aktivering av krypterte filsystemer krever en fullstendig datarensing."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Deaktivering av krypterte filsystemer krever en fullstendig datarensing."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Aktiver"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Deaktiver"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Avbryt"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Endring av modus for kryptert filsystem er avbrutt."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Advarsel om kryptert filsystem."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Nødtone"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Velg oppførsel når en nødsamtale opprettes"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Personvern"</string>
     <string name="privacy_settings_title" msgid="1987089301293213705">"Personverninnstillinger"</string>
     <string name="backup_section_title" msgid="8856083167469467588">"Sikkerhetskopiering og gjenoppretting"</string>
     <string name="personal_data_section_title" msgid="7815209034443782061">"Personlige data"</string>
-    <string name="backup_data_title" msgid="1239105919852668016">"Sikkerhetskopier dataene"</string>
+    <string name="backup_data_title" msgid="1239105919852668016">"Sikkerhetskopier data"</string>
     <string name="backup_data_summary" msgid="5662190190240860035">"Sikkerhetskopier innstillingene og andre programdata."</string>
     <string name="auto_restore_title" msgid="5397528966329126506">"Auto-gjenoppretting"</string>
     <string name="auto_restore_summary" msgid="6867766474057290177">"Gjenopprett sikkerhetskopierte innstillinger og andre data hvis jeg installerer et program på nytt."</string>
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index de010e5..95050d5 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nooit indien aangesloten"</item>
     <item msgid="1986753720941888596">"Nooit"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU-gebruik"</item>
-    <item msgid="6401018715947316517">"Netwerkgebruik"</item>
-    <item msgid="188092590354892392">"GPS-gebruik"</item>
-    <item msgid="8414109131222049141">"Sensorgebruik"</item>
-    <item msgid="1327904325081257093">"Gedeeltelijk wake-gebruik"</item>
-    <item msgid="4832254146664706277">"Ander gebruik"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Sinds laatste keer losgekoppeld"</item>
-    <item msgid="166936313535197598">"Totaal sinds opstarten"</item>
-    <item msgid="4793941382744963893">"Totaal voor altijd"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Gebruikstijd"</item>
     <item msgid="1908750532762193304">"Aantal keer gestart"</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index c8f7d65..d276358 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Activiteit selecteren"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Apparaatinfo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Accu-info"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Accugeschiedenis"</string>
     <string name="display_label" msgid="7403874003169865762">"Weergave"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefooninfo"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD-kaart"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Overschakelen opgeven van Wi-Fi naar mobiele gegevens"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Er is een probleem opgetreden bij het instellen van het slaapbeleid."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC-adres"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-adres"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP-instellingen"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Opslaan"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Annuleren"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Locatie in toepassingen (zoals Maps) bekijken via draadloze netwerken"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Locatie bepaald door Wi-Fi en/of mobiele netwerken"</string>
     <string name="location_gps" msgid="6296125378829097831">"GPS-satellieten"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Locatie tot op straatniveau (uitschakelen om acculading te sparen)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Bij lokaliseren nauwkeurig tot straatniveau"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Locatie bepalen tot op straatniveau (meer stroom nodig en luchtweergave)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Ondersteunde GPS gebruiken"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Server gebruiken ter ondersteuning van GPS (uitschakelen om het netwerkgebruik te beperken)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Toepassing"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Gegevens"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Verwijderen"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Uitschakelen"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Inschakelen"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Gegevens wissen"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Updates verwijderen"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"U heeft ervoor gekozen om deze toepassing standaard te starten voor bepaalde acties."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Geen standaardwaarden ingesteld."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Standaardwaarden wissen"</string>
     <string name="unknown" msgid="1592123443519355854">"Onbekend"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sorteren"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Sorteren op naam"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Sorteren op grootte"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Ruimte beheren"</string>
     <string name="filter" msgid="2018011724373033887">"Filter"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Gedownload"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Wordt uitgevoerd"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Op SD-kaart"</string>
-    <string name="loading" msgid="3200408047793887917">"Laden..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Uitgeschakeld"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Geen toepassingen."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Grootte opnieuw berekenen..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Verwijderen"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Alle gegevens van deze toepassing worden permanent verwijderd. Dit omvat alle bestanden, instellingen, accounts, databases, enzovoort."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"De opgegeven installatielocatie is niet geldig."</string>
     <string name="system_package" msgid="1030561474413022831">"Systeemupdates kunnen niet worden geïnstalleerd op externe media."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Gedwongen stoppen"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Deze toepassing wordt onmiddellijk opnieuw gestart. Weet u zeker dat u gedwongen wilt stoppen?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Als u een toepassing geforceerd stopt, kan de toepassing zich onverwacht gedragen. Weet u het zeker?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Toepassing verplaatsen"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Verplaatsen van toepassing is mislukt. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Voorkeursinstallatielocatie"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"De voorkeursinstallatielocatie voor nieuwe toepassingen wijzigen."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Opslaggebruik"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Actieve services"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Services die momenteel actief zijn, weergeven en beheren"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Opnieuw starten"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Er zijn geen actieve services"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Service stopzetten?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"De service wordt niet langer uitgevoerd totdat deze opnieuw wordt gestart. Dit heeft mogelijk nadelige gevolgen voor de toepassing <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Stoppen"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Annuleren"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Gestart door toepassing: aanraken om te stoppen"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: aanraken om te beheren"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Beschikbaar: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Overig: <xliff:g id="MEMORY">%2$s</xliff:g> in <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proces: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Niets wordt uitgevoerd."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Gestart door toepassing."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> beschikbaar"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> in gebruik"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proces en <xliff:g id="NUMSERVICES">%2$d</xliff:g> service"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> proces en <xliff:g id="NUMSERVICES">%2$d</xliff:g> services"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processen en <xliff:g id="NUMSERVICES">%2$d</xliff:g> service"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processen en <xliff:g id="NUMSERVICES">%2$d</xliff:g> services"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Uitgevoerde toepassing"</string>
+    <string name="no_services" msgid="7133900764462288263">"Niet actief"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Services"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processen"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Stoppen"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Instellingen"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Deze service is gestart door de toepassing. Als de service wordt gestopt, kan de toepassing vastlopen."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Deze toepassing kan niet veilig worden gestopt. Als de toepassing wordt gestopt, kunt u een deel van uw huidige werk kwijtraken."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: momenteel in gebruik. Raak \'Instellingen\' aan om dit te bedienen."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Hoofdproces dat in gebruik is."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Service <xliff:g id="COMP_NAME">%1$s</xliff:g> in gebruik."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Provider <xliff:g id="COMP_NAME">%1$s</xliff:g> in gebruik."</string>
     <string name="language_settings" msgid="502219872342167227">"Taal en toetsenbord"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Taal- en toetsenbordinstellingen"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Instellingen voor taal en regio, tekstinvoer en autocorrectieopties opgeven"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testen"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefooninformatie"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Accu-informatie"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Accugeschiedenis"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Snelstarten"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Sneltoetsen instellen voor starten toepassingen"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Toepassing toewijzen"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB-foutopsporing is alleen bedoeld voor ontwikkelingsdoeleinden. Het kan worden gebruikt om gegevens te kopiëren tussen uw computer en uw apparaat, om toepassingen zonder melding op uw apparaat te installeren en om loggegevens te lezen."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Gadget kiezen"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Widget kiezen"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Details voor UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Netwerkgebruiksdetails voor <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Bytes ontvangen: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Bytes verzonden: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Totaal aantal bytes: <xliff:g id="BYTES">%1$d</xliff:g>\n"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"CPU-gebruiksdetails voor <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Gebruikerstijd:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systeemtijd:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Totale tijdsduur:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Aantal keren gestart: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>u <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>u <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pakketten die deze UID delen:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Er zijn geen beschikbare gebruiksgegevens van de accu"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Gedeeltelijke wakelock:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"De sensor wordt gebruikt door de volgende pakketten:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="COUNT">%1$d</xliff:g> keer gebruikt door <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"<xliff:g id="COUNT">%1$d</xliff:g> keer gebruikt door een van de volgende:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Wordt uitgevoerd"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Scherm aan"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefoon aan"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tijd verstreken zonder slaapstand:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tijd verstreken met scherm aan:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tijd verstreken met telefoon aan:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Op accu:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Opladen:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Gebruiksstatistieken"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Gebruiksstatistieken"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sorteren op:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Waarvoor de accu is gebruikt"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Accugebruik sinds losgekoppeld"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Accugebruik sinds herstel"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> op accu"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> sinds losgekoppeld"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Opladen"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Scherm aan"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS ingeschakeld"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Ingeschakeld"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefoonsignaal"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Stand-bytijd apparaat"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefoon inactief"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU-totaal"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU op voorgrond"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Ingeschakeld houden"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefoon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Gegevens verzonden"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Accu gebruikt door Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Schakel Bluetooth uit wanneer u deze functie niet gebruikt"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Probeer verbinding te maken met een ander Bluetooth-apparaat"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Accu gebruikt door actieve toepassingen"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Accu gebruikt door toepassing"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"De toepassing stoppen of verwijderen"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Schakel GPS uit wanneer u dit niet gebruikt"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"GPS handmatig beheren om te voorkomen dat de toepassing hiervan gebruikmaakt"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"De toepassing kan instellingen aanbieden om het accugebruik te beperken"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> sinds losgekoppeld"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Sinds laatst losgekoppeld voor <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Niet geïnstalleerd"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Vrouw"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Man"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Energiebeheer"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Wi-Fi-instelling bijwerken"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Bluetooth-instelling bijwerken"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"De opslag van referenties is gewist."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"De opslag van referenties is ingeschakeld."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"De opslag van referenties is uitgeschakeld."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Gecodeerde bestandssysteem"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Persoonlijke gebruikersgegevens coderen"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Gecodeerde bestandssysteemopslag voor persoonlijke gebruikersgegevens inschakelen op dit apparaat"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Voor het inschakelen van gecodeerde bestandssystemen is het wissen van apparaatgegevens vereist."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Voor het uitschakelen van gecodeerde bestandssystemen is het wissen van apparaatgegevens vereist."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Inschakelen"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Uitschakelen"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Annuleren"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Het wijzigen van de gecodeerde bestandssysteemmodus is geannuleerd."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Waarschuwing voor gecodeerde bestandssystemen."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Toon voor noodoproep"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Gedrag bij noodoproepen instellen"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacy"</string>
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index 2fb3c7e..5419716 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nigdy, gdy podłączony"</item>
     <item msgid="1986753720941888596">"Nigdy"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Wykorzystanie procesora"</item>
-    <item msgid="6401018715947316517">"Wykorzystanie sieci"</item>
-    <item msgid="188092590354892392">"Wykorzystanie modułu GPS"</item>
-    <item msgid="8414109131222049141">"Wykorzystanie czujnika"</item>
-    <item msgid="1327904325081257093">"Wykorzystanie przy częściowym wybudzeniu"</item>
-    <item msgid="4832254146664706277">"Inne wykorzystanie"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Od ostatniego odłączenia"</item>
-    <item msgid="166936313535197598">"Łącznie od uruchomienia"</item>
-    <item msgid="4793941382744963893">"Łącznie przez cały czas"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Czas użycia"</item>
     <item msgid="1908750532762193304">"Licznik uruchomień"</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index f9c6af4..958d661 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Wybierz czynność"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Informacje o urządzeniu"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Informacje o baterii"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Historia baterii"</string>
     <string name="display_label" msgid="7403874003169865762">"Wyświetlacz"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Informacje o telefonie"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Karta SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Określ, kiedy przełączyć Wi-Fi na komórkowe połączenie danych"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Wystąpił problem podczas ustawiania zasad usypiania."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Adres MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Adres IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Ustawienia IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Zapisz"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Anuluj"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Określ moją lokalizację w aplikacjach (takich jak Mapy), korzystając z sieci bezprzewodowych"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Lokalizacja określana jest za pomocą Wi-Fi i/lub sieci komórkowych"</string>
     <string name="location_gps" msgid="6296125378829097831">"Użyj satelitów GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Określa lokalizację z dokładnością do ulicy (wyłącz, aby oszczędzać baterię)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Określaj lokalizację z dokładnością do ulicy"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Podaje dokładne położenie (zużywa więcej baterii, działa na zewnątrz)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Użyj wspomaganego systemu GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Użyj serwera do wspomagania systemu GPS (usuń zaznaczenie, aby zmniejszyć ruch sieciowy)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplikacja"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Dane"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Odinstaluj"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Wyłącz"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Włącz"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Wyczyść dane"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Odinstaluj aktualizacje"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Wybrano domyślne uruchamianie tej aplikacji dla niektórych czynności."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Brak ustawień domyślnych."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Wyczyść domyślne"</string>
     <string name="unknown" msgid="1592123443519355854">"Nieznana"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sortuj"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Sortuj według nazwy"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Sortuj według rozmiaru"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Zarządzaj rozmiarem"</string>
     <string name="filter" msgid="2018011724373033887">"Filtr"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Pobrane"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Uruchomione"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"Na karcie SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Ładowanie..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Wyłączone"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Brak aplikacji."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Przeliczanie rozmiaru..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Usuń"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Wszystkie dane tej aplikacji zostaną trwale usunięte. Dotyczy to wszystkich plików, ustawień, kont, baz danych itd."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Podane położenie instalacji jest nieprawidłowe."</string>
     <string name="system_package" msgid="1030561474413022831">"Aktualizacje systemowe nie mogą być instalowane na nośniku zewnętrznym."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Wymuś zatrzymanie"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Ta aplikacja zostanie natychmiast uruchomiona ponownie. Czy na pewno chcesz wymusić zatrzymanie?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Wymuszenie zatrzymania aplikacji może spowodować jej nieprawidłowe działanie. Czy na pewno chcesz to zrobić?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Przenieś aplikację"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Przeniesienie aplikacji nie powiodło się. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Preferowana lokalizacja instalacji"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Zmień preferowaną lokalizację instalacji dla nowych aplikacji."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Użycie pamięci"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Uruchomione usługi"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Wyświetl i kontroluj obecnie uruchomione usługi"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Ponowne uruchamianie"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Brak uruchomionych usług"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Zatrzymać usługę?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Usługa nie będzie działać, dopóki nie zostanie ponownie uruchomiona. Może to mieć niepożądany wpływ na aplikację <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Zatrzymaj"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Anuluj"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Uruchomiona przez aplikację: dotknij, aby zatrzymać"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: dotknij, aby zarządzać"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Dostępne: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> w <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Inne: <xliff:g id="MEMORY">%2$s</xliff:g> w <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Proces: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Brak uruchomionych usług."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Uruchomiona przez aplikację."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"Dostępne: <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"W użyciu <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"Procesów: <xliff:g id="NUMPROCESS">%1$d</xliff:g>, usług: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"Procesów: <xliff:g id="NUMPROCESS">%1$d</xliff:g>, usług: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"Procesów: <xliff:g id="NUMPROCESS">%1$d</xliff:g>, usług: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"Procesów: <xliff:g id="NUMPROCESS">%1$d</xliff:g>, usług: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Działająca aplikacja"</string>
+    <string name="no_services" msgid="7133900764462288263">"Nieaktywne"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Usługi"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Procesy"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Zatrzymaj"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Ustawienia"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Ta usługa została uruchomiona przez jej aplikację. Jej zatrzymanie może spowodować zakończenie działania aplikacji niepowodzeniem."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Nie można bezpiecznie zatrzymać tej aplikacji. Może to spowodować utratę części Twojej bieżącej pracy."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: aktualnie w użyciu. Dotknij opcji Ustawienia, aby nią sterować."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Główny proces będący w użyciu."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Usługa <xliff:g id="COMP_NAME">%1$s</xliff:g> jest w użyciu."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Dostawca <xliff:g id="COMP_NAME">%1$s</xliff:g> jest w użyciu."</string>
     <string name="language_settings" msgid="502219872342167227">"Język i klawiatura"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Ustawienia języka i klawiatury"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Określ ustawienia regionalne (język i region) oraz opcje wprowadzania tekstu i autokorekty"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testowanie"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Informacje o telefonie"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Informacje o baterii"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Historia baterii"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Szybkie uruchamianie"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Ustaw skróty klawiaturowe, aby uruchamiać aplikacje"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Przypisz aplikację"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Debugowanie USB jest przeznaczone wyłącznie do celów programistycznych. Może posłużyć do kopiowania danych między komputerem a urządzeniem, instalowania aplikacji w urządzeniu bez powiadamiania, a także odczytywania danych dziennika."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Wybierz gadżet"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Wybierz widżet"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Szczegóły dotyczące identyfikatora UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"Identyfikator UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Szczegóły wykorzystania sieci dla <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Odebranych bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Wysłanych bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Łącznie bajtów: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Szczegóły wykorzystania procesora dla <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Czas użytkownika:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Czas systemu:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Łączny czas:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Uruchomień: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> dni, <xliff:g id="HOURS">%2$d</xliff:g> godz., <xliff:g id="MINUTES">%3$d</xliff:g> min, <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> godz., <xliff:g id="MINUTES">%2$d</xliff:g> min, <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> min, <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pakiety współdzielące ten identyfikator UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Brak danych o użyciu baterii"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Czujnik:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Częściowa blokada wybudzenia:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Czujnik używany przez pakiety:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Używane <xliff:g id="COUNT">%1$d</xliff:g> raz(y) przez <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Używane <xliff:g id="COUNT">%1$d</xliff:g> raz(y) przez:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Działa"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Ekran włączony"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon włączony"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Czas bez uśpienia:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Czas pracy z włączonym ekranem:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Czas pracy przy włączonym telefonie:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Praca na baterii:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Podłączone:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Statystyki użycia"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Statystyki użycia"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sortuj wg:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Gdzie wykorzystywana jest bateria"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Użycie baterii od odłączenia"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Użycie baterii od zresetowania"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> pracy na baterii"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> od odłączenia"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Ładowanie"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Ekran włączony"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS włączony"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktywność"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Sygnał telefonu"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Czas aktywności urządzenia"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefon nieaktywny"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Łącznie dla procesora"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"Procesor w działaniach pierwszoplanowych"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Utrzymuj aktywność"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Dane wysłane"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Użycie baterii przez bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Wyłącz moduł Bluetooth, gdy nie jest używany"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Spróbuj połączyć się z innym urządzeniem bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Użycie baterii przez działające aplikacje"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Użycie baterii przez aplikację"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Zatrzymaj lub odinstaluj aplikację"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Wyłącz odbiornik GPS, gdy nie jest używany"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Włączaj i wyłączaj GPS ręcznie, aby kontrolować jego użycie w aplikacjach"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Aplikacja może oferować ustawienia pozwalające zredukować użycie baterii"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> od odłączenia"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Ostatnio odłączony na <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Nie zainstalowano"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Kobieta"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Mężczyzna"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Zarządzanie energią"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Aktualizowanie ustawień Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Aktualizowanie ustawień Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Magazyn danych uwierzytelniania został wyczyszczony."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Magazyn danych logowania jest włączony."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Magazyn danych logowania jest wyłączony."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"System szyfrowania plików"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Zaszyfruj prywatne dane użytkownika"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Włącz magazyn zaszyfrowanego systemu plików na potrzeby prywatnych danych użytkownika na tym urządzeniu"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Włączenie systemów szyfrowania plików wymaga wymazania danych urządzenia."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Wyłączenie systemów szyfrowania plików wymaga wymazania danych urządzenia."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Włącz"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Wyłącz"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Anuluj"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Zmiana trybu systemów szyfrowania plików została anulowana."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Ostrzeżenie dotyczące systemów szyfrowania plików"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Sygnał alarmowy"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Skonfiguruj sposób działania w przypadku połączenia alarmowego"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Prywatność"</string>
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index e4436ec..b553fb3 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nunca quando ligado"</item>
     <item msgid="1986753720941888596">"Nunca"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Utilização da CPU"</item>
-    <item msgid="6401018715947316517">"Utilização da rede"</item>
-    <item msgid="188092590354892392">"Utilização do GPS"</item>
-    <item msgid="8414109131222049141">"Utilização do sensor"</item>
-    <item msgid="1327904325081257093">"Utilização para reactivação parcial"</item>
-    <item msgid="4832254146664706277">"Outra utilização"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Desde a última vez que foi desligado"</item>
-    <item msgid="166936313535197598">"Total desde o arranque"</item>
-    <item msgid="4793941382744963893">"Total em todo o tempo"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Tempo de utilização"</item>
     <item msgid="1908750532762193304">"Total de inícios"</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 56b0b97..b4cc408 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Seleccionar actividade"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Informações sobre o dispositivo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Informações da bateria"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Histórico da bateria"</string>
     <string name="display_label" msgid="7403874003169865762">"Visor"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Informações do telefone"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Cartão SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Especificar quando mudar de Wi-Fi para dados móveis"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Ocorreu um problema ao definir a política de suspensão."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Endereço MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Endereço IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Definições de IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Guardar"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Cancelar"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Ver localização em aplicações (como o Google Maps) utilizando redes sem fios"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Localização determinada por redes Wi-Fi e/ou móveis"</string>
     <string name="location_gps" msgid="6296125378829097831">"Utilizar satélites GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Ao localizar determinar localização exacta ao nível da rua (desmarque p/ poupar bateria)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Ao localizar, precisão a nível de rua"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localizar ao nível da rua (exige mais bateria e vista do céu)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Utilizar GPS assistido"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Utilizar o servidor para auxiliar o GPS (desmarque esta opção para reduzir a utilização da rede)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplicação"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Dados"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Desinstalar"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Desactivar"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Activar"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Limpar dados"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Desinstalar actualizações"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Optou por iniciar esta aplicação por predefinição para algumas acções."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Nenhuma predefinição estabelecida."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Limpar predefinições"</string>
     <string name="unknown" msgid="1592123443519355854">"Desconhecido"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Ordenar"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ordenar pelo nome"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Ordenar por tamanho"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Gerir espaço"</string>
     <string name="filter" msgid="2018011724373033887">"Filtrar"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Transferidas"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Em execução"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"No cartão SD"</string>
-    <string name="loading" msgid="3200408047793887917">"A carregar..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Desactivada"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Sem aplicações."</string>
     <string name="recompute_size" msgid="7722567982831691718">"A recalcular tamanho..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Eliminar"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Todos os dados desta aplicação serão eliminados definitivamente. Isto inclui todos os ficheiros, definições, contas, bases de dados, entre outros."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"A localização de instalação especificada não é válida."</string>
     <string name="system_package" msgid="1030561474413022831">"Não é possível instalar actualizações do sistema em suportes de dados externos."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Forçar paragem"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Esta aplicação será reiniciada imediatamente. Tem a certeza de que pretende forçar a paragem?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"A paragem forçada de uma aplicação pode levá-la a um mau funcionamento. Tem a certeza?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Mover aplicação"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Falha ao mover a aplicação. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Localização de instalação preferida"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Alterar a localização de instalação preferida para novas aplicações."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Utilização do armazenam."</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar os serviços actualmente em execução"</string>
     <string name="service_restarting" msgid="2242747937372354306">"A reiniciar"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Não existem serviços em execução"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Parar serviço?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"O serviço deixará de ser executado até que seja novamente iniciado. Isto pode ter consequências indesejáveis para a aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Parar"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Cancelar"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Iniciado pela aplicação: tocar p/ parar"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: toque para gerir"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disp.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> em <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Outro: <xliff:g id="MEMORY">%2$s</xliff:g> em <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Processo: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Nada a ser executado."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Iniciado pela aplicação."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponível"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> em utilização"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviço"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviços"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processos e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviço"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processos e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviços"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Aplicação em execução"</string>
+    <string name="no_services" msgid="7133900764462288263">"Não activo"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Serviços"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processos"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Parar"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Definições"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Este serviço foi iniciado pela aplicação. Se o parar, a aplicação pode falhar."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Esta aplicação não pode ser parada com segurança. Se o fizer, poderá perder algum do seu trabalho actual."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: actualmente em utilização. Toque em Definições para o controlar."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Processo principal que está a ser utilizado."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"O serviço <xliff:g id="COMP_NAME">%1$s</xliff:g> está a ser utilizado."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"O fornecedor <xliff:g id="COMP_NAME">%1$s</xliff:g> está a ser utilizado."</string>
     <string name="language_settings" msgid="502219872342167227">"Idioma e teclado"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Definições de idioma e teclado"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Definir opções de região (idioma e região), entrada de texto e correcção automática"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testes"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Informações do telefone"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Informação da bateria"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Histórico da bateria"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Iniciação rápida"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Definir atalhos do teclado para iniciar aplicações"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Atribuir aplicação"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"A depuração USB é utilizada apenas para fins de programação. Pode ser utilizada para copiar dados entre o computador e o dispositivo, instalar aplicações no dispositivo sem notificação e ler dados do registo."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Escolher miniaplicação"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Escolher widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detalhes de UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Detalhes de utilização de rede para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Bytes recebidos: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Bytes enviados: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Total de bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Detalhes de utilização da CPU para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Tempo do utilizador:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Hora do sistema:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tempo total:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Inícios: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>h <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>h <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pacotes que partilham este UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Não existem dados de utilização da bateria disponíveis"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Activação permanente parcial:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor utilizado por pacotes:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> vezes por <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Utilizado <xliff:g id="COUNT">%1$d</xliff:g> vezes por um dos seguintes:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Em execução"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Ecrã activo"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefone ligado"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tempo decorrido sem suspensão:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tempo decorrido com o ecrã ligado:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tempo decorrido com o telefone ligado:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Bateria activa:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Ligado:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Estatísticas de utilização"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Estatísticas de utilização"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Ordenar por:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"O que tem estado a utilizar a bateria"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Bateria utilizada desde que foi desligado"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Bateria utilizada desde a reposição"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> de bateria"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> desde que foi desligado"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"A carregar"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Ecrã activo"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS activado"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Despertar"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Sinal telefónico"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Hora de activação do dispositivo"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefone inactivo"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Total da CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"primeiro plano da CPU"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Manter desperto"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefone"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Dados enviados"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Bateria utilizada pelo bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Desligar o bluetooth quando não estiver a ser utilizado"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Tente ligar a um dispositivo bluetooth diferente"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Bateria utilizada pelas aplicações quando em execução"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Bateria utilizada pela aplicação"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Parar ou desinstalar a aplicação"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Desactivar o GPS quando não está a ser utilizado"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Controlar manualmente o GPS para impedir que a aplicação o utilize"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"A aplicação pode sugerir definições para reduzir a utilização da bateria"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> desde que foi desligado"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Desde a última vez que foi desligado por <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Não instalada"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Feminino"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Masculino"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Controlo de Energia"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Actualizar definição de Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Actualizar a definição do Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"O armazenamento de credenciais foi apagado."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"O armazenamento de credenciais está activado."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"O armazenamento de credenciais está desactivado."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Sistema de ficheiros encriptados"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Encriptar dados de utilizador privados"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Activar armazenamento do sistema de ficheiros encriptados para dados de utilizador privados neste dispositivo"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"A activação dos Sistemas de ficheiros encriptados requer uma limpeza de dados do dispositivo."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"A desactivação dos Sistemas de ficheiros encriptados requer uma limpeza de dados do dispositivo."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Activar"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Desactivar"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Cancelar"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"A alteração do modo Sistemas de ficheiros encriptados foi cancelada."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Aviso dos Sistemas de ficheiros encriptados."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tom de emergência"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Definir o comportamento quando é efectuada uma chamada de emergência"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacidade"</string>
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index 103d73a..06197d2 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Nunca quando conectado"</item>
     <item msgid="1986753720941888596">"Nunca"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Uso da CPU"</item>
-    <item msgid="6401018715947316517">"Uso da rede"</item>
-    <item msgid="188092590354892392">"Uso do GPS"</item>
-    <item msgid="8414109131222049141">"Uso do sensor"</item>
-    <item msgid="1327904325081257093">"Uso de ativação parcial"</item>
-    <item msgid="4832254146664706277">"Outro uso"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Desde que foi desconectado pela última vez"</item>
-    <item msgid="166936313535197598">"Total desde a inicialização"</item>
-    <item msgid="4793941382744963893">"Total geral"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Tempo de uso"</item>
     <item msgid="1908750532762193304">"Iniciar contagem"</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index e1c0563..668872c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Selecionar atividade"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Informações do dispositivo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Informações da bateria"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Histórico da bateria"</string>
     <string name="display_label" msgid="7403874003169865762">"Tela"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Informações do telefone"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"Cartão SD"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Especificar quando alternar de Wi-Fi para dados móveis"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Houve um problema ao configurar a política de inatividade"</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Endereço MAC"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"Endereço IP"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Configurações de IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Salvar"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Cancelar"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Veja o local nos aplicativos (como o Google Maps) usando redes sem fio"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Local determinado pela rede Wi-Fi e/ou pelas redes móveis"</string>
     <string name="location_gps" msgid="6296125378829097831">"Usar satélites GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Precisão do local chega ao nível de rua (desmarque p/ conservar bateria)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Durante a localização, usar precisão no nível de rua"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Localizar no nível da rua (exige mais bateria e visão do céu)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Usar GPS associado"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Usar servidor para auxiliar GPS (desmarque para reduzir o uso da rede)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Aplicativo"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Dados"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Desinstalar"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Desativar"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Ativar"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Limpar dados"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Desinstalar atualizações"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Você selecionou a inicialização padrão deste aplicativo para algumas ações."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Nenhum padrão definido."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Limpar padrão"</string>
     <string name="unknown" msgid="1592123443519355854">"Desconhecido"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Classificar"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Classificar por nome"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Classificar por tamanho"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Gerenciar espaço"</string>
     <string name="filter" msgid="2018011724373033887">"Filtro"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Download concluído"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Em execução"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"No cartão SD"</string>
-    <string name="loading" msgid="3200408047793887917">"Carregando..."</string>
+    <string name="disabled" msgid="9206776641295849915">"Desativado"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Nenhum aplicativo."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Recalculando o tamanho…"</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Excluir"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Todos os dados deste aplicativo serão excluídos permanentemente. Isso inclui todos os arquivos, configurações, contas, bancos de dados e outros."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"O local especificado para instalação não é válido."</string>
     <string name="system_package" msgid="1030561474413022831">"As atualizações do sistema não podem ser instaladas em mídia externa."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Forçar parada"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Este aplicativo será reiniciado imediatamente. Tem certeza de que deseja forçar a parada?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Forçar a parada do aplicativo pode causar um comportamento inesperado. Continuar?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Mover aplicativo"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Falha ao mover aplicativo. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Local de instalação preferido"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Alterar o local de instalação preferido para novos aplicativos."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Uso do armazenamento"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizar e controlar os serviços em execução no momento"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Reiniciando"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Sem serviços em execução"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Parar o serviço?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"O serviço não será mais executado até ser iniciado novamente. Isso pode ter consequências indesejáveis no aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Parar"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Cancelar"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Iniciado pelo aplicativo: toque p/ parar"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: toque para gerenciar"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Disp.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> em <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Outro: <xliff:g id="MEMORY">%2$s</xliff:g> em <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Processo: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Nada em execução."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Iniciado pelo aplicativo."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> disponível"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> em uso"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviço"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processo e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviços"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processos e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviço"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processos e <xliff:g id="NUMSERVICES">%2$d</xliff:g> serviços"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Aplicativo em execução"</string>
+    <string name="no_services" msgid="7133900764462288263">"Não ativo"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Serviços"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processos"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Parar"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Configurações"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Este serviço foi iniciado pelo aplicativo correspondente. Interrompê-lo pode provocar a falha do aplicativo."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Este aplicativo não pode ser interrompido com segurança. Isso poderia resultar na perda do seu trabalho atual."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: em uso no momento. Toque em Configurações para controlá-lo."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"O processo principal que está em uso."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"O serviço <xliff:g id="COMP_NAME">%1$s</xliff:g> está em uso."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"O provedor <xliff:g id="COMP_NAME">%1$s</xliff:g> está em uso."</string>
     <string name="language_settings" msgid="502219872342167227">"Idioma e teclado"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Configurações de idioma e teclado"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Definir opções de idioma e região, entrada de texto e correção automática"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testando"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Informações do telefone"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Informações da bateria"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Histórico da bateria"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Início rápido"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Define atalhos do teclado para iniciar aplicativos"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Atribuir aplicativo"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"A depuração USB serve apenas para fins de desenvolvimento. Ela pode ser usada para copiar dados entre o computador e o aparelho, instalar aplicativos no seu aparelho sem notificação e ler dados de registro."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Escolher o gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Escolher widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Detalhes do UID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Detalhes do uso da rede do <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Bytes recebidos: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Bytes enviados: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Total de bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Detalhes do uso de CPU para <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Tempo do usuário:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Tempo do sistema:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Tempo total:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Inicia: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>d <xliff:g id="HOURS">%2$d</xliff:g>h <xliff:g id="MINUTES">%3$d</xliff:g>m <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>h <xliff:g id="MINUTES">%2$d</xliff:g>m <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>m <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Pacotes que compartilham este UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Não há dados de uso da bateria disponíveis"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Bloqueio de ativação parcial:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor usado por pacotes:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Usado <xliff:g id="COUNT">%1$d</xliff:g> vezes por <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Usado <xliff:g id="COUNT">%1$d</xliff:g> vezes por um de:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Em execução"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Tela ativada"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefone ativado"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tempo gasto quando ativo:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tempo gasto com a tela ativada:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tempo gasto com o telefone ativado:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Na bateria:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Conectado:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Estatísticas de uso"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Estatísticas de uso"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Classificar por:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"O que está consumindo a bateria"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Uso da bateria desde a desconexão do aparelho"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Uso da bateria desde a redefinição"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> da bateria"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> desde que foi desconectado"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Carregando"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Tela ativada"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS ligado"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WIFI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Ativo"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Sinal do celular"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Tempo de ativação do aparelho"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefone ocioso"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Total da CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU prioritária"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Permanecer ativo"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefone"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Dados enviados"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Bateria usada por Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Desativar Bluetooth quando não estiver em uso"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Tente conectar a um dispositivo Bluetooth diferente"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Bateria usada por aplicativos em execução"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Bateria usada pelo aplicativo"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Parar ou desinstalar o aplicativo"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Desativar GPS quando não estiver em uso"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Controlar o GPS manualmente para evitar sua utilização pelo aplicativo"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"O aplicativo pode oferecer configurações para reduzir o uso da bateria"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> desde que foi desconectado"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Quando foi desconectado pela última vez para <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Não instalado"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Feminino"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Masculino"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Controle de energia"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Atualizando configuração Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Atualizando configuração Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"O armazenamento de credenciais foi apagado."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"O armazenamento de credenciais foi ativado."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"O armazenamento de credenciais foi desativado."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Sistema de arquivos criptografados"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Criptografar dados privados de usuário"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Ativar armazenamento do sistema de arquivo criptografado para dados privados do usuário neste aparelho."</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"A ativação dos Sistemas de arquivo criptografados exige uma limpeza de dados do dispositivo."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"A desativação dos Sistemas de arquivo criptografados exige uma limpeza de dados do dispositivo."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Ativar"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Desativar"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Cancelar"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"A alteração do modo do Sistema de arquivos criptografados foi cancelada."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Aviso dos Sistemas de arquivo criptografados."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Tom de emergência"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Definir comportamento durante uma chamada de emergência"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Privacidade"</string>
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index 99eb90a..afca691 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Никогда, если есть питание от сети"</item>
     <item msgid="1986753720941888596">"Никогда"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"Использование процессора"</item>
-    <item msgid="6401018715947316517">"Использование сети"</item>
-    <item msgid="188092590354892392">"Использование GPS"</item>
-    <item msgid="8414109131222049141">"Использование сенсора"</item>
-    <item msgid="1327904325081257093">"Использование частичного включения"</item>
-    <item msgid="4832254146664706277">"Прочее использование"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"После последнего отключения питания"</item>
-    <item msgid="166936313535197598">"Всего с момента загрузки"</item>
-    <item msgid="4793941382744963893">"Всего за все время"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Время использования"</item>
     <item msgid="1908750532762193304">"Начать подсчет"</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ecd3b45..240efb3 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -194,8 +194,7 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Выбрать действие"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Сведения об устройстве"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Информация о батарее"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Журнал сведений о батарее"</string>
-    <string name="display_label" msgid="7403874003169865762">"Показать"</string>
+    <string name="display_label" msgid="7403874003169865762">"Экран"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Информация о телефоне"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD-карта"</string>
     <string name="proxy_settings_label" msgid="3271174136184391743">"Настройки прокси-сервера"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"При каких условиях переключаться с Wi-Fi на сотовую сеть"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"При установке правила перехода в спящий режим возникла неполадка."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC-адрес"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-адрес"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"Настройки IP"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Сохранить"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Отмена"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Использовать Wi-Fi и сотовые сети для определения местоположения"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Использовать Wi-Fi и сотовые сети для определения местоположения"</string>
     <string name="location_gps" msgid="6296125378829097831">"Спутники GPS"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Использовать GPS для определения местоположения (повышенный расход энергии)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Координаты на уровне улиц"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Использовать GPS для определения местоположения (высокий расход энергии)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Использовать A-GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Использовать сервер для A-GPS (снимите флажок для менее интенсивного использования сети)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Приложение"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Данные"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Удалить"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Отключить"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Включить"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Стереть данные"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Удалить обновления"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Выбран запуск этого приложения по умолчанию при выполнении некоторых действий."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Значения по умолчанию не установлены."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Удалить настройки по умолчанию"</string>
     <string name="unknown" msgid="1592123443519355854">"Неизвестно"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Упорядочить"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Упорядочить по именам"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Упорядочить по размеру"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Управление местом"</string>
     <string name="filter" msgid="2018011724373033887">"Фильтр"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Сторонние"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Работающие"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"На SD-карте"</string>
-    <string name="loading" msgid="3200408047793887917">"Идет загрузка…"</string>
+    <string name="disabled" msgid="9206776641295849915">"Отключено"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Нет приложений."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Повторное вычисление размера..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Удалить"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Все данные этой программы будут удалены навсегда, включая все файлы, базы данных, настройки, аккаунты и прочее."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Указано недопустимое место установки."</string>
     <string name="system_package" msgid="1030561474413022831">"Системные обновления не могут быть установлены на внешнем носителе."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Принудительная остановка"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Программа будет перезапущена. Вы действительно хотите выполнить принудительную остановку?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Принудительная остановка приложения может привести к сбою. Продолжить?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Перемещение приложения"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Не удалось переместить приложение. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Место установки"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Изменить установочную папку для новых приложений."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Использование хранилища"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Работающие программы"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Просмотр и управление работающими программами"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Перезапуск"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Работающие программы отсутствуют"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Остановить службу?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Эта служба будет отключена до повторного запуска, что может негативно повлиять на программу <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Остановить"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Отмена"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Нажмите, чтобы остановить."</string>
-    <string name="service_client_name" msgid="2337664610975074717">"Нажмите, чтобы изменить <xliff:g id="CLIENT_NAME">%1$s</xliff:g>"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Дост.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> (<xliff:g id="COUNT">%1$d</xliff:g>)"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Другое: <xliff:g id="MEMORY">%2$s</xliff:g> (<xliff:g id="COUNT">%1$d</xliff:g>)"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Процесс <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Ничего не запущено."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Запущено приложением."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"Доступно: <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> используется"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"Процессов: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; служб: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"Процессов: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; служб: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"Процессов: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; служб: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"Процессов: <xliff:g id="NUMPROCESS">%1$d</xliff:g>; служб: <xliff:g id="NUMSERVICES">%2$d</xliff:g>"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Запущенное приложение"</string>
+    <string name="no_services" msgid="7133900764462288263">"Неактивен"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Службы"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Процессы"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Остановить"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Настройки"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Эта служба была запущена ее приложением. Остановка может привести к ошибке приложения."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Данное приложение нельзя остановить безопасно. Это может привести к потере выполненной работы."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: в настоящий момент используется. Нажмите \"Настройки\" для управления."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Основной используемый процесс."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Служба <xliff:g id="COMP_NAME">%1$s</xliff:g> используется."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Провайдер <xliff:g id="COMP_NAME">%1$s</xliff:g> используется."</string>
     <string name="language_settings" msgid="502219872342167227">"Язык и клавиатура"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Настройки языка и клавиатуры"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Выбор языка и региона, способов ввода и настройка автокоррекции"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Проверка"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Информация о телефоне"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Информация о батарее"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Журнал сведений о батарее"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Быстрый запуск"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Настройка клавиш для быстрого запуска приложений"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Назначить приложение"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"Отладка по USB предназначена для целей разработки. С ее помощью можно копировать данные с компьютера на мобильное устройство и наборот, устанавливать на устройство приложения и просматривать данные журналов."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Выбор·гаджета"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Выбор виджета"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Сведения для идентификатора пользователя <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"Идентификатор пользователя <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Сведения об использовании сети приложением <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Получено байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Отправлено байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Всего байт: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Сведения об использовании процессора приложением <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Пользовательское время:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Системное время:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Общее время:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Запусков: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> ч. <xliff:g id="MINUTES">%3$d</xliff:g> мин. <xliff:g id="SECONDS">%4$d</xliff:g> с."</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин. <xliff:g id="SECONDS">%3$d</xliff:g> с."</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> с."</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Пакеты с этим идентификатором пользователя:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Данные об использовании батареи недоступны"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Сенсор:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Блокировка частичного включения:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Сенсор использован пакетами:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Использовано пакетом <xliff:g id="PACKAGE">%2$s</xliff:g>: <xliff:g id="COUNT">%1$d</xliff:g> раз(а)"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Использовано <xliff:g id="COUNT">%1$d</xliff:g> раз(а) одним из:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Выполняемые сейчас"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Экран включен"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Телефон включен"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Время с последнего перехода в спящий режим:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Время пребывания экрана включенным:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Время пребывания телефона включенным:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"От батареи:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Подключен к питанию:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Статистика использования"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Статистика использования"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Упорядочить по:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"На что расходуется заряд батареи"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Расход заряда батареи с момента отключения от сети питания"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Расход заряда батареи с момента перезагрузки"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> от батареи"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> с момента отключения от питания"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Идет зарядка"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Экран включен"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS вкл."</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WI-FI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Режим бодрствования"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Сигнал телефона"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Время включения устройства"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Телефон в режиме ожидания"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"ЦП – всего"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"ЦП – активный режим"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Не отключать"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Телефон"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Отправлено данных"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Использование батареи модулем Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Отключить Bluetooth, если он не используется"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Попробуйте подключиться к другому устройству Bluetooth"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Использование батареи для работы приложений"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Батарея используется приложением"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Остановить или удалить приложение"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Отключать GPS, когда не используется"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Включать GPS вручную, чтобы приложения не могли использовать эту функцию"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"В программе могут быть настройки для снижения расхода заряда батареи"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> с момента отключения от питания"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"С последнего отключения <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Не установлено"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Женский"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Мужской"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Управление питанием"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Обновление настроек Wi-Fi"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Обновление настроек Bluetooth"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Хранилище регистрационных данных очищено."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Хранилище регистрационных данных включено."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Хранилище регистрационных данных отключено."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Зашифрованная файловая система"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Зашифровать личные данные пользователя"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Включить хранилище в зашифрованной файловой системе для хранения личных данных пользователя на этом устройстве"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Для включения зашифрованных файловых систем требуется удаление данных с устройства."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Для отключения зашифрованных файловых систем требуется удаление данных с устройства."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Включить"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Отключить"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Отмена"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Изменение режима зашифрованной файловой системы отменено."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Предупреждение для зашифрованных файловых систем"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Тональный сигнал экстренного вызова"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Настроить режим работы при экстренном вызове"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Конфиденциальность"</string>
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index f583155..2d2949a 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Aldrig när den är inkopplad"</item>
     <item msgid="1986753720941888596">"Aldrig"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU-användning"</item>
-    <item msgid="6401018715947316517">"Nätverksanvändning"</item>
-    <item msgid="188092590354892392">"GPS-användning"</item>
-    <item msgid="8414109131222049141">"Sensoranvändning"</item>
-    <item msgid="1327904325081257093">"Användning av delaktivering"</item>
-    <item msgid="4832254146664706277">"Övrig användning"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Sedan senaste bortkoppling"</item>
-    <item msgid="166936313535197598">"Totalt sedan start"</item>
-    <item msgid="4793941382744963893">"Totalt"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Användningstid"</item>
     <item msgid="1908750532762193304">"Starta räkneverk"</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index c9eb25e..9eb2c68 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Välj aktivitet"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Enhetsinfo"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Batteriinformation"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Batterihistorik"</string>
     <string name="display_label" msgid="7403874003169865762">"Skärm"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefoninformation"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD-kort"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Ange när du vill växla från Wi-Fi till mobildata"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Ett problem inträffade när policy för viloläge skulle anges."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"Mac-adress"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP-adress"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP-inställningar"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Spara"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"Avbryt"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Se plats i programmen (till exempel kartor) med hjälp av trådlösa nätverk"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Plats fastställs av Wi-Fi och/eller mobila nätverk"</string>
     <string name="location_gps" msgid="6296125378829097831">"Använd GPS-satelliter"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Hittar till gatunivå när du söker (avmarkera om du vill spara batteri)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Korrekt på gatunivå när du söker"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Hitta till gatunivå (kräver mer batteri och fungerar endast utomhus)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Använd assisterad GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"Använd servern för att förbättra GPS-funktionen (avmarkera om du vill minska nätverksbelastningen)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Program"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Data"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Avinstallera"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Inaktivera"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Aktivera"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Rensa data"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Avinstallera uppdateringar"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Du har valt att starta detta program som standard för vissa åtgärder."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Inga standardinställningar har angetts."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Rensa standardinställn."</string>
     <string name="unknown" msgid="1592123443519355854">"Okänd"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sortera"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Sortera efter namn"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Sortera efter storlek"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Hantera utrymme"</string>
     <string name="filter" msgid="2018011724373033887">"Filtrera"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"Hämtade"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Kör"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"På SD-kort"</string>
-    <string name="loading" msgid="3200408047793887917">"Läser in…"</string>
+    <string name="disabled" msgid="9206776641295849915">"Inaktiverat"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Inga program."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Räknar om storlek…"</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Radera"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Alla programmets data tas bort permanent. Det inkluderar alla filer, inställningar, konton, databaser och så vidare."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Den angivna installationsplatsen är inte giltig."</string>
     <string name="system_package" msgid="1030561474413022831">"Det går inte att installera systemuppdateringar på externa media."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Tvingad avslutning"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Programmet kommer att startas direkt. Vill du framtvinga avslutning?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Om du tvingar ett program att avslutas kan det uppstå fel. Är du säker?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Flytta program"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Det gick inte att flytta program. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Önskad installationsplats"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Ändra önskad installationsplats för nya program."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Använt utrymme"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Aktiva tjänster"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Visa och styr aktiva tjänster"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Startar om"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Det finns inga aktiva tjänster"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Vill du avbryta tjänsten?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Den här tjänsten körs inte igen förrän du startar om den. Den kan ha oönskad effekt på programmet <xliff:g id="APPLICATION">%1$s</xliff:g>."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Stopp"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"Avbryt"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Startades av ett program: tryck om du vill avbryta"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: tryck om du vill hantera"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Tillg.: <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g> i <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Övriga: <xliff:g id="MEMORY">%2$s</xliff:g> i <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"Process: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Inget körs."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Startades av ett program."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> tillgänglig"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> används"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> process och <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjänst"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> process och <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjänster"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processer och <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjänst"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> processer och <xliff:g id="NUMSERVICES">%2$d</xliff:g> tjänster"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Program som körs"</string>
+    <string name="no_services" msgid="7133900764462288263">"Inte aktiv"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Tjänster"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"Processer"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Stoppa"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Inställningar"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Tjänsten startades av programmet. Om du avbryter den kan det bli fel i programmet."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Programmet kan inte stängas av på ett säkert sätt. Om du stänger av det kan ditt arbete gå förlorat."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g> används just nu. Tryck på Inställningar om du vill styra det."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Huvudprocess som används."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"Tjänsten <xliff:g id="COMP_NAME">%1$s</xliff:g> används."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Leverantören <xliff:g id="COMP_NAME">%1$s</xliff:g> används."</string>
     <string name="language_settings" msgid="502219872342167227">"Språk och tangentbord"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Inställningar för språk och tangentbord"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Ställ in alternativ för språkkod (land och område), textinmatning och autokorrigering"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Testa"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefoninformation"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Batteriinformation"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Batterihistorik"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Snabbstart"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Ställ in kortkommandon för att starta program"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Tilldela program"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB-felsökning ska endast användas i utvecklingssyfte. Felsökningen kan användas för att kopiera data mellan datorn och enheten, installera program på enheten utan avisering och läsa loggdata."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Välj gadget"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Välj widget"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"Information för användar-ID <xliff:g id="NUMBER">%d</xliff:g>"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"Användar-id <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"Information om nätverksanvändning för <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Mottagna bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Skickade bytes: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Totalt antal byte: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"Information om CPU-användning för <xliff:g id="APP_NAME">%1$s</xliff:g>:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Användartid"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Systemtid:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Total tid:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Startar: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h <xliff:g id="MINUTES">%3$d</xliff:g> m <xliff:g id="SECONDS">%4$d</xliff:g> s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m <xliff:g id="SECONDS">%3$d</xliff:g> s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Paket som delar denna UID:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Ingen information om batterianvändning är tillgänglig"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Sensor:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Delaktiveringslås:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Sensor som används av paket:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"Har använts <xliff:g id="COUNT">%1$d</xliff:g> gånger av <xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Har använts <xliff:g id="COUNT">%1$d</xliff:g> gånger av en av:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Kör"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Skärm på"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon på"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Tid som har tillbringats utan vilotid:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Tid då skärmen har varit aktiverad:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Tid då telefonen har varit aktiverad:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"På batteri:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Inkopplad:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Användningsstatistik"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Användningsstatistik"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sortera efter"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Program som har förbrukat batteriet"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Batteriförbrukning sedan bortkoppling"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Batteriförbrukning sedan återställning"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> på batteri"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"<xliff:g id="TIME">%1$s</xliff:g> sedan bortkoppling"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Laddar"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Skärm på"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS på"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Aktiv"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefonsignal"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Aktiv tid för enheten"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefonen är inaktiv"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU totalt"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU i förgrunden"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Behåll aktiv"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Skickade data"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Batteri som förbrukats av Bluetooth"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Inaktivera Bluetooth när du inte använder funktionen"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Försök ansluta till en annan Bluetooth-enhet"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Batteri som förbrukats av program som körs"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Batteri som förbrukats av programmet"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Avsluta eller avinstallera programmet"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Inaktivera GPS när det inte används"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Kontrollera GPS manuellt så att inte programmet kan använda funktionen"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Programmet erbjuder eventuellt inställningar som minskar batteriförbrukningen"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> sedan bortkoppling"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"Sedan senaste bortkoppling <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Inte installerad"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Kvinna"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Man"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Strömkontroll"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Uppdaterar Wi-Fi-inställningar"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Uppdatera Bluetooth-inställningar"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Uppgiftslagringen raderades."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Uppgiftslagring är aktiverat."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Uppgiftslagring har inaktiverats."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Krypterat filsystem"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Kryptera privata användardata"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Aktivera krypterat filsystemarkiv för privata användardata på den här enheten"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Aktivering av krypterade filsystem kräver datarensning på enheten."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Inaktivering av krypterade filsystem kräver datarensning på enheten."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Aktivera"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Inaktivera"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"Avbryt"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Lägesändringen för krypterat filsystem avbröts."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Varning: växling av krypterat filsystem."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Nödsignal"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Ange beteende vid nödsamtal"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Sekretess"</string>
diff --git a/res/values-tr/arrays.xml b/res/values-tr/arrays.xml
index 98d84d2..3749825 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"Takılı olduğunda hiçbir zaman"</item>
     <item msgid="1986753720941888596">"Hiçbir zaman"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU kullanımı"</item>
-    <item msgid="6401018715947316517">"Ağ kullanımı"</item>
-    <item msgid="188092590354892392">"GPS kullanımı"</item>
-    <item msgid="8414109131222049141">"Algılayıcı kullanımı"</item>
-    <item msgid="1327904325081257093">"Kısmi uyandırma kullanımı"</item>
-    <item msgid="4832254146664706277">"Diğer kullanım"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"Fişten son çekildikten itibaren"</item>
-    <item msgid="166936313535197598">"Açılıştan itibaren toplam"</item>
-    <item msgid="4793941382744963893">"Tüm zamanlardaki toplam"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"Kullanım Süresi"</item>
     <item msgid="1908750532762193304">"Sayımı Başlat"</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c784665..fe44230 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"Etkinlik seç"</string>
     <string name="device_info_label" msgid="6551553813651711205">"Cihaz bilgileri"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"Pil bilgileri"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"Pil geçmişi"</string>
     <string name="display_label" msgid="7403874003169865762">"Ekran"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"Telefon bilgileri"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD kart"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"Kablosuzdan mobil veriye geçme zamanını belirt"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"Uyku politikası ayarlanırken bir sorun oluştu."</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC adresi"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP adresi"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP ayarları"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"Kaydet"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"İptal"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"Kablosuz ağları kullanarak uygulamalarda (Google Haritalar gibi) konumu gör"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"Konum kablosuz ve/veya cep telefonu ağları tarafından belirlenir"</string>
     <string name="location_gps" msgid="6296125378829097831">"GPS uydularını kullan"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"Konum bulunurken sokak düzeyinde kesinliğe ayarlayın (pilden tasarruf etmek için onay işaretini kaldırın)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"Yer bulunurken sokak düzeyinde kesinlik"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"Sokak düzeyinde yer bul (daha fazla pil ve gökyüzü görünümü gerektirir)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"Desteklenen GPS kullan"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"GPS\'ye destek olmak için sunucu kullan (ağ kullanımını azaltmak için onay işaretini kaldırın)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"Uygulama"</string>
     <string name="data_size_label" msgid="8679376373625710107">"Veri"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"Kaldır"</string>
+    <string name="disable_text" msgid="6544054052049395202">"Devre dışı bırak"</string>
+    <string name="enable_text" msgid="9217362512327828987">"Etkinleştir"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"Verileri temizle"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"Güncellemeleri kaldır"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"Bu uygulamayı bazı işlemler için varsayılan olarak başlatmayı seçtiniz."</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"Hiçbir varsayılan ayarlanmadı."</string>
     <string name="clear_activities" msgid="7408923511535174430">"Varsayılanları temizle"</string>
     <string name="unknown" msgid="1592123443519355854">"Bilinmiyor"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"Sırala"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"Ada göre sırala"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"Boyuta göre sırala"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"Alanı yönet"</string>
     <string name="filter" msgid="2018011724373033887">"Filtre"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"İndirilen"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"Çalışıyor"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"SD kartta"</string>
-    <string name="loading" msgid="3200408047793887917">"Yükleniyor…"</string>
+    <string name="disabled" msgid="9206776641295849915">"Devre dışı"</string>
+    <string name="no_applications" msgid="5190227407135243904">"Uygulama yok."</string>
     <string name="recompute_size" msgid="7722567982831691718">"Boyut yeniden hesaplanıyor…"</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"Sil"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"Bu uygulamanın tüm verileri kalıcı olarak silinecek. Bu veriler arasında tüm dosyalar, ayarlar, hesaplar, veritabanları vs. yer alıyor."</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"Belirtilen yükleme konumu geçerli değil."</string>
     <string name="system_package" msgid="1030561474413022831">"Sistem güncellemeleri, harici medyaya yüklenemez."</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"Durmaya zorla"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"Bu uygulama hemen yeniden başlatılacak. Durmaya zorlamak istediğinizden emin misiniz?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"Bir uygulamayı zorla durdurmak hatalı davranmasına neden olabilir. Emin misiniz?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"Uygulamayı taşı"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"Uygulama taşınamadı. <xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"Tercih edilen yükleme konumu"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"Yeni uygulamalar için tercih edilen yükleme konumunu değiştirin."</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"Depolama kullanımı"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"Çalışan hizmetler"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"Şu anda çalışan hizmetleri görüntüleyin ve denetleyin"</string>
     <string name="service_restarting" msgid="2242747937372354306">"Yeniden başlatılıyor"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"Çalışan hizmet yok"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"Hizmet durdurulsun mu?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"Bu hizmet, yeniden başlatılana kadar çalışmayacak. Bu durum, <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasında istenmeyen sonuçlara yol açabilir."</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"Durdur"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"İptal"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"Uygulama tarafından başlatıldı: durdurmak için dokunun"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: yönetmek için dokunun"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"Kullanılabilir: <xliff:g id="COUNT">%1$d</xliff:g> hesabında <xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"Diğer: <xliff:g id="COUNT">%1$d</xliff:g> hesabında <xliff:g id="MEMORY">%2$s</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"İşlem: <xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"Hiçbir şey çalışmıyor."</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"Uygulama tarafından başlatıldı."</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> uygun"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> kullanımda"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> işlem ve <xliff:g id="NUMSERVICES">%2$d</xliff:g> hizmet"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> işlem ve <xliff:g id="NUMSERVICES">%2$d</xliff:g> hizmet"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> işlem ve<xliff:g id="NUMSERVICES">%2$d</xliff:g> hizmet"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> işlem ve <xliff:g id="NUMSERVICES">%2$d</xliff:g> hizmet"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"Çalışan uygulama"</string>
+    <string name="no_services" msgid="7133900764462288263">"Etkin değil"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"Hizmetler"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"İşlemler"</string>
+    <string name="service_stop" msgid="6369807553277527248">"Durdur"</string>
+    <string name="service_manage" msgid="1876642087421959194">"Ayarlar"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"Bu hizmet, uygulaması tarafından başlatıldı. Hizmetin durdurulması uygulamanın başarısız olmasına neden olabilir."</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"Bu uygulama güvenli bir şekilde durdurulamıyor. Bu, bazı mevcut işlerinizin kaybına neden olabilir."</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>: şu anda kullanılıyor. Kontrol etmek için Ayarlar\'a dokunun."</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"Kullanımda olan ana işlem."</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"<xliff:g id="COMP_NAME">%1$s</xliff:g> hizmeti kullanımda."</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"Sağlayıcı <xliff:g id="COMP_NAME">%1$s</xliff:g> kullanımda."</string>
     <string name="language_settings" msgid="502219872342167227">"Dil ve klavye"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"Dil ve klavye ayarları"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"Yer (dil ve bölge), metin girişi ve ot. düzeltme seçeneklerini ayarla"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"Test ediliyor"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"Telefon bilgileri"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"Pil bilgileri"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"Pil geçmişi"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"Hızlı başlat"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"Uygulama başlatma klavye kısayollarını ayarla"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"Uygulama ata"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB hata ayıklaması yalnızca geliştirme amaçlıdır. Verileri bilgisayarınızla cihazınız arasında kopyalamak, bildirim göndermeksizin uygulamaları cihazınıza yüklemek ve günlük verilerini okumak için kullanılabilir."</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"Gadget seç"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"Widget seç"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"UID <xliff:g id="NUMBER">%d</xliff:g> ayrıntıları"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"<xliff:g id="APP_NAME">%1$s</xliff:g> için ağ kullanım ayrıntıları:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"Alınan bayt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"Gönderilen bayt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"Toplam bayt: <xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"<xliff:g id="APP_NAME">%1$s</xliff:g> için CPU kullanım ayrıntıları:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"Kullanıcı süresi:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"Sistem saati:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"Toplam süre:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"Başlama: <xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g>g <xliff:g id="HOURS">%2$d</xliff:g>s <xliff:g id="MINUTES">%3$d</xliff:g>d <xliff:g id="SECONDS">%4$d</xliff:g>s"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g>s <xliff:g id="MINUTES">%2$d</xliff:g>d <xliff:g id="SECONDS">%3$d</xliff:g>s"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g>d <xliff:g id="SECONDS">%2$d</xliff:g>s"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g>s"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"Bu UID\'yi paylaşan paketler:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"Pil kullanım verisi yok"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"Algılayıcı:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"Kısmi Uyandırma kilidi:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"Paketlerin kullandığını algılayıcı:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="PACKAGE">%2$s</xliff:g> tarafından <xliff:g id="COUNT">%1$d</xliff:g> kez kullanıldı"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"Şunlardan biri tarafından <xliff:g id="COUNT">%1$d</xliff:g> kez kullanıldı:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"Çalışıyor"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"Ekran açık"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"Telefon açık"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"Uyku dışında harcanan zaman:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"Ekran açıkken harcanan süre:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"Telefon açıkken harcanan süre:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"Pilde:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"Takıldı:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"Kullanım istatistikleri"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"Kullanım istatistikleri"</string>
     <string name="display_order_text" msgid="8592776965827565271">"Sıralama ölçütü:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"Pili ne kullanıyor?"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"Fişten çekildikten sonra pil kullanımı"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"Sıfırlamadan itibaren pil kullanımı"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"<xliff:g id="TIME">%1$s</xliff:g> pilde"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"Fişten çekildikten itibaren <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"Şarj oluyor"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"Ekran açık"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS açık"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Kablosuz"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"Uyanık"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"Telefon sinyali"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"Cihazın açılma zamanı"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"Telefon boşta"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"Toplam CPU"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU ön planı"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"Uyanık tut"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"Telefon"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"Gönderilen veriler"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"Bluetooth tarafından kullanılan pil"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"Bluetooth\'u kullanmadığınız zamanlarda kapatın"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"Farklı bir Bluetooth cihazına bağlanmaya çalış"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"Çalışan uygulamalar tarafından kullanılan pil"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"Uygulama tarafından kullanılan pil"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"Uygulamayı durdur veya kaldır"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"Kullanmadığınız zamanlarda GPS\'yi kapatın"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"Uygulamanın kullanmaması için GPS\'yi manuel olarak denetleyin"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"Uygulama, pil kullanımını azaltmak için ayarlar önerebilir"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"Fişten çekildikten itibaren <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> için fişten son çekildikten itibaren"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"Yüklü değil"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"Bayan"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"Bay"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"Güç Denetimi"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"Kablosuz ayarı güncelleniyor"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"Bluetooth ayarları güncelleniyor"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"Kimlik bilgileri deposu silindi."</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"Kimlik bilgileri deposu etkin."</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"Kimlik bilgileri deposu devre dışı."</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"Şifrelenmiş Dosya Sistemi"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"Özel kullanıcı verilerini şifrele"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"Bu cihazdaki özel kullanıcı verileri için şifrelenmiş dosya sistemi depolamasını etkinleştir"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"Şifrelenmiş Dosya Sistemlerini etkinleştirilmek, cihazda veri silme işlemi yapılmasını gerektirir."</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"Şifrelenmiş Dosya Sistemlerini devre dışı bırakmak, cihazda veri silme işlemi yapılmasını gerektirir."</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"Etkinleştir"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"Devre dışı bırak"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"İptal"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"Şifrelenmiş Dosya Sistemleri modu değişikliği iptal edildi."</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"Şifrelenmiş Dosya Sistemi Uyarısı."</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"Acil sesi"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"Acil çağrı yapıldığında nasıl işlev göreceğini ayarlayın"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"Gizlilik"</string>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index dee805a..18cd1a4 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"充电时永不休眠"</item>
     <item msgid="1986753720941888596">"永不休眠"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU 使用率"</item>
-    <item msgid="6401018715947316517">"网络使用率"</item>
-    <item msgid="188092590354892392">"GPS 使用率"</item>
-    <item msgid="8414109131222049141">"传感器使用情况"</item>
-    <item msgid="1327904325081257093">"部分唤醒使用情况"</item>
-    <item msgid="4832254146664706277">"其他使用情况"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"自上次拔下电源后的时间"</item>
-    <item msgid="166936313535197598">"自启动以来的总时间"</item>
-    <item msgid="4793941382744963893">"所有时间总计"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"使用时间"</item>
     <item msgid="1908750532762193304">"启动次数"</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 99d1f89..d4d6d4f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"选择活动"</string>
     <string name="device_info_label" msgid="6551553813651711205">"设备信息"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"电池信息"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"电池历史记录"</string>
     <string name="display_label" msgid="7403874003169865762">"显示"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"手机信息"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD 卡"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"指定何时要从 Wi-Fi 切换到手机数据"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"设置休眠策略时出现问题。"</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC 地址"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP 地址"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP 设置"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"保存"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"取消"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"使用无线网络在应用程序(例如 Google 地图)中查看位置"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"通过 Wi-Fi 和/或移动网络确定的位置"</string>
     <string name="location_gps" msgid="6296125378829097831">"使用 GPS 卫星"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"定位时,精确度设定为街道级别(取消选中可节约电量)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"定位级别可精确到街道"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"定位到街道级别(需要消耗更多电量以及天气允许)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"使用增强型 GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"使用服务器来辅助 GPS(取消选中可降低网络使用率)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"应用程序"</string>
     <string name="data_size_label" msgid="8679376373625710107">"数据"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"卸载"</string>
+    <string name="disable_text" msgid="6544054052049395202">"停用"</string>
+    <string name="enable_text" msgid="9217362512327828987">"启用"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"清除数据"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"卸载更新"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"您已选择在默认情况下对某些操作启动此应用程序。"</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"无默认设置。"</string>
     <string name="clear_activities" msgid="7408923511535174430">"清除默认设置"</string>
     <string name="unknown" msgid="1592123443519355854">"未知"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"排序"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"按姓名排序"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"按大小排序"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"管理空间"</string>
     <string name="filter" msgid="2018011724373033887">"过滤"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"已下载"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"正在运行"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"SD 卡中"</string>
-    <string name="loading" msgid="3200408047793887917">"正在载入..."</string>
+    <string name="disabled" msgid="9206776641295849915">"已停用"</string>
+    <string name="no_applications" msgid="5190227407135243904">"无应用程序。"</string>
     <string name="recompute_size" msgid="7722567982831691718">"正在重新计算大小..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"删除"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"此应用程序的所有数据将被永久删除。删除的内容包括所有文件、设置、帐户、数据库等。"</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"指定的安装位置无效。"</string>
     <string name="system_package" msgid="1030561474413022831">"无法在外部媒体上安装系统更新。"</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"强行停止"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"此应用程序将立即重新启动。您确定要强行停止应用程序吗?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"强制关闭应用程序会导致其出现异常,您确定要这么做吗?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"移动应用程序"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"无法移动应用程序。<xliff:g id="REASON">%1$s</xliff:g>"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"首选安装位置"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"更改安装新应用程序时使用的首选安装位置"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"存储空间使用情况"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"正在运行的服务"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"查看和控制当前正在运行的服务"</string>
     <string name="service_restarting" msgid="2242747937372354306">"正在重新启动"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"当前未运行任何服务"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"是否停止服务?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"服务只有在重新启动后,才可以继续运行。但这可能会给<xliff:g id="APPLICATION">%1$s</xliff:g>应用程序带来意想不到的结果。"</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"停止"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"取消"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"由应用程序启动:触摸可停止"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>:触摸可进行管理"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"可用:<xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g>,合计 <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"其他:<xliff:g id="MEMORY">%2$s</xliff:g>,合计 <xliff:g id="COUNT">%1$d</xliff:g>"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"进程:<xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"当前未运行任何服务。"</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"已由应用程序启动。"</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> 可用"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"已使用 <xliff:g id="MEMORY">%1$s</xliff:g>"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 个进程和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 个服务"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 个进程和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 个服务"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 个进程和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 个服务"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 个进程和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 个服务"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"正在运行的应用程序"</string>
+    <string name="no_services" msgid="7133900764462288263">"无活动服务"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"服务"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"进程"</string>
+    <string name="service_stop" msgid="6369807553277527248">"停止"</string>
+    <string name="service_manage" msgid="1876642087421959194">"设置"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"此服务由其应用程序启动。停止服务可能会导致应用程序失败。"</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"无法安全地停止该应用程序。强行停止可能会导致您目前的部分工作内容丢失。"</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"目前正在使用“<xliff:g id="CLIENT_NAME">%1$s</xliff:g>”。触摸“设置”可以对其进行控制。"</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"正在使用的主要进程。"</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"正在使用服务<xliff:g id="COMP_NAME">%1$s</xliff:g>。"</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"正在使用提供商<xliff:g id="COMP_NAME">%1$s</xliff:g>。"</string>
     <string name="language_settings" msgid="502219872342167227">"语言和键盘"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"语言和键盘设置"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"设置语言区域(语言和区域)、文字输入和自动更正选项"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"测试"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"手机信息"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"电池信息"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"电池历史记录"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"快速启动"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"设置启动应用程序的键盘快捷键"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"分配应用程序"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB 调试仅用于开发工作。使用该功能可在计算机和移动设备之间复制数据、在移动设备上安装应用程序而不进行通知,以及读取日志数据。"</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"选择小工具"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"选择窗口小部件"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"有关用户 ID <xliff:g id="NUMBER">%d</xliff:g> 的详情"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"用户 ID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"有关<xliff:g id="APP_NAME">%1$s</xliff:g>的网络使用详情:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"收到的字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"发送的字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"总字节数:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"有关<xliff:g id="APP_NAME">%1$s</xliff:g>的 CPU 使用详情:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"用户时间:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"系统时间:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"合计时间:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"启动次数:<xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小时 <xliff:g id="MINUTES">%3$d</xliff:g> 分 <xliff:g id="SECONDS">%4$d</xliff:g> 秒"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> 小时 <xliff:g id="MINUTES">%2$d</xliff:g> 分 <xliff:g id="SECONDS">%3$d</xliff:g> 秒"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> 分 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"共享该用户 ID 的数据包:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"没有可用的电池使用数据"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"传感器:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"部分激活锁定:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"包使用的传感器:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"<xliff:g id="PACKAGE">%2$s</xliff:g>使用了 <xliff:g id="COUNT">%1$d</xliff:g> 次"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"由以下某项使用过 <xliff:g id="COUNT">%1$d</xliff:g> 次:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"正在运行"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"屏幕已开启"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"手机已开启"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"除睡眠状态以外的时间"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"屏幕开启所花费的时间:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"手机处于开机状态的时间:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"正在使用电池:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"充电时间:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"使用情况统计数据"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"使用情况统计数据"</string>
     <string name="display_order_text" msgid="8592776965827565271">"排序方式:"</string>
@@ -865,7 +858,14 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"耗电情况"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"拔下电源后的电量消耗情况"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"重置后的电量消耗情况"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"电池仍可持续 <xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"拔下电源后已过 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"正在充电"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"屏幕已开启"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"GPS 已启用"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"Wi-Fi"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"唤醒"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"手机信号强度"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
     <string name="awake" msgid="387122265874485088">"设备唤醒时间"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"手机待机"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU 总使用时间"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU(前台)"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"保持唤醒状态"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"通话"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"数据已发送"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"蓝牙所耗的电量"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"请在未使用蓝牙功能时将其关闭"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"正在尝试连接另一蓝牙设备"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"运行应用程序时所耗的电量"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"应用程序所耗的电量"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"停止或卸载应用程序"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"不使用 GPS 时将其关闭"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"手动控制 GPS,以阻止应用程序使用它"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"该应用程序中可能有用于减少耗电量的设置"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"拔下电源后已过 <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"上次拔下电源 <xliff:g id="UNPLUGGED">%1$s</xliff:g> 时"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"未安装"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"女声"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"男声"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"电量控制"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"正在更新 Wi-Fi 设置"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"正在更新蓝牙设置"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"该凭证存储已删除。"</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"凭证存储已启用。"</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"凭证存储已停用。"</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"加密文件系统"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"加密用户私人数据"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"在此设备中针对用户私人数据启用加密文件系统存储"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"必须清除设备数据才能启用加密文件系统。"</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"必须清除设备数据才能停用加密文件系统。"</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"启用"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"停用"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"取消"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"已取消加密文件系统的模式更改。"</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"加密文件系统警告。"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"紧急提示音"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"设置进行紧急呼救时的行为"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"隐私权"</string>
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index 0aae95f..0ed49c6 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -115,19 +115,6 @@
     <item msgid="1549288661423279207">"插入時絕不"</item>
     <item msgid="1986753720941888596">"永不"</item>
   </string-array>
-  <string-array name="battery_history_type_spinner">
-    <item msgid="2193799199027871385">"CPU 使用率"</item>
-    <item msgid="6401018715947316517">"網路使用率"</item>
-    <item msgid="188092590354892392">"GPS 使用率"</item>
-    <item msgid="8414109131222049141">"感應器使用率"</item>
-    <item msgid="1327904325081257093">"部分喚醒使用率"</item>
-    <item msgid="4832254146664706277">"其他使用率"</item>
-  </string-array>
-  <string-array name="battery_history_which_spinner">
-    <item msgid="3451981114763440074">"自上次拔除插頭後的時間"</item>
-    <item msgid="166936313535197598">"開機後總時間"</item>
-    <item msgid="4793941382744963893">"所有時間的總計"</item>
-  </string-array>
   <string-array name="usage_stats_display_order_types">
     <item msgid="9077371706468756228">"使用時間"</item>
     <item msgid="1908750532762193304">"啟動計數"</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2e593bf..a7b728e 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -194,7 +194,6 @@
     <string name="activity_picker_label" msgid="4910700713930693329">"選取動作"</string>
     <string name="device_info_label" msgid="6551553813651711205">"裝置資訊"</string>
     <string name="battery_info_label" msgid="4132685016148679403">"電池資訊"</string>
-    <string name="battery_history_label" msgid="8242244969757414501">"電池記錄"</string>
     <string name="display_label" msgid="7403874003169865762">"顯示"</string>
     <string name="phone_info_label" msgid="2127552523124277664">"手機資訊"</string>
     <string name="sd_card_settings_label" msgid="5743100901106177102">"SD 卡"</string>
@@ -376,6 +375,7 @@
     <string name="wifi_setting_sleep_policy_summary" msgid="7573693311804602041">"指定何時要從 Wi-Fi 切換到行動數據"</string>
     <string name="wifi_setting_sleep_policy_error" msgid="5103670439972135148">"休眠設定時發生問題。"</string>
     <string name="wifi_advanced_mac_address_title" msgid="6571335466330978393">"MAC 位址"</string>
+    <string name="wifi_advanced_ip_address_title" msgid="6215297094363164846">"IP 位址"</string>
     <string name="wifi_ip_settings_titlebar" msgid="4345739031248760326">"IP 設定"</string>
     <string name="wifi_ip_settings_menu_save" msgid="7296724066102908366">"儲存"</string>
     <string name="wifi_ip_settings_menu_cancel" msgid="6582567330136502340">"取消"</string>
@@ -609,7 +609,7 @@
     <string name="location_networks_disabled" msgid="2708968452901433980">"使用無線網路,在應用程式中查詢位置 (例如 Google 地圖)"</string>
     <string name="location_neighborhood_level" msgid="4656658097932515921">"根據 Wi-Fi 和/或行動網路判定位置"</string>
     <string name="location_gps" msgid="6296125378829097831">"使用 GPS 衛星定位"</string>
-    <string name="location_street_level" msgid="6460740847018275745">"定位時,精準度設定為街道等級 (取消勾選即可節省電力)"</string>
+    <string name="location_street_level" msgid="7456259025474443314">"定位時,將精準度設定為街道等級"</string>
     <string name="location_gps_disabled" msgid="6632537158777308128">"定位至街道等級 (需要更多電力及天候允許)"</string>
     <string name="assisted_gps" msgid="4649317129586736885">"使用輔助 GPS"</string>
     <string name="assisted_gps_enabled" msgid="8751899609589792803">"使用伺服器輔助 GPS (取消勾選即可降低網路使用量)"</string>
@@ -692,13 +692,15 @@
     <string name="application_size_label" msgid="5055196275624686382">"應用程式"</string>
     <string name="data_size_label" msgid="8679376373625710107">"資料"</string>
     <string name="uninstall_text" msgid="3644892466144802466">"解除安裝"</string>
+    <string name="disable_text" msgid="6544054052049395202">"停用"</string>
+    <string name="enable_text" msgid="9217362512327828987">"啟用"</string>
     <string name="clear_user_data_text" msgid="5597622864770098388">"清除資料"</string>
     <string name="app_factory_reset" msgid="6635744722502563022">"解除安裝更新"</string>
     <string name="auto_launch_enable_text" msgid="2630656657744196691">"您已設定在某些操作下啟動此應用程式。"</string>
     <string name="auto_launch_disable_text" msgid="7800385822185540166">"沒有預設值。"</string>
     <string name="clear_activities" msgid="7408923511535174430">"清除預設值"</string>
     <string name="unknown" msgid="1592123443519355854">"不明"</string>
-    <string name="sort_order_alpha" msgid="8622029358896599842">"排序"</string>
+    <string name="sort_order_alpha" msgid="1410278099123670628">"按名稱排序"</string>
     <string name="sort_order_size" msgid="7024513286636502362">"依大小排序"</string>
     <string name="manage_space_text" msgid="8852711522447794676">"管理空間"</string>
     <string name="filter" msgid="2018011724373033887">"篩選"</string>
@@ -707,7 +709,8 @@
     <string name="filter_apps_third_party" msgid="7786348047690140979">"已下載"</string>
     <string name="filter_apps_running" msgid="7767071454371350486">"執行中"</string>
     <string name="filter_apps_onsdcard" msgid="1477351142334784771">"於 SD 卡"</string>
-    <string name="loading" msgid="3200408047793887917">"載入中..."</string>
+    <string name="disabled" msgid="9206776641295849915">"已停用"</string>
+    <string name="no_applications" msgid="5190227407135243904">"沒有應用程式。"</string>
     <string name="recompute_size" msgid="7722567982831691718">"重新計算大小..."</string>
     <string name="clear_data_dlg_title" msgid="4470209520936375508">"刪除"</string>
     <string name="clear_data_dlg_text" msgid="8368035073300828451">"該應用程式的所有資料都將遭到永遠刪除,包含所有檔案、設定、帳戶、資料庫等等。"</string>
@@ -735,24 +738,41 @@
     <string name="invalid_location" msgid="4934491353200240499">"所指定的安裝位置無效。"</string>
     <string name="system_package" msgid="1030561474413022831">"無法將系統更新安裝在外部媒體上。"</string>
     <string name="force_stop_dlg_title" msgid="4289453224368188476">"強制停止"</string>
-    <string name="force_stop_dlg_text" msgid="3381302041569982075">"此應用程式即將重新啟動,確定要強制停止嗎?"</string>
+    <string name="force_stop_dlg_text" msgid="5157374701213502922">"強制關閉應用程式可能會使得應用程式的運作不正常,您確定要執行嗎?"</string>
     <string name="move_app_failed_dlg_title" msgid="4337731903265156405">"移動應用程式"</string>
     <string name="move_app_failed_dlg_text" msgid="8824246817947643697">"因為 <xliff:g id="REASON">%1$s</xliff:g>,無法移動應用程式。"</string>
     <string name="app_install_location_title" msgid="2068975150026852168">"偏好的安裝位置"</string>
     <string name="app_install_location_summary" msgid="879753854530300436">"變更新應用程式在安裝時的偏好位置。"</string>
+    <string name="storageuse_settings_title" msgid="5657014373502630403">"儲存空間使用量"</string>
+    <!-- no translation found for storageuse_settings_summary (2556057379120846792) -->
+    <skip />
     <string name="runningservices_settings_title" msgid="8097287939865165213">"正在運作的服務"</string>
     <string name="runningservices_settings_summary" msgid="854608995821032748">"查看並控制目前正在運作的服務"</string>
     <string name="service_restarting" msgid="2242747937372354306">"重新啟動中"</string>
-    <string name="no_running_services" msgid="6981216347270280598">"沒有正在運作的服務"</string>
-    <string name="confirm_stop_service" msgid="5700448757318301681">"要停止服務嗎?"</string>
-    <string name="confirm_stop_service_msg" msgid="1166661293369421272">"服務將不再繼續執行,除非您重新啟動該服務。這個動作可能會對應用程式「<xliff:g id="APPLICATION">%1$s</xliff:g>」造成無法預期的結果。"</string>
-    <string name="confirm_stop_stop" msgid="7382363913280993331">"停止"</string>
-    <string name="confirm_stop_cancel" msgid="206495326622692381">"取消"</string>
-    <string name="service_started_by_app" msgid="8432097226392386802">"由應用程式啟動:輕觸螢幕即可停止"</string>
-    <string name="service_client_name" msgid="2337664610975074717">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>:輕觸即可進行管理"</string>
-    <string name="service_background_processes" msgid="5158600475629177758">"可用:<xliff:g id="FREE">%2$s</xliff:g>+<xliff:g id="MEMORY">%3$s</xliff:g>,共 <xliff:g id="COUNT">%1$d</xliff:g> 個程序"</string>
-    <string name="service_foreground_processes" msgid="4013890350284680796">"其他:<xliff:g id="MEMORY">%2$s</xliff:g>,共 <xliff:g id="COUNT">%1$d</xliff:g> 個程序"</string>
-    <string name="service_process_name" msgid="8630408984456958400">"程序:<xliff:g id="PROCESS">%1$s</xliff:g>"</string>
+    <string name="no_running_services" msgid="2059536495597645347">"沒有正在執行中的服務。"</string>
+    <string name="service_started_by_app" msgid="6575184738671598131">"由應用程式啟動。"</string>
+    <!-- no translation found for service_client_name (4037193625611815517) -->
+    <skip />
+    <string name="service_background_processes" msgid="4939976652114824214">"<xliff:g id="MEMORY">%1$s</xliff:g> 可供使用"</string>
+    <string name="service_foreground_processes" msgid="2474726487867913314">"<xliff:g id="MEMORY">%1$s</xliff:g> 正在使用中"</string>
+    <!-- no translation found for service_process_name (4098932168654826656) -->
+    <skip />
+    <string name="running_processes_item_description_s_s" msgid="5790575965282023145">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 項處理程序和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 項服務"</string>
+    <string name="running_processes_item_description_s_p" msgid="8019860457123222953">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 項處理程序和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 項服務"</string>
+    <string name="running_processes_item_description_p_s" msgid="744424668287252915">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 項處理程序和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 項服務"</string>
+    <string name="running_processes_item_description_p_p" msgid="1607384595790852782">"<xliff:g id="NUMPROCESS">%1$d</xliff:g> 項處理程序和 <xliff:g id="NUMSERVICES">%2$d</xliff:g> 項服務"</string>
+    <string name="runningservicedetails_settings_title" msgid="6188692418986988288">"正在執行的應用程式"</string>
+    <string name="no_services" msgid="7133900764462288263">"尚未啟用"</string>
+    <string name="runningservicedetails_services_title" msgid="391168243725357375">"服務"</string>
+    <string name="runningservicedetails_processes_title" msgid="928115582044655268">"處理程序"</string>
+    <string name="service_stop" msgid="6369807553277527248">"停止"</string>
+    <string name="service_manage" msgid="1876642087421959194">"設定"</string>
+    <string name="service_stop_description" msgid="3261798282116866961">"這項服務是由其所屬應用程式啟動。停止服務可能會造成應用程式執行失敗。"</string>
+    <string name="heavy_weight_stop_description" msgid="6855241582643136019">"無法安全停止這個應用程式。強制停止可能造成目前的作業喪失一部分。"</string>
+    <string name="service_manage_description" msgid="7050092269951613102">"<xliff:g id="CLIENT_NAME">%1$s</xliff:g>:目前在使用中。請輕觸 [設定] 管理此用戶端。"</string>
+    <string name="main_running_process_description" msgid="929204645380391397">"使用中的主要處理程序。"</string>
+    <string name="process_service_in_use_description" msgid="8993335064403217080">"服務 <xliff:g id="COMP_NAME">%1$s</xliff:g> 正在使用中。"</string>
+    <string name="process_provider_in_use_description" msgid="5586603325677678940">"供應商 <xliff:g id="COMP_NAME">%1$s</xliff:g> 正在使用中。"</string>
     <string name="language_settings" msgid="502219872342167227">"語言與鍵盤"</string>
     <string name="language_keyboard_settings_title" msgid="3455826933385341107">"語言與鍵盤設定"</string>
     <string name="language_settings_summary" msgid="595647729475399987">"選取地區設定 (語言和地區)、文字輸入和自動校正選項"</string>
@@ -782,7 +802,6 @@
     <string name="testing" msgid="6584352735303604146">"測試中"</string>
     <string name="testing_phone_info" msgid="8656693364332840056">"手機資訊"</string>
     <string name="testing_battery_info" msgid="3497865525976497848">"電池資訊"</string>
-    <string name="testing_battery_history" msgid="3043329445810695647">"電池記錄"</string>
     <string name="quick_launch_title" msgid="7904609846945905306">"快速啟動"</string>
     <string name="quick_launch_summary" msgid="3453825712466417452">"設定啟動應用程式的鍵盤快速鍵"</string>
     <string name="quick_launch_assign_application" msgid="4521368464929956350">"指派應用程式"</string>
@@ -812,36 +831,10 @@
     <string name="adb_warning_message" msgid="5352555112049663033">"USB 偵錯是針對應用程式開發而設計的功能,可讓您在電腦與裝置間複製資料、不用通知即可在裝置上安裝應用程式,以及讀取記錄資料。"</string>
     <string name="gadget_picker_title" msgid="98374951396755811">"選擇小工具"</string>
     <string name="widget_picker_title" msgid="9130684134213467557">"選擇小工具"</string>
-    <string name="battery_history_details_for" msgid="5924639922153109669">"UID <xliff:g id="NUMBER">%d</xliff:g> 的詳細資料"</string>
-    <string name="battery_history_uid" msgid="1016606150528436298">"UID <xliff:g id="USER_ID">%1$d</xliff:g>"</string>
-    <string name="battery_history_network_usage" msgid="8010852371665217020">"<xliff:g id="APP_NAME">%1$s</xliff:g> 的網路使用率詳細資料:"</string>
-    <string name="battery_history_bytes_received" msgid="980307569180518302">"已接收的位元組數:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_sent" msgid="2501748768602119159">"已傳送的位元組數:<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_bytes_total" msgid="4444807574361642753">"總容量 (bytes):<xliff:g id="BYTES">%1$d</xliff:g>"</string>
-    <string name="battery_history_cpu_usage" msgid="2597353713014790877">"<xliff:g id="APP_NAME">%1$s</xliff:g> 的 CPU 使用率詳細資料:"</string>
-    <string name="battery_history_user_time" msgid="6227507614894791359">"使用者時間:"</string>
-    <string name="battery_history_system_time" msgid="2015862072724507547">"系統時間:"</string>
-    <string name="battery_history_total_time" msgid="3618703970098556104">"總計時間:"</string>
-    <string name="battery_history_starts" msgid="9137453931978571696">"啟動次數:<xliff:g id="STARTS">%1$d</xliff:g>"</string>
     <string name="battery_history_days" msgid="7110262897769622564">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時 <xliff:g id="MINUTES">%3$d</xliff:g> 分 <xliff:g id="SECONDS">%4$d</xliff:g> 秒"</string>
     <string name="battery_history_hours" msgid="7525170329826274999">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分 <xliff:g id="SECONDS">%3$d</xliff:g> 秒"</string>
     <string name="battery_history_minutes" msgid="1467775596084148610">"<xliff:g id="MINUTES">%1$d</xliff:g> 分 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
     <string name="battery_history_seconds" msgid="4283492130945761685">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
-    <string name="battery_history_packages_sharing_this_uid" msgid="4101596071379250050">"共用此 UID 的封裝:"</string>
-    <string name="battery_history_no_data" msgid="1177238743237067617">"沒有電池使用資料"</string>
-    <string name="battery_history_sensor" msgid="2333488996028993982">"感應器:"</string>
-    <string name="battery_history_wakelock" msgid="608683447522396293">"部分喚醒鎖定:"</string>
-    <string name="battery_history_used_by_packages" msgid="3000711380023436470">"程式使用的感應器:"</string>
-    <string name="battery_history_sensor_usage" msgid="3593133338613209024">"使用次數:<xliff:g id="COUNT">%1$d</xliff:g>,使用的封裝:<xliff:g id="PACKAGE">%2$s</xliff:g>"</string>
-    <string name="battery_history_sensor_usage_multi" msgid="4536084375991014508">"使用次數:<xliff:g id="COUNT">%1$d</xliff:g>,使用者為下列其中之一:"</string>
-    <string name="battery_history_awake_label" msgid="8449792868990080882">"執行"</string>
-    <string name="battery_history_screen_on_label" msgid="1848936521786339362">"螢幕開啟"</string>
-    <string name="battery_history_phone_on_label" msgid="700191958853142297">"開機"</string>
-    <string name="battery_history_awake" msgid="4350886665719031057">"未休眠的時間:"</string>
-    <string name="battery_history_screen_on" msgid="1377240025275657277">"螢幕開啟時間:"</string>
-    <string name="battery_history_phone_on" msgid="4891504401623839532">"手機處於開啟狀態的時間:"</string>
-    <string name="battery_history_screen_on_battery" msgid="536058210445081888">"使用電池:"</string>
-    <string name="battery_history_screen_on_plugged" msgid="5019127390021871260">"插入時間:"</string>
     <string name="usage_stats_label" msgid="5890846333487083609">"使用統計資料"</string>
     <string name="testing_usage_stats" msgid="7823048598893937339">"使用統計資料"</string>
     <string name="display_order_text" msgid="8592776965827565271">"排序依據:"</string>
@@ -865,10 +858,17 @@
     <string name="power_usage_summary" msgid="7237084831082848168">"查看正在消耗電力的功能"</string>
     <string name="battery_since_unplugged" msgid="338073389740738437">"拔除插頭後的電池使用狀況"</string>
     <string name="battery_since_reset" msgid="7464546661121187045">"重設後的電池使用狀況"</string>
+    <string name="battery_stats_on_battery" msgid="4970762168505236033">"電池電力剩餘時間:<xliff:g id="TIME">%1$s</xliff:g>"</string>
     <string name="battery_stats_duration" msgid="7464501326709469282">"拔除插頭後已過了 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+    <string name="battery_stats_charging_label" msgid="4223311142875178785">"充電"</string>
+    <string name="battery_stats_screen_on_label" msgid="7150221809877509708">"螢幕已開"</string>
+    <string name="battery_stats_gps_on_label" msgid="1193657533641951256">"開啟 GPS"</string>
+    <string name="battery_stats_wifi_running_label" msgid="4100552585961214960">"WIFI"</string>
+    <string name="battery_stats_wake_lock_label" msgid="1908942681902324095">"清醒"</string>
+    <string name="battery_stats_phone_signal_label" msgid="6822042940376636775">"手機訊號"</string>
     <!-- no translation found for battery_stats_last_duration (1535831453827905957) -->
     <skip />
-    <string name="awake" msgid="387122265874485088">"裝置甦醒時間"</string>
+    <string name="awake" msgid="387122265874485088">"裝置清醒時間"</string>
     <string name="wifi_on_time" msgid="4630925382578609056">"WiFi 開啟時間"</string>
     <string name="bluetooth_on_time" msgid="4478515071957280711">"WiFi 開啟時間"</string>
     <string name="usage_name_percent" msgid="7976919382448235858">"<xliff:g id="NAME">%1$s</xliff:g> -  <xliff:g id="NUMBER">%2$s</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -884,6 +884,7 @@
     <string name="power_idle" msgid="9055659695602194990">"手機閒置"</string>
     <string name="usage_type_cpu" msgid="715162150698338714">"CPU 總使用時間"</string>
     <string name="usage_type_cpu_foreground" msgid="6500579611933211831">"CPU 前端使用狀況"</string>
+    <string name="usage_type_wake_lock" msgid="5125438890233677880">"保持清醒"</string>
     <string name="usage_type_gps" msgid="7989688715128160790">"GPS"</string>
     <string name="usage_type_phone" msgid="9108247984998041853">"手機"</string>
     <string name="usage_type_data_send" msgid="2857401966985425427">"已傳送資料"</string>
@@ -909,9 +910,9 @@
     <string name="battery_desc_bluetooth" msgid="7535520658674621902">"藍牙耗電量"</string>
     <string name="battery_sugg_bluetooth_basic" msgid="817276933922157788">"未使用藍牙時即關閉藍牙"</string>
     <string name="battery_sugg_bluetooth_headset" msgid="8214816222115517479">"嘗試連線至不同的藍牙裝置"</string>
-    <string name="battery_desc_apps" msgid="8123202939321333639">"應用程式執行時的耗電量"</string>
+    <string name="battery_desc_apps" msgid="6665712811746233450">"應用程式耗電量"</string>
     <string name="battery_sugg_apps_info" msgid="6065882899391322442">"停止或解除安裝應用程式"</string>
-    <string name="battery_sugg_apps_gps" msgid="4145005297393800223">"GPS 功能未使用時自動關閉"</string>
+    <string name="battery_sugg_apps_gps" msgid="4545056413090932541">"手動控制 GPS 以防止應用程式使用 GPS"</string>
     <string name="battery_sugg_apps_settings" msgid="8021302847272481168">"應用程式可能有提供節省電力的設定"</string>
     <string name="menu_stats_unplugged" msgid="8296577130840261624">"拔除插頭後已過了 <xliff:g id="UNPLUGGED">%1$s</xliff:g>"</string>
     <string name="menu_stats_last_unplugged" msgid="5922246077592434526">"<xliff:g id="UNPLUGGED">%1$s</xliff:g> 前拔除插頭"</string>
@@ -961,6 +962,10 @@
     <string name="pico_not_installed" msgid="6266845418419994311">"未安裝"</string>
     <string name="pico_voice_summary_female" msgid="8047327176247727492">"女性"</string>
     <string name="pico_voice_summary_male" msgid="8331266854058577610">"男性"</string>
+    <!-- no translation found for tts_notif_engine_install_title (7000346872482649034) -->
+    <skip />
+    <!-- no translation found for tts_notif_engine_install_message (5304661142202662693) -->
+    <skip />
     <string name="gadget_title" msgid="7455548605888590466">"電源控制"</string>
     <string name="gadget_toggle_wifi" msgid="2382963973155082629">"正在更新 Wi-Fi 設定"</string>
     <string name="gadget_toggle_bluetooth" msgid="7538903239807020826">"正在更新藍牙設定"</string>
@@ -1068,6 +1073,16 @@
     <string name="credentials_erased" msgid="7700309135582200849">"已清除認證儲存空間內容。"</string>
     <string name="credentials_enabled" msgid="7588607413349978930">"已啟用認證儲存空間。"</string>
     <string name="credentials_disabled" msgid="7453188089059045380">"已停用認證儲存空間。"</string>
+    <string name="encrypted_fs_category" msgid="1841367653663913956">"加密檔案系統"</string>
+    <string name="encrypted_fs_enable" msgid="3884033081603327729">"加密使用者隱私資訊"</string>
+    <string name="encrypted_fs_enable_summary" msgid="5635188119509076089">"啟用加密檔案系統,以儲存此裝置的使用者隱私資訊"</string>
+    <string name="encrypted_fs_enable_dialog" msgid="919487211207214266">"啟用加密檔案系統前必須抹除裝置資料。"</string>
+    <string name="encrypted_fs_disable_dialog" msgid="6960413613985682501">"停用加密檔案系統前必須抹除裝置資料。"</string>
+    <string name="encrypted_fs_enable_button" msgid="8453841319751433751">"啟用"</string>
+    <string name="encrypted_fs_disable_button" msgid="8468354944060220496">"停用"</string>
+    <string name="encrypted_fs_cancel_button" msgid="4785921255266305799">"取消"</string>
+    <string name="encrypted_fs_cancel_confirm" msgid="853572431153803557">"已取消變更加密檔案系統模式。"</string>
+    <string name="encrypted_fs_alert_dialog_title" msgid="583462447886934755">"加密檔案系統警告。"</string>
     <string name="emergency_tone_title" msgid="1055954530111587114">"緊急警示音"</string>
     <string name="emergency_tone_summary" msgid="722259232924572153">"設定撥打緊急電話時的運作方式"</string>
     <string name="privacy_settings" msgid="9206631214140954954">"隱私設定"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index f16f8c9..1a8e17b 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -285,23 +285,6 @@
         <item>2</item>
     </string-array>
 
-    <!-- Match with constants in BatteryHistory class -->
-    <string-array name="battery_history_type_spinner">
-        <item>CPU usage</item>
-        <item>Network usage</item>
-        <item>GPS usage</item>
-        <item>Sensor usage</item>
-        <item>Partial wake usage</item>
-        <item>Other usage</item>
-    </string-array>
-
-    <!-- Match with constants in BatteryStats class -->
-    <string-array name="battery_history_which_spinner">
-        <item>Since last unplugged</item>
-        <item>Total since boot</item>
-        <item>Total in all time</item>
-    </string-array>
-
     <!-- Display options for UsageStats class -->
     <string-array name="usage_stats_display_order_types">
         <item>Usage Time</item>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 0a2c5c5..9a123dd 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -21,4 +21,25 @@
     <declare-styleable name="IconPreferenceScreen">
         <attr name="icon" format="reference" />
     </declare-styleable>
+    
+    <declare-styleable name="BatteryHistoryChart">
+        <!-- Base text color, typeface, size, and style. -->
+        <attr name="android:textAppearance" />
+        <!-- Text color. -->
+        <attr name="android:textColor" />
+        <!-- Size of the text. Recommended dimension type for text is "sp" for scaled-pixels (example: 15sp). -->
+        <attr name="android:textSize" />
+        <!-- Typeface (normal, sans, serif, monospace) for the text. -->
+        <attr name="android:typeface" />
+        <!-- Style (bold, italic, bolditalic) for the text. -->
+        <attr name="android:textStyle" />
+        <!-- Place a shadow of the specified color behind the text. -->
+        <attr name="android:shadowColor" />
+        <!-- Horizontal offset of the shadow. -->
+        <attr name="android:shadowDx" />
+        <!-- Vertical offset of the shadow. -->
+        <attr name="android:shadowDy" />
+        <!-- Radius of the shadow. -->
+        <attr name="android:shadowRadius" />
+    </declare-styleable>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index caa9852..a638a69 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -431,8 +431,6 @@
     <string name="device_info_label">Device info</string>
     <!-- The title of the activity to see battery info. -->
     <string name="battery_info_label">Battery info</string>
-    <!-- The title of the activity to see battery history. -->
-    <string name="battery_history_label">Battery history</string>
     <!-- The title of the activity to adjust display settings -->
     <string name="display_label">Display</string>
     <!-- The title of the activity to see phone info -->
@@ -1215,7 +1213,7 @@
     <string name="storage_settings">SD card &amp; phone storage</string>
     <!-- SD card and storage settings screen title -->
     <string name="storage_settings_title">SD card &amp; phone storage settings</string>
-    <!-- Main settings screen item's summary for the SD card and storage settings -->
+    <!-- [CHAR LIMIT=100] Main settings screen item's summary for the SD card and storage settings -->
     <string name="storage_settings_summary">Unmount SD card, view available storage</string>
     <!-- Do not translate. About phone, status item title -->
     <string name="status_imei">IMEI</string>
@@ -1451,8 +1449,8 @@
     <string name="location_neighborhood_level">Location determined by Wi-Fi and/or mobile networks</string>
     <!-- Security & location settings screen, setting check box label if the GPS receiver should be enabled -->
     <string name="location_gps">Use GPS satellites</string>
-    <!-- Security & location settings screen, setting summary when Use GPS satellites check box is selected -->
-    <string name="location_street_level">When locating, accurate to street level (uncheck to conserve battery)</string>
+    <!-- [CHAR LIMIT=100] Security & location settings screen, setting summary when Use GPS satellites check box is selected -->
+    <string name="location_street_level">When locating, accurate to street level</string>
     <!-- Security & location settings screen, setting summary when Use GPS satellites check box is clear -->
     <string name="location_gps_disabled">Locate to street-level (requires more battery plus view of sky)</string>
     <!-- Security & location settings screen, setting check box label if Assisted GPS should be enabled -->
@@ -1649,6 +1647,10 @@
     <string name="data_size_label">Data</string>
     <!-- Manage applications, individual application info screen, button label under Storage heading. Button to remove the application from the system. -->
     <string name="uninstall_text">Uninstall</string>
+    <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to disable an existing application. -->
+    <string name="disable_text">Disable</string>
+    <!-- [CHAR LIMIT=25] Manage applications, individual application info screen, button label under Storage heading. Button to re-enable an existing application. -->
+    <string name="enable_text">Enable</string>
     <!-- Manage applications, individual application info screen, button label under Storage heading. Button to clear all data associated with tis app (for exampel, remove all cached emails for an Email app) -->
     <string name="clear_user_data_text">Clear data</string>
     <!-- Manage applications, restore updated system application to factory version -->
@@ -1661,8 +1663,8 @@
     <string name="clear_activities">Clear defaults</string>
     <!-- Manage apps, individual app screen, substituted for the application's label when the app's label CAN NOT be determined.-->
     <string name="unknown">Unknown</string>
-    <!-- Manage applications screen, menu item.  Sorts all of the apps in the list alphabetically. -->
-    <string name="sort_order_alpha">Sort</string>
+    <!-- [CHAR LIMIT=25] Manage applications screen, menu item.  Sorts all of the apps in the list alphabetically. -->
+    <string name="sort_order_alpha">Sort by name</string>
     <!-- Manage applications screen, menu item. Sorts all of the apps in the list based on their file size.  This is used to uninstall when space is getting low. -->
     <string name="sort_order_size">Sort by size</string>
     <!-- Manage applications screen, individual app screen, button label when the user wants to manage the space taken up by an app. -->
@@ -1683,7 +1685,10 @@
     <!-- Text for filter option in ManageApps screen to display list of
     packages installed on sdcard. -->
     <string name="filter_apps_onsdcard">On SD card</string>
-    <string name="loading">Loading\u2026</string>
+    <!-- [CHAR LIMIT=25] Manage applications, text telling using an application is disabled. -->
+    <string name="disabled">Disabled</string>
+    <!-- [CHAR LIMIT=25] Text shown when there are no applications to display. -->
+    <string name="no_applications">No applications.</string>
     <!-- Manage app screen, shown when the activity is busy recomputing the size of each app -->
     <string name="recompute_size">Recomputing size\u2026</string>
     <!-- Manage applications, individual application screen, confirmation dialog title. Displays when user selects to "Clear data". -->
@@ -1735,8 +1740,8 @@
     <string name="system_package">System updates cannot be installed on external media.</string>
 
     <string name="force_stop_dlg_title">Force stop</string>
-    <!-- Manage applications, text for dialog when killing persistent apps-->
-    <string name="force_stop_dlg_text">This application will be restarted right way. Are you sure you want to force stop?</string>
+    <!-- [CHAR LIMIT=200] Manage applications, text for dialog when killing persistent apps-->
+    <string name="force_stop_dlg_text">Force stopping an application can cause it to misbehave.  Are you sure?</string>
     <!-- Manage applications, text for dialog when moving an app -->
     <string name="move_app_failed_dlg_title">Move application</string>
     <!-- Manage applications, text for dialog moving an app -->
@@ -1746,36 +1751,72 @@
     <!-- Manage applications. application installation location summary -->
     <string name="app_install_location_summary">Change the preferred installation location for new applications.</string>
 
+    <!-- [CHAR LIMIT=25] Services settings screen, setting option name for the user to go to the screen to view app storage use -->
+    <string name="storageuse_settings_title">Storage use</string>
+    <!-- Services settings screen, setting option summary for the user to go to the screen to app storage use -->
+    <string name="storageuse_settings_summary">View storage used by applications</string>
+
     <!-- Services settings screen, setting option name for the user to go to the screen to view running services -->
     <string name="runningservices_settings_title">Running services</string>
     <!-- Services settings screen, setting option summary for the user to go to the screen to view running services  -->
     <string name="runningservices_settings_summary">View and control currently running services</string>
     <!-- Label for a service item when it is restarting -->
     <string name="service_restarting">Restarting</string>
-    <!-- Running services, body text when there are no services to show -->
-    <string name="no_running_services">No running services</string>
-    <!-- Running services, title of dialog to stop a service -->
-    <string name="confirm_stop_service">Stop service?</string>
-    <!-- Running services, message of dialog to stop a service -->
-    <string name="confirm_stop_service_msg">The service will no longer run until
-            started again.  This may have undesirable
-            consequences on the application
-            <xliff:g id="application">%1$s</xliff:g>.</string>
-    <!-- Running services, button to stop a service -->
-    <string name="confirm_stop_stop">Stop</string>
-    <!-- Running services, button to cancel stopping of a service -->
-    <string name="confirm_stop_cancel">Cancel</string>
+    <!-- [CHAR LIMIT=25] Text shown when there are no services running -->
+    <string name="no_running_services">Nothing running.</string>
     <!-- Running services, description for a service in the started state -->
-    <string name="service_started_by_app">Started by application: touch to stop</string>
+    <string name="service_started_by_app">Started by application.</string>
     <!-- Running services, description for a service in the started state -->
-    <string name="service_client_name"><xliff:g id="client_name">%1$s</xliff:g>: touch to manage</string>
+    <string name="service_client_name"><xliff:g id="client_name">%1$s</xliff:g></string>
     <!-- Running services, summary of background processes -->
-    <string name="service_background_processes">Avail: <xliff:g id="free">%2$s</xliff:g>+<xliff:g id="memory">%3$s</xliff:g> in <xliff:g id="count">%1$d</xliff:g></string>
+    <string name="service_background_processes"><xliff:g id="memory">%1$s</xliff:g> available</string>
     <!-- Running services, summary of foreground processes -->
-    <string name="service_foreground_processes">Other: <xliff:g id="memory">%2$s</xliff:g> in <xliff:g id="count">%1$d</xliff:g></string>
+    <string name="service_foreground_processes"><xliff:g id="memory">%1$s</xliff:g> in use</string>
     <!-- Text to label a process entry with the process name. -->
-    <string name="service_process_name">Process: <xliff:g id="process">%1$s</xliff:g></string>
+    <string name="service_process_name"><xliff:g id="process">%1$s</xliff:g></string>
+    <!-- Descriptive text of a running process: singular process, singular service. -->
+    <string name="running_processes_item_description_s_s"><xliff:g id="numprocess">%1$d</xliff:g>
+        process and <xliff:g id="numservices">%2$d</xliff:g> service</string>
+    <!-- Descriptive text of a running process: singular process, plural service. -->
+    <string name="running_processes_item_description_s_p"><xliff:g id="numprocess">%1$d</xliff:g>
+        process and <xliff:g id="numservices">%2$d</xliff:g> services</string>
+     <!-- Descriptive text of a running process: plural process, singular service. -->
+    <string name="running_processes_item_description_p_s"><xliff:g id="numprocess">%1$d</xliff:g>
+        processes and <xliff:g id="numservices">%2$d</xliff:g> service</string>
+    <!-- Descriptive text of a running process: plural process, plural service. -->
+    <string name="running_processes_item_description_p_p"><xliff:g id="numprocess">%1$d</xliff:g>
+        processes and <xliff:g id="numservices">%2$d</xliff:g> services</string>
 
+    <!-- Details about an application's running services. -->
+    <string name="runningservicedetails_settings_title">Running application</string>
+    <!-- Message displayed when there are no active services in a process. -->
+    <string name="no_services">Not active</string>
+    <!-- Title for list of services. -->
+    <string name="runningservicedetails_services_title">Services</string>
+    <!-- Title for list of services. -->
+    <string name="runningservicedetails_processes_title">Processes</string>
+    <!-- Running service details, stop a service that has started itself. -->
+    <string name="service_stop">Stop</string>
+    <!-- Running service details, manage a service that is running for some other reason. -->
+    <string name="service_manage">Settings</string>
+    <!-- Running service details, default description for services that are started. -->
+    <string name="service_stop_description">This service was started by its
+        application.  Stopping it may cause the application to fail.</string>
+    <!-- Running service details, description for running heavy-weight process. -->
+    <string name="heavy_weight_stop_description">This application can not safely
+        be stopped.  Doing so may lose some of your current work.</string>
+    <!-- Running service details, default description for services that are managed. -->
+    <string name="service_manage_description"><xliff:g id="client_name">%1$s</xliff:g>:
+        currently in use.  Touch Settings to control it.</string>
+    <!-- Description of the main process in the details. -->
+    <string name="main_running_process_description">Main process that is in use.</string>
+    <!-- Message that a process's service is in use. -->
+    <string name="process_service_in_use_description">Service <xliff:g id="comp_name">%1$s</xliff:g>
+        is in use.</string>
+    <!-- Message that a process's provider is in use. -->
+    <string name="process_provider_in_use_description">Provider <xliff:g id="comp_name">%1$s</xliff:g>
+        is in use.</string>
+    
     <!-- Language Settings --> <skip />
     <!-- Title of setting on main settings screen.  This item will take the user to the screen to tweak settings realted to locale and text -->
     <string name="language_settings">Language &amp; keyboard</string>
@@ -1843,8 +1884,6 @@
     <string name="testing_phone_info">Phone information</string>
     <!-- In the Testing screen. The item title of the activity that shows a bunch of battery-related information.  -->
     <string name="testing_battery_info">Battery information</string>
-    <!-- In the Testing screen. The item title of the activity that shows a bunch of historical battery-related information.  -->
-    <string name="testing_battery_history">Battery history</string>
     <!-- Do not translate. In the Testing screen. The item title of the activity that shows a bunch of SIM-related operations.  -->
     <string name="testing_sim_toolkit">SIM toolkit</string>
 
@@ -1914,39 +1953,6 @@
          the final name for Gadgets/Widgets, so please translate both for now. -->
     <string name="widget_picker_title">Choose widget</string>
 
-    <!-- Used to display "Details for UID 1234" in BatteryHistory -->
-    <string name="battery_history_details_for">Details for UID <xliff:g id="number" example="1234">%d</xliff:g></string>
-
-    <!-- Used to name a set of apps that share a user id in BatteryHistory -->
-    <string name="battery_history_uid">UID <xliff:g id="user_id">%1$d</xliff:g></string>
-
-    <!-- Used as a title for the network usage details screen in BatteryHistory -->
-    <string name="battery_history_network_usage">Network usage details for <xliff:g id="app_name">%1$s</xliff:g>:</string>
-
-    <!-- Used to show the number of bytes received by an app over the network in BatteryHistory -->
-    <string name="battery_history_bytes_received">Bytes received: <xliff:g id="bytes">%1$d</xliff:g></string>
-
-    <!-- Used to show the number of bytes sent by an app over the network in BatteryHistory -->
-    <string name="battery_history_bytes_sent">Bytes sent: <xliff:g id="bytes">%1$d</xliff:g></string>
-
-    <!-- Used to show the number of bytes sent and received by an app over the network in BatteryHistory -->
-    <string name="battery_history_bytes_total">Total bytes: <xliff:g id="bytes">%1$d</xliff:g></string>
-
-    <!-- Used as a title for the cpu usage details screen in BatteryHistory -->
-    <string name="battery_history_cpu_usage">CPU usage details for <xliff:g id="app_name">%1$s</xliff:g>:</string>
-
-    <!-- Used to show the time spent in user code for a given app in BatteryHistory -->
-    <string name="battery_history_user_time">User time: </string>
-
-    <!-- Used to show the time spent in system code for a given app in BatteryHistory -->
-    <string name="battery_history_system_time">System time: </string>
-
-    <!-- Used to show the time spent in user or system code for a given app in BatteryHistory -->
-    <string name="battery_history_total_time">Total time: </string>
-
-    <!-- Used to show the number of times an app has been started in BatteryHistory -->
-    <string name="battery_history_starts">Starts: <xliff:g id="starts">%1$d</xliff:g></string>
-
     <!-- Used to show an amount of time in the form "d days, h hours, m minutes, s seconds" in BatteryHistory -->
     <string name="battery_history_days"><xliff:g id="days">%1$d</xliff:g>d <xliff:g id="hours">%2$d</xliff:g>h <xliff:g id="minutes">%3$d</xliff:g>m <xliff:g id="seconds">%4$d</xliff:g>s</string>
 
@@ -1958,52 +1964,7 @@
 
     <!-- Used to show an amount of time in the form "s seconds" in BatteryHistory -->
     <string name="battery_history_seconds"><xliff:g id="seconds">%1$d</xliff:g>s</string>
-
-    <!-- Used to head a list of packages that share a given user id BatteryHistory -->
-    <string name="battery_history_packages_sharing_this_uid">Packages sharing this UID:</string>
-
-    <!-- Used when no battery data available in BatteryHistory -->
-    <string name="battery_history_no_data">No battery usage data available</string>
-
-    <!-- Used for Sensor detail screen in BatteryHistory -->
-    <string name="battery_history_sensor">Sensor:</string>
-
-    <!-- Used for Wakelock detail screen in BatteryHistory -->
-    <string name="battery_history_wakelock">Partial Wakelock:</string>
-
-    <!-- Used for Sensor detail screen in BatteryHistory -->
-    <string name="battery_history_used_by_packages">Sensor used by packages:</string>
-
-    <!-- Used for Sensor detail screen in BatteryHistory -->
-    <string name="battery_history_sensor_usage">Used <xliff:g id="count">%1$d</xliff:g> times by <xliff:g id="package">%2$s</xliff:g></string>
-
-    <!-- Used for Sensor detail screen in BatteryHistory -->
-    <string name="battery_history_sensor_usage_multi">Used <xliff:g id="count">%1$d</xliff:g> times by one of:</string>
-
-    <!-- Used for label of awake bar in BatteryHistory -->
-    <string name="battery_history_awake_label">Running</string>
-
-    <!-- Used for label of screen on bar in BatteryHistory -->
-    <string name="battery_history_screen_on_label">Screen on</string>
-
-    <!-- Used for label of phone on bar in BatteryHistory -->
-    <string name="battery_history_phone_on_label">Phone on</string>
-
-    <!-- Used for awake time message in BatteryHistory -->
-    <string name="battery_history_awake">Time spent without sleeping:</string>
-
-    <!-- Used for Screen on time message in BatteryHistory -->
-    <string name="battery_history_screen_on">Time spent with screen on:</string>
-
-    <!-- Used for Phone on time message in BatteryHistory -->
-    <string name="battery_history_phone_on">Time spent with phone on:</string>
-
-    <!-- Used for Screen on time message in BatteryHistory -->
-    <string name="battery_history_screen_on_battery">On battery:</string>
-
-    <!-- XXX remove? Used for Screen on time message in BatteryHistory -->
-    <string name="battery_history_screen_on_plugged">Plugged in:</string>
-
+    
     <!-- XXX remove? Strings used for displaying usage statistics -->
     <string name="usage_stats_label">Usage statistics</string>
 
@@ -2070,8 +2031,22 @@
     <string name="battery_since_unplugged">Battery use since unplugged</string>
     <!-- Battery usage since user reset the stats -->
     <string name="battery_since_reset">Battery use since reset</string>
+    <!-- Battery usage on battery duration -->
+    <string name="battery_stats_on_battery"><xliff:g id="time">%1$s</xliff:g> on battery</string>
     <!-- Battery usage duration -->
     <string name="battery_stats_duration"><xliff:g id="time">%1$s</xliff:g> since unplugged</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats charging state graph -->
+    <string name="battery_stats_charging_label">Charging</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats screen on state graph -->
+    <string name="battery_stats_screen_on_label">Screen on</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats gps on state graph -->
+    <string name="battery_stats_gps_on_label">GPS on</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats wifi running state graph -->
+    <string name="battery_stats_wifi_running_label">WIFI</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats wake lock state graph -->
+    <string name="battery_stats_wake_lock_label">Awake</string>
+    <!-- [CHAR LIMIT=25] Label for battery stats phone signal strength graph -->
+    <string name="battery_stats_phone_signal_label">Phone signal</string>
     <!-- Battery usage during last unplugged period -->
     <string name="battery_stats_last_duration">@string/menu_stats_last_unplugged</string>
     <!-- CPU awake time title -->
@@ -2110,6 +2085,8 @@
     <string name="usage_type_cpu">CPU total</string>
     <!-- Label for CPU usage in foreground -->
     <string name="usage_type_cpu_foreground">CPU foreground</string>
+    <!-- [CHAR LIMIT=25] Label for keeping device from sleeping -->
+    <string name="usage_type_wake_lock">Keep awake</string>
     <!-- Label for GPU usage time -->
     <string name="usage_type_gps">GPS</string>
     <!-- Label for Phone usage time -->
@@ -2167,12 +2144,12 @@
     <!-- Suggestion for bluetooth headset -->
     <string name="battery_sugg_bluetooth_headset">Try connecting to a different bluetooth device</string>
 
-    <!-- Description for power consumed by applications -->
-    <string name="battery_desc_apps">Battery used by applications when running</string>
+    <!-- [CHAR LIMIT=50] Description for power consumed by applications -->
+    <string name="battery_desc_apps">Battery used by application</string>
     <!-- Suggestion for exploring application info to stop or uninstall -->
     <string name="battery_sugg_apps_info">Stop or uninstall the application</string>
-    <!-- Suggestion for getting apps to consume less power due to GPS-->
-    <string name="battery_sugg_apps_gps">"Turn off GPS when you're not using it"</string>
+    <!-- [CHAR LIMIT=100] Suggestion for getting apps to consume less power due to GPS-->
+    <string name="battery_sugg_apps_gps">"Manually control GPS to prevent application from using it"</string>
     <!-- Suggestion for getting apps to consume less power -->
     <string name="battery_sugg_apps_settings">The application may offer settings to reduce battery use</string>
 
@@ -2282,6 +2259,12 @@
     <string name="pico_voice_summary_female">Female</string>
     <!-- On Pico TTS Settings screen, summary text to indicate that a voice is male -->
     <string name="pico_voice_summary_male">Male</string>
+    <!-- [CHAR LIMIT=33] Notification title that appears when the installation of a new TTS engine completed -->
+    <string name="tts_notif_engine_install_title">Speech synthesis engine installed</string>
+    <!-- [CHAR LIMIT=30] Notification message that appears after the user has installed a new TTS engine,
+         to warn the user that this engine cannot be used before the checkbox for that engine
+         in TTS settings is checked. -->
+    <string name="tts_notif_engine_install_message">Enable new engine before use</string>
 
     <!-- Power Control Widget -->
     <string name="gadget_title">Power Control</string>
@@ -2470,6 +2453,27 @@
     <!-- toast message -->
     <string name="credentials_disabled">Credential storage is disabled.</string>
 
+    <!-- Title of preference group for encrypted filesystem settings -->
+    <string name="encrypted_fs_category">Encrypted File System</string>
+    <!-- Title of preference to enable/dislable encrypted filesystem -->
+    <string name="encrypted_fs_enable">Encrypt private user data</string>
+    <!-- Summary of preference to enable/dislable encrypted filesystem -->
+    <string name="encrypted_fs_enable_summary">Enable encrypted file system storage for private user data in this device</string>
+    <!-- Dialog message to enable encrypted filesystem -->
+    <string name="encrypted_fs_enable_dialog">Enabling Encrypted File Systems requires a device data wipe.</string>
+    <!-- Dialog message to disable encrypted filesystem -->
+    <string name="encrypted_fs_disable_dialog">Disabling Encrypted File Systems requires a device data wipe.</string>
+    <!-- Button label to enable encrypted filesystem -->
+    <string name="encrypted_fs_enable_button">Enable</string>
+    <!-- Button label to disable encrypted filesystem -->
+    <string name="encrypted_fs_disable_button">Disable</string>
+    <!-- Button message to cancel toggling encrypted filesystem -->
+    <string name="encrypted_fs_cancel_button">Cancel</string>
+    <!-- Toast message to notify cancel toggling encrypted filesystem -->
+    <string name="encrypted_fs_cancel_confirm">Encrypted File Systems mode change cancelled.</string>
+    <!-- Dialog title to toggle encrypted filesystem -->
+    <string name="encrypted_fs_alert_dialog_title">Encrypted File Systems Warning.</string>
+
     <!-- Sound settings screen, setting check box label -->
     <string name="emergency_tone_title">Emergency tone</string>
     <!-- Sound settings screen, setting option summary text -->
diff --git a/res/xml/application_settings.xml b/res/xml/application_settings.xml
index 4df21da..27a0411 100644
--- a/res/xml/application_settings.xml
+++ b/res/xml/application_settings.xml
@@ -59,6 +59,23 @@
                 android:targetClass="com.android.settings.RunningServices" />
     </PreferenceScreen>
 
+    <PreferenceScreen
+            android:title="@string/storageuse_settings_title"
+            android:summary="@string/storageuse_settings_summary">
+        <intent android:action="android.intent.action.MAIN"
+                android:targetPackage="com.android.settings"
+                android:targetClass="com.android.settings.applications.StorageUse" />
+    </PreferenceScreen>
+
+    <PreferenceScreen
+            android:key="power_usage"
+            android:title="@string/power_usage_summary_title"
+            android:summary="@string/power_usage_summary">
+        <intent android:action="android.intent.action.MAIN"
+                android:targetPackage="com.android.settings"
+                android:targetClass="com.android.settings.fuelgauge.PowerUsageSummary" />
+    </PreferenceScreen>
+
     <PreferenceScreen 
             android:title="@string/development_settings_title" 
             android:summary="@string/development_settings_summary">
diff --git a/res/xml/testing_settings.xml b/res/xml/testing_settings.xml
index 4b3ea0b..9c0a68b 100644
--- a/res/xml/testing_settings.xml
+++ b/res/xml/testing_settings.xml
@@ -33,13 +33,6 @@
 
 
     <PreferenceScreen
-            android:title="@string/testing_battery_history">
-        <intent android:action="android.intent.action.MAIN"
-                android:targetPackage="com.android.settings"
-                android:targetClass="com.android.settings.battery_history.BatteryHistory" />
-    </PreferenceScreen>
-
-    <PreferenceScreen
             android:title="@string/testing_usage_stats">
         <intent android:action="android.intent.action.MAIN"
                 android:targetPackage="com.android.settings"
diff --git a/res/xml/tether_prefs.xml b/res/xml/tether_prefs.xml
index 6e3d062..77fc7c6 100644
--- a/res/xml/tether_prefs.xml
+++ b/res/xml/tether_prefs.xml
@@ -28,7 +28,6 @@
 
     <PreferenceScreen
         android:key="wifi_ap_settings"
-        android:dependency="enable_wifi_ap"
         android:title="@string/wifi_tether_settings_text"
         android:summary="@string/wifi_tether_settings_subtext" >
         <intent
diff --git a/res/xml/wifi_ap_settings.xml b/res/xml/wifi_ap_settings.xml
index ad21714..9e26154 100644
--- a/res/xml/wifi_ap_settings.xml
+++ b/res/xml/wifi_ap_settings.xml
@@ -24,7 +24,6 @@
 
     <Preference
         android:key="wifi_ap_ssid_and_security"
-        android:dependency="enable_wifi_ap"
         android:title="@string/wifi_tether_configure_ap_text"
         android:persistent="false" />
 
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index a769c38..048d10a 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -17,29 +17,25 @@
 package com.android.settings;
 
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
-import android.util.Config;
+import android.preference.PreferenceScreen;
 import android.util.Log;
+import android.view.MotionEvent;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class DeviceInfoSettings extends PreferenceActivity {
-
     private static final String TAG = "DeviceInfoSettings";
-    private static final boolean LOGD = false || Config.LOGD;
 
     private static final String KEY_CONTAINER = "container";
     private static final String KEY_TEAM = "team";
@@ -50,6 +46,8 @@
     private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
     private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
     
+    long[] mHits = new long[3];
+    
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -57,6 +55,7 @@
         addPreferencesFromResource(R.xml.device_info_settings);
        
         setStringSummary("firmware_version", Build.VERSION.RELEASE);
+        findPreference("firmware_version").setEnabled(true);
         setValueSummary("baseband_version", "gsm.version.baseband");
         setStringSummary("device_model", Build.MODEL);
         setStringSummary("build_number", Build.DISPLAY);
@@ -90,6 +89,24 @@
         Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_CONTRIBUTORS,
                 Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
     }
+    
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        if (preference.getKey().equals("firmware_version")) {
+            System.arraycopy(mHits, 1, mHits, 0, mHits.length-1);
+            mHits[mHits.length-1] = SystemClock.uptimeMillis();
+            if (mHits[0] >= (SystemClock.uptimeMillis()-500)) {
+                Intent intent = new Intent(Intent.ACTION_MAIN);
+                intent.setClassName("android",
+                        com.android.internal.app.PlatLogoActivity.class.getName());
+                try {
+                    startActivity(intent);
+                } catch (Exception e) {
+                }
+            }
+        }
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
+    }
 
     private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
             String preference, String property ) {
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
deleted file mode 100644
index dfff8c9..0000000
--- a/src/com/android/settings/ManageApplications.java
+++ /dev/null
@@ -1,2081 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings;
-
-import com.android.settings.R;
-
-import android.app.ActivityManager;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.app.TabActivity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageStatsObserver;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageStats;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.text.format.Formatter;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.Filter;
-import android.widget.Filterable;
-import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.TabHost;
-import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Activity to pick an application that will be used to display installation information and
- * options to uninstall/delete user data for system applications. This activity
- * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
- * intent.
- * 
- * Initially a compute in progress message is displayed while the application retrieves
- * the list of application information from the PackageManager. The size information
- * for each package is refreshed to the screen. The resource (app description and
- * icon) information for each package is not available yet, so some default values for size
- * icon and descriptions are used initially. Later the resource information for each 
- * application is retrieved and dynamically updated on the screen.
- *  
- * A Broadcast receiver registers for package additions or deletions when the activity is
- * in focus. If the user installs or deletes packages when the activity has focus, the receiver
- * gets notified and proceeds to add/delete these packages from the list on the screen.
- * This is an unlikely scenario but could happen. The entire list gets created every time
- * the activity's onStart gets invoked. This is to avoid having the receiver for the entire
- * life cycle of the application.
- *  
- * The applications can be sorted either alphabetically or 
- * based on size (descending).  If this activity gets launched under low memory
- * situations (a low memory notification dispatches intent 
- * ACTION_MANAGE_PACKAGE_STORAGE) the list is sorted per size.
- *  
- * If the user selects an application, extended info (like size, uninstall/clear data options,
- * permissions info etc.,) is displayed via the InstalledAppDetails activity.
- */
-public class ManageApplications extends TabActivity implements
-        OnItemClickListener, DialogInterface.OnCancelListener,
-        TabHost.TabContentFactory,
-        TabHost.OnTabChangeListener {
-    // TAG for this activity
-    private static final String TAG = "ManageApplications";
-    private static final String PREFS_NAME = "ManageAppsInfo.prefs";
-    private static final String PREF_DISABLE_CACHE = "disableCache";
-    
-    // Log information boolean
-    private boolean localLOGV = false;
-    private static final boolean DEBUG_SIZE = false;
-    private static final boolean DEBUG_TIME = false;
-    
-    // attributes used as keys when passing values to InstalledAppDetails activity
-    public static final String APP_PKG_NAME = "pkg";
-    public static final String APP_CHG = "chg";
-    
-    // attribute name used in receiver for tagging names of added/deleted packages
-    private static final String ATTR_PKG_NAME="p";
-    private static final String ATTR_PKGS="ps";
-    private static final String ATTR_STATS="ss";
-    private static final String ATTR_SIZE_STRS="fs";
-    
-    private static final String ATTR_GET_SIZE_STATUS="passed";
-    private static final String ATTR_PKG_STATS="s";
-    private static final String ATTR_PKG_SIZE_STR="f";
-    
-    // constant value that can be used to check return code from sub activity.
-    private static final int INSTALLED_APP_DETAILS = 1;
-    
-    // sort order that can be changed through the menu can be sorted alphabetically
-    // or size(descending)
-    private static final int MENU_OPTIONS_BASE = 0;
-    // Filter options used for displayed list of applications
-    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
-    public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 1;
-    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 2;
-    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 3;
-
-    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
-    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
-    // sort order
-    private int mSortOrder = SORT_ORDER_ALPHA;
-    // Filter value
-    private int mFilterApps = FILTER_APPS_THIRD_PARTY;
-    
-    // Custom Adapter used for managing items in the list
-    private AppInfoAdapter mAppInfoAdapter;
-    
-    // messages posted to the handler
-    private static final int HANDLER_MESSAGE_BASE = 0;
-    private static final int INIT_PKG_INFO = HANDLER_MESSAGE_BASE+1;
-    private static final int COMPUTE_BULK_SIZE = HANDLER_MESSAGE_BASE+2;
-    private static final int REMOVE_PKG = HANDLER_MESSAGE_BASE+3;
-    private static final int REORDER_LIST = HANDLER_MESSAGE_BASE+4;
-    private static final int ADD_PKG_START = HANDLER_MESSAGE_BASE+5;
-    private static final int ADD_PKG_DONE = HANDLER_MESSAGE_BASE+6;
-    private static final int REFRESH_LABELS = HANDLER_MESSAGE_BASE+7;
-    private static final int REFRESH_DONE = HANDLER_MESSAGE_BASE+8;
-    private static final int NEXT_LOAD_STEP = HANDLER_MESSAGE_BASE+9;
-    private static final int COMPUTE_END = HANDLER_MESSAGE_BASE+10;
-    private static final int REFRESH_ICONS = HANDLER_MESSAGE_BASE+11;
-    
-    // observer object used for computing pkg sizes
-    private PkgSizeObserver mObserver;
-    // local handle to PackageManager
-    private PackageManager mPm;
-    // Broadcast Receiver object that receives notifications for added/deleted
-    // packages
-    private PackageIntentReceiver mReceiver;
-    // atomic variable used to track if computing pkg sizes is in progress. should be volatile?
-    
-    private boolean mComputeSizesFinished = false;
-    // default icon thats used when displaying applications initially before resource info is
-    // retrieved
-    private static Drawable mDefaultAppIcon;
-    
-    // temporary dialog displayed while the application info loads
-    private static final int DLG_BASE = 0;
-    private static final int DLG_LOADING = DLG_BASE + 1;
-    
-    // Size resource used for packages whose size computation failed for some reason
-    private CharSequence mInvalidSizeStr;
-    private CharSequence mComputingSizeStr;
-    
-    // map used to store list of added and removed packages. Immutable Boolean
-    // variables indicate if a package has been added or removed. If a package is
-    // added or deleted multiple times a single entry with the latest operation will
-    // be recorded in the map.
-    private Map<String, Boolean> mAddRemoveMap;
-    
-    // layout inflater object used to inflate views
-    private LayoutInflater mInflater;
-    
-    // invalid size value used initially and also when size retrieval through PackageManager
-    // fails for whatever reason
-    private static final int SIZE_INVALID = -1;
-    
-    // debug boolean variable to test delays from PackageManager API's
-    private boolean DEBUG_PKG_DELAY = false;
-    
-    // Thread to load resources
-    ResourceLoaderThread mResourceThread;
-    private TaskRunner mSizeComputor;
-    
-    private String mCurrentPkgName;
-    
-    // Cache application attributes
-    private AppInfoCache mCache = new AppInfoCache();
-    
-    // Boolean variables indicating state
-    private boolean mLoadLabelsFinished = false;
-    private boolean mSizesFirst = false;
-    // ListView used to display list
-    private ListView mListView;
-    // State variables used to figure out menu options and also
-    // initiate the first computation and loading of resources
-    private boolean mJustCreated = true;
-    private boolean mFirst = false;
-    private long mLoadTimeStart;
-    private boolean mSetListViewLater = true;
-    
-    /*
-     * Handler class to handle messages for various operations.
-     * Most of the operations that effect Application related data
-     * are posted as messages to the handler to avoid synchronization
-     * when accessing these structures.
-     * 
-     * When the size retrieval gets kicked off for the first time, a COMPUTE_PKG_SIZE_START
-     * message is posted to the handler which invokes the getSizeInfo for the pkg at index 0.
-     * 
-     * When the PackageManager's asynchronous call back through
-     * PkgSizeObserver.onGetStatsCompleted gets invoked, the application resources like
-     * label, description, icon etc., are loaded in the same thread and these values are
-     * set on the observer.  The observer then posts a COMPUTE_PKG_SIZE_DONE message
-     * to the handler.  This information is updated on the AppInfoAdapter associated with
-     * the list view of this activity and size info retrieval is initiated for the next package as 
-     * indicated by mComputeIndex.
-     * 
-     * When a package gets added while the activity has focus, the PkgSizeObserver posts
-     * ADD_PKG_START message to the handler.  If the computation is not in progress, the size
-     * is retrieved for the newly added package through the observer object and the newly
-     * installed app info is updated on the screen.  If the computation is still in progress
-     * the package is added to an internal structure and action deferred till the computation
-     * is done for all the packages.
-     * 
-     * When a package gets deleted, REMOVE_PKG is posted to the handler
-     * if computation is not in progress (as indicated by
-     * mDoneIniting), the package is deleted from the displayed list of apps.  If computation is
-     * still in progress the package is added to an internal structure and action deferred till
-     * the computation is done for all packages.
-     * 
-     * When the sizes of all packages is computed, the newly
-     * added or removed packages are processed in order.
-     * If the user changes the order in which these applications are viewed by hitting the
-     * menu key, REORDER_LIST message is posted to the handler. this sorts the list
-     * of items based on the sort order.
-     */
-    private Handler mHandler = new Handler() {
-        public void handleMessage(Message msg) {
-            boolean status;
-            long size;
-            String formattedSize;
-            ApplicationInfo info;
-            Bundle data;
-            String pkgName = null;
-            AppInfo appInfo;
-            data = msg.getData();
-            if(data != null) {
-                pkgName = data.getString(ATTR_PKG_NAME);
-            }
-            switch (msg.what) {
-            case INIT_PKG_INFO:
-                if(localLOGV) Log.i(TAG, "Message INIT_PKG_INFO, justCreated = " + mJustCreated);
-                List<ApplicationInfo> newList = null;
-                if (!mJustCreated) {
-                    if (localLOGV) Log.i(TAG, "List already created");
-                    // Add or delete newly created packages by comparing lists
-                    newList = getInstalledApps(FILTER_APPS_ALL);
-                    updateAppList(newList);
-                }
-                // Retrieve the package list and init some structures
-                initAppList(newList, mFilterApps);
-                mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
-                break;
-            case COMPUTE_BULK_SIZE:
-                if(localLOGV) Log.i(TAG, "Message COMPUTE_BULK_PKG_SIZE");
-                String[] pkgs = data.getStringArray(ATTR_PKGS);
-                long[] sizes = data.getLongArray(ATTR_STATS);
-                String[] formatted = data.getStringArray(ATTR_SIZE_STRS);
-                if(pkgs == null || sizes == null || formatted == null) {
-                     Log.w(TAG, "Ignoring message");
-                     break;
-                }
-                mAppInfoAdapter.bulkUpdateSizes(pkgs, sizes, formatted);
-                break;
-            case COMPUTE_END:
-                mComputeSizesFinished = true;
-                mFirst = true;
-                mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
-                break;
-            case REMOVE_PKG:
-                if(localLOGV) Log.i(TAG, "Message REMOVE_PKG");
-                if(pkgName == null) {
-                    Log.w(TAG, "Ignoring message:REMOVE_PKG for null pkgName");
-                    break;
-                }
-                if (!mComputeSizesFinished) {
-                    Boolean currB = mAddRemoveMap.get(pkgName);
-                    if (currB == null || (currB.equals(Boolean.TRUE))) {
-                        mAddRemoveMap.put(pkgName, Boolean.FALSE);
-                    }
-                    break;
-                }
-                List<String> pkgList = new ArrayList<String>();
-                pkgList.add(pkgName);
-                mAppInfoAdapter.removeFromList(pkgList);
-                break;
-            case REORDER_LIST:
-                if(localLOGV) Log.i(TAG, "Message REORDER_LIST");
-                int menuOption = msg.arg1;
-                if((menuOption == SORT_ORDER_ALPHA) || 
-                        (menuOption == SORT_ORDER_SIZE)) {
-                    // Option to sort list
-                    if (menuOption != mSortOrder) {
-                        mSortOrder = menuOption;
-                        if (localLOGV) Log.i(TAG, "Changing sort order to "+mSortOrder);
-                        mAppInfoAdapter.sortList(mSortOrder);
-                    }
-                } else if(menuOption != mFilterApps) {
-                    // Option to filter list
-                    mFilterApps = menuOption;
-                    boolean ret = mAppInfoAdapter.resetAppList(mFilterApps);
-                    if(!ret) {
-                        // Reset cache
-                        mFilterApps = FILTER_APPS_ALL;
-                        mHandler.sendEmptyMessage(INIT_PKG_INFO);
-                        sendMessageToHandler(REORDER_LIST, menuOption);
-                    }
-                }
-                break;
-            case ADD_PKG_START:
-                if(localLOGV) Log.i(TAG, "Message ADD_PKG_START");
-                if(pkgName == null) {
-                    Log.w(TAG, "Ignoring message:ADD_PKG_START for null pkgName");
-                    break;
-                }
-                if (!mComputeSizesFinished || !mLoadLabelsFinished) {
-                    Boolean currB = mAddRemoveMap.get(pkgName);
-                    if (currB == null || (currB.equals(Boolean.FALSE))) {
-                        mAddRemoveMap.put(pkgName, Boolean.TRUE);
-                    }
-                    break;
-                }
-                try {
-                    info = mPm.getApplicationInfo(pkgName, 0);
-                } catch (NameNotFoundException e) {
-                    Log.w(TAG, "Couldnt find application info for:"+pkgName);
-                    break;
-                }
-                mObserver.invokeGetSizeInfo(pkgName);
-                break;
-            case ADD_PKG_DONE:
-                if(localLOGV) Log.i(TAG, "Message ADD_PKG_DONE");
-                if(pkgName == null) {
-                    Log.w(TAG, "Ignoring message:ADD_PKG_START for null pkgName");
-                    break;
-                }
-                status = data.getBoolean(ATTR_GET_SIZE_STATUS);
-                if (status) {
-                    size = data.getLong(ATTR_PKG_STATS);
-                    formattedSize = data.getString(ATTR_PKG_SIZE_STR);
-                    if (!mAppInfoAdapter.isInstalled(pkgName)) {
-                        mAppInfoAdapter.addToList(pkgName, size, formattedSize);
-                    } else {
-                        mAppInfoAdapter.updatePackage(pkgName, size, formattedSize);
-                    }
-                }
-                break;
-            case REFRESH_LABELS:
-                Map<String, CharSequence> labelMap = (Map<String, CharSequence>) msg.obj;
-                if (labelMap != null) {
-                    mAppInfoAdapter.bulkUpdateLabels(labelMap);
-                }
-                break;
-            case REFRESH_ICONS:
-                Map<String, Drawable> iconMap = (Map<String, Drawable>) msg.obj;
-                if (iconMap != null) {
-                    mAppInfoAdapter.bulkUpdateIcons(iconMap);
-                }
-                break;
-            case REFRESH_DONE:
-                mLoadLabelsFinished = true;
-                mHandler.sendEmptyMessage(NEXT_LOAD_STEP);
-                break;
-            case NEXT_LOAD_STEP:
-                if (!mCache.isEmpty() && mSetListViewLater) {
-                    if (localLOGV) Log.i(TAG, "Using cache to populate list view");
-                    initListView();
-                    mSetListViewLater = false;
-                    mFirst = true;
-                }
-                if (mComputeSizesFinished && mLoadLabelsFinished) {
-                    doneLoadingData();
-                    // Check for added/removed packages
-                    Set<String> keys =  mAddRemoveMap.keySet();
-                    for (String key : keys) {
-                        if (mAddRemoveMap.get(key) == Boolean.TRUE) {
-                            // Add the package
-                            updatePackageList(Intent.ACTION_PACKAGE_ADDED, key);
-                        } else {
-                            // Remove the package
-                            updatePackageList(Intent.ACTION_PACKAGE_REMOVED, key);
-                        }
-                    }
-                    mAddRemoveMap.clear();
-                } else if (!mComputeSizesFinished && !mLoadLabelsFinished) {
-                     // Either load the package labels or initiate get size info
-                    if (mSizesFirst) {
-                        initComputeSizes();
-                    } else {
-                        initResourceThread();
-                    }
-                } else {
-                    if (mSetListViewLater) {
-                        if (localLOGV) Log.i(TAG, "Initing list view for very first time");
-                        initListView();
-                        mSetListViewLater = false;
-                    }
-                    if (!mComputeSizesFinished) {
-                        initComputeSizes();
-                    } else if (!mLoadLabelsFinished) {
-                        initResourceThread();
-                    }
-                }
-                break;
-            default:
-                break;
-            }
-        }
-    };
-    
-    private void initListView() {
-       // Create list view from the adapter here. Wait till the sort order
-        // of list is defined. its either by label or by size. So atleast one of the
-        // first steps should have been completed before the list gets filled.
-        mAppInfoAdapter.sortBaseList(mSortOrder);
-        if (mJustCreated) {
-            // Set the adapter here.
-            mJustCreated = false;
-            mListView.setAdapter(mAppInfoAdapter);
-            dismissLoadingMsg();
-        }
-    }
-
-   class SizeObserver extends IPackageStatsObserver.Stub {
-       private CountDownLatch mCount;
-       PackageStats stats;
-       boolean succeeded;
-       
-       public void invokeGetSize(String packageName, CountDownLatch count) {
-           mCount = count;
-           mPm.getPackageSizeInfo(packageName, this);
-       }
-       
-        public void onGetStatsCompleted(PackageStats pStats, boolean pSucceeded) {
-            succeeded = pSucceeded;
-            stats = pStats;
-            mCount.countDown();
-        }
-    }
-
-    class TaskRunner extends Thread {
-        private List<ApplicationInfo> mPkgList;
-        private SizeObserver mSizeObserver;
-        private static final int END_MSG = COMPUTE_END;
-        private static final int SEND_PKG_SIZES = COMPUTE_BULK_SIZE;
-        volatile boolean abort = false;
-        static final int MSG_PKG_SIZE = 8;
-        
-        TaskRunner(List<ApplicationInfo> appList) {
-           mPkgList = appList;
-           mSizeObserver = new SizeObserver();
-           start();
-        }
-        
-        public void setAbort() {
-            abort = true;
-        }
-
-        public void run() {
-            long startTime;
-            if (DEBUG_SIZE || DEBUG_TIME) {
-               startTime =  SystemClock.elapsedRealtime();
-            }
-            int size = mPkgList.size();
-            int numMsgs = size / MSG_PKG_SIZE;
-            if (size > (numMsgs * MSG_PKG_SIZE)) {
-                numMsgs++;
-            }
-            int endi = 0;
-            for (int j = 0; j < size; j += MSG_PKG_SIZE) {
-                long sizes[];
-                String formatted[];
-                String packages[];
-                endi += MSG_PKG_SIZE;
-                if (endi > size) {
-                    endi = size;
-                }
-                sizes = new long[endi-j];
-                formatted = new String[endi-j];
-                packages = new String[endi-j];
-                for (int i = j; i < endi; i++) {
-                    if (abort) {
-                        // Exit if abort has been set.
-                        break;
-                    }
-                    CountDownLatch count = new CountDownLatch(1);
-                    String packageName = mPkgList.get(i).packageName;
-                    mSizeObserver.invokeGetSize(packageName, count);
-                    try {
-                        count.await();
-                    } catch (InterruptedException e) {
-                        Log.i(TAG, "Failed computing size for pkg : "+packageName);
-                    }
-                    // Process the package statistics
-                    PackageStats pStats = mSizeObserver.stats;
-                    boolean succeeded = mSizeObserver.succeeded;
-                    long total;
-                    if(succeeded && pStats != null) {
-                        total = getTotalSize(pStats);
-                    } else {
-                        total = SIZE_INVALID;
-                    }
-                    sizes[i-j] = total;
-                    formatted[i-j] = getSizeStr(total).toString();
-                    packages[i-j] = packageName;
-                }
-                // Post update message
-                Bundle data = new Bundle();
-                data.putStringArray(ATTR_PKGS, packages);
-                data.putLongArray(ATTR_STATS, sizes);
-                data.putStringArray(ATTR_SIZE_STRS, formatted);
-                Message msg = mHandler.obtainMessage(SEND_PKG_SIZES, data);
-                msg.setData(data);
-                mHandler.sendMessage(msg);
-            }
-            if (DEBUG_SIZE || DEBUG_TIME) Log.i(TAG, "Took "+
-                    (SystemClock.elapsedRealtime() - startTime)+
-                    " ms to compute sizes of all packages ");
-            mHandler.sendEmptyMessage(END_MSG);
-        }
-    }
-    
-    /*
-     * This method compares the current cache against a new list of
-     * installed applications and tries to update the list with add or remove
-     * messages.
-     */
-    private boolean updateAppList(List<ApplicationInfo> newList) {
-        if ((newList == null) || mCache.isEmpty()) {
-            return false;
-        }
-        Set<String> existingList = new HashSet<String>();
-        boolean ret = false;
-        // Loop over new list and find out common elements between old and new lists
-        int N = newList.size();
-        for (int i = (N-1); i >= 0; i--) {
-            ApplicationInfo info = newList.get(i);
-            String pkgName = info.packageName;
-            AppInfo aInfo = mCache.getEntry(pkgName);
-            if (aInfo != null) {
-                existingList.add(pkgName);
-            } else {
-                // New package. update info by refreshing
-                if (localLOGV) Log.i(TAG, "New pkg :"+pkgName+" installed when paused");
-                updatePackageList(Intent.ACTION_PACKAGE_ADDED, pkgName);
-                // Remove from current list so that the newly added package can
-                // be handled later
-                newList.remove(i);
-                ret = true;
-            }
-        }
-
-        // Loop over old list and figure out stale entries
-        List<String> deletedList = null;
-        Set<String> staleList = mCache.getPkgList();
-        for (String pkgName : staleList) {
-            if (!existingList.contains(pkgName)) {
-                if (localLOGV) Log.i(TAG, "Pkg :"+pkgName+" deleted when paused");
-                if (deletedList == null) {
-                    deletedList = new ArrayList<String>();
-                    deletedList.add(pkgName);
-                }
-                ret = true;
-            }
-        }
-        // Delete right away
-        if (deletedList != null) {
-            if (localLOGV) Log.i(TAG, "Deleting right away");
-            mAppInfoAdapter.removeFromList(deletedList);
-        }
-        return ret;
-    }
-    
-    private void doneLoadingData() {
-        setProgressBarIndeterminateVisibility(false);
-    }
-    
-    List<ApplicationInfo> getInstalledApps(int filterOption) {
-        List<ApplicationInfo> installedAppList = mPm.getInstalledApplications(
-                PackageManager.GET_UNINSTALLED_PACKAGES);
-        if (installedAppList == null) {
-            return new ArrayList<ApplicationInfo> ();
-        }
-        if (filterOption == FILTER_APPS_SDCARD) {
-            List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
-            for (ApplicationInfo appInfo : installedAppList) {
-                if ((appInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
-                    // App on sdcard
-                    appList.add(appInfo);
-                }
-            }
-            return appList;
-        } else if (filterOption == FILTER_APPS_THIRD_PARTY) {
-            List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
-            for (ApplicationInfo appInfo : installedAppList) {
-                boolean flag = false;
-                if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
-                    // Updated system app
-                    flag = true;
-                } else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
-                    // Non-system app
-                    flag = true;
-                }
-                if (flag) {
-                    appList.add(appInfo);
-                }
-            }
-            return appList;
-        } else if (filterOption == FILTER_APPS_RUNNING) {
-            List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();
-            List<ActivityManager.RunningAppProcessInfo> procList = getRunningAppProcessesList();
-            if ((procList == null) || (procList.size() == 0)) {
-                return appList;
-            }
-            // Retrieve running processes from ActivityManager
-            for (ActivityManager.RunningAppProcessInfo appProcInfo : procList) {
-                if ((appProcInfo != null)  && (appProcInfo.pkgList != null)){
-                    int size = appProcInfo.pkgList.length;
-                    for (int i = 0; i < size; i++) {
-                        ApplicationInfo appInfo = null;
-                        try {
-                            appInfo = mPm.getApplicationInfo(appProcInfo.pkgList[i], 
-                                    PackageManager.GET_UNINSTALLED_PACKAGES);
-                        } catch (NameNotFoundException e) {
-                           Log.w(TAG, "Error retrieving ApplicationInfo for pkg:"+appProcInfo.pkgList[i]);
-                           continue;
-                        }
-                        if(appInfo != null) {
-                            appList.add(appInfo);
-                        }
-                    }
-                }
-            }
-            return appList;
-        } else {
-            return installedAppList;
-        }
-    }
-
-    private static boolean matchFilter(boolean filter, Map<String, String> filterMap, String pkg) {
-        boolean add = true;
-        if (filter) {
-            if (filterMap == null || !filterMap.containsKey(pkg)) {
-                add = false;
-            }
-        }
-        return add;
-    }
-    
-    /*
-     * Utility method used to figure out list of apps based on filterOption
-     * If the framework supports an additional flag to indicate running apps
-     *  we can get away with some code here.
-     */
-    List<ApplicationInfo> getFilteredApps(List<ApplicationInfo> pAppList, int filterOption, boolean filter,
-            Map<String, String> filterMap) {
-        List<ApplicationInfo> retList = new ArrayList<ApplicationInfo>();
-        if(pAppList == null) {
-            return retList;
-        }
-        if (filterOption == FILTER_APPS_SDCARD) {
-            for (ApplicationInfo appInfo : pAppList) {
-                boolean flag = false;
-                if ((appInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
-                    // App on sdcard
-                    flag = true;
-                }
-                if (flag) {
-                    if (matchFilter(filter, filterMap, appInfo.packageName)) {
-                        retList.add(appInfo);
-                    }
-                }
-            }
-            return retList;
-        } else if (filterOption == FILTER_APPS_THIRD_PARTY) {
-            for (ApplicationInfo appInfo : pAppList) {
-                boolean flag = false;
-                if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
-                    // Updated system app
-                    flag = true;
-                } else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
-                    // Non-system app
-                    flag = true;
-                }
-                if (flag) {
-                    if (matchFilter(filter, filterMap, appInfo.packageName)) {
-                        retList.add(appInfo);
-                    }
-                }
-            }
-            return retList;
-        } else if (filterOption == FILTER_APPS_RUNNING) {
-            List<ActivityManager.RunningAppProcessInfo> procList = getRunningAppProcessesList();
-            if ((procList == null) || (procList.size() == 0)) {
-                return retList;
-            }
-            // Retrieve running processes from ActivityManager
-            HashMap<String, ActivityManager.RunningAppProcessInfo> runningMap = 
-                new HashMap<String, ActivityManager.RunningAppProcessInfo>();
-            for (ActivityManager.RunningAppProcessInfo appProcInfo : procList) {
-                if ((appProcInfo != null)  && (appProcInfo.pkgList != null)){
-                    int size = appProcInfo.pkgList.length;
-                    for (int i = 0; i < size; i++) {
-                        runningMap.put(appProcInfo.pkgList[i], appProcInfo);
-                    }
-                }
-            }
-            // Query list to find running processes in current list
-            for (ApplicationInfo appInfo : pAppList) {
-                if (runningMap.get(appInfo.packageName) != null) {
-                    if (matchFilter(filter, filterMap, appInfo.packageName)) {
-                        retList.add(appInfo);
-                    }
-                }
-            }
-            return retList;
-        } else {
-            for (ApplicationInfo appInfo : pAppList) {
-                if (matchFilter(filter, filterMap, appInfo.packageName)) {
-                    retList.add(appInfo);
-                }
-            }
-            return retList;
-        }
-    }
-
-    private List<ActivityManager.RunningAppProcessInfo> getRunningAppProcessesList() {
-        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
-        return am.getRunningAppProcesses();
-    }
-
-     // Some initialization code used when kicking off the size computation
-    private void initAppList(List<ApplicationInfo> appList, int filterOption) {
-        setProgressBarIndeterminateVisibility(true);
-        mComputeSizesFinished = false;
-        mLoadLabelsFinished = false;
-        // Initialize lists
-        mAddRemoveMap = new TreeMap<String, Boolean>();
-        mAppInfoAdapter.initMapFromList(appList, filterOption);
-    }
-
-    // Utility method to start a thread to read application labels and icons
-    private void initResourceThread() {
-        if ((mResourceThread != null) && mResourceThread.isAlive()) {
-            mResourceThread.setAbort();
-        }
-        mResourceThread = new ResourceLoaderThread();
-        List<ApplicationInfo> appList = mAppInfoAdapter.getBaseAppList();
-        if ((appList != null) && (appList.size()) > 0) {
-            mResourceThread.loadAllResources(appList);
-        }
-    }
-
-    private void initComputeSizes() {
-         // Initiate compute package sizes
-        if (localLOGV) Log.i(TAG, "Initiating compute sizes for first time");
-        if ((mSizeComputor != null) && (mSizeComputor.isAlive())) {
-            mSizeComputor.setAbort();
-        }
-        List<ApplicationInfo> appList = mAppInfoAdapter.getBaseAppList();
-        if ((appList != null) && (appList.size()) > 0) {
-            mSizeComputor = new TaskRunner(appList);
-        } else {
-            mComputeSizesFinished = true;
-        }
-    }
-    
-    // internal structure used to track added and deleted packages when
-    // the activity has focus
-    static class AddRemoveInfo {
-        String pkgName;
-        boolean add;
-        public AddRemoveInfo(String pPkgName, boolean pAdd) {
-            pkgName = pPkgName;
-            add = pAdd;
-        }
-    }
-    
-    class ResourceLoaderThread extends Thread {
-        List<ApplicationInfo> mAppList;
-        volatile boolean abort = false;
-        static final int MSG_PKG_SIZE = 8;
-        
-        public void setAbort() {
-            abort = true;
-        }
-        void loadAllResources(List<ApplicationInfo> appList) {
-            mAppList = appList;
-            start();
-        }
-
-        public void run() {
-            long start;
-            if (DEBUG_TIME) {
-                start = SystemClock.elapsedRealtime();
-            }
-            int imax;
-            if(mAppList == null || (imax = mAppList.size()) <= 0) {
-                Log.w(TAG, "Empty or null application list");
-            } else {
-                int size = mAppList.size();
-                int numMsgs = size / MSG_PKG_SIZE;
-                if (size > (numMsgs * MSG_PKG_SIZE)) {
-                    numMsgs++;
-                }
-                int endi = 0;
-                for (int j = 0; j < size; j += MSG_PKG_SIZE) {
-                    Map<String, CharSequence> map = new HashMap<String, CharSequence>();
-                    endi += MSG_PKG_SIZE;
-                    if (endi > size) {
-                        endi = size;
-                    }
-                    for (int i = j; i < endi; i++) {
-                        if (abort) {
-                            // Exit if abort has been set.
-                            break;
-                        }
-                        ApplicationInfo appInfo = mAppList.get(i);
-                        map.put(appInfo.packageName, appInfo.loadLabel(mPm));
-                    }
-                    // Post update message
-                    Message msg = mHandler.obtainMessage(REFRESH_LABELS);
-                    msg.obj = map;
-                    mHandler.sendMessage(msg);
-                }
-                Message doneMsg = mHandler.obtainMessage(REFRESH_DONE);
-                mHandler.sendMessage(doneMsg);
-                if (DEBUG_TIME) Log.i(TAG, "Took "+(SystemClock.elapsedRealtime()-start)+
-                        " ms to load app labels");
-                long startIcons;
-                if (DEBUG_TIME) {
-                    startIcons = SystemClock.elapsedRealtime();
-                }
-                Map<String, Drawable> map = new HashMap<String, Drawable>();
-                for (int i = (imax-1); i >= 0; i--) {
-                    if (abort) {
-                        return;
-                    }
-                    ApplicationInfo appInfo = mAppList.get(i);
-                    map.put(appInfo.packageName, appInfo.loadIcon(mPm));
-                }
-                Message msg = mHandler.obtainMessage(REFRESH_ICONS);
-                msg.obj = map;
-                mHandler.sendMessage(msg);
-                if (DEBUG_TIME) Log.i(TAG, "Took "+(SystemClock.elapsedRealtime()-startIcons)+" ms to load app icons");
-            }
-            if (DEBUG_TIME) Log.i(TAG, "Took "+(SystemClock.elapsedRealtime()-start)+" ms to load app resources");
-        }
-    }
-    
-    /* Internal class representing an application or packages displayable attributes
-     * 
-     */
-    static private class AppInfo {
-        public String pkgName;
-        int index;
-        public CharSequence appName;
-        public Drawable appIcon;
-        public CharSequence appSize;
-        long size;
-
-        public void refreshIcon(Drawable icon) {
-            if (icon == null) {
-                return;
-            }
-            appIcon = icon;
-        }
-        public void refreshLabel(CharSequence label) {
-            if (label == null) {
-                return;
-            }
-            appName = label;
-        }
-
-        public AppInfo(String pName, int pIndex, CharSequence aName,
-                long pSize,
-                CharSequence pSizeStr) {
-            this(pName, pIndex, aName, mDefaultAppIcon, pSize, pSizeStr);
-        }
- 
-        public AppInfo(String pName, int pIndex, CharSequence aName, Drawable aIcon,
-                long pSize,
-                CharSequence pSizeStr) {
-            index = pIndex;
-            pkgName = pName;
-            appName = aName;
-            appIcon = aIcon;
-            size = pSize;
-            appSize = pSizeStr;
-        }
- 
-        public boolean setSize(long newSize, String formattedSize) {
-            if (size != newSize) {
-                size = newSize;
-                appSize = formattedSize;
-                return true;
-            }
-            return false;
-        }
-    }
-    
-    private long getTotalSize(PackageStats ps) {
-        if (ps != null) {
-            return ps.cacheSize+ps.codeSize+ps.dataSize;
-        }
-        return SIZE_INVALID;
-    }
-
-    private CharSequence getSizeStr(long size) {
-        CharSequence appSize = null;
-        if (size == SIZE_INVALID) {
-             return mInvalidSizeStr;
-        }
-        appSize = Formatter.formatFileSize(ManageApplications.this, size);
-        return appSize;
-    }
-
-    // View Holder used when displaying views
-    static class AppViewHolder {
-        TextView appName;
-        ImageView appIcon;
-        TextView appSize;
-    }
-    
-    /* 
-     * Custom adapter implementation for the ListView
-     * This adapter maintains a map for each displayed application and its properties
-     * An index value on each AppInfo object indicates the correct position or index
-     * in the list. If the list gets updated dynamically when the user is viewing the list of
-     * applications, we need to return the correct index of position. This is done by mapping
-     * the getId methods via the package name into the internal maps and indices.
-     * The order of applications in the list is mirrored in mAppLocalList
-     */
-    class AppInfoAdapter extends BaseAdapter implements Filterable {   
-        private List<ApplicationInfo> mAppList;
-        private List<ApplicationInfo> mAppLocalList;
-        private Map<String, String> mFilterMap = new HashMap<String, String>();
-        AlphaComparator mAlphaComparator = new AlphaComparator();
-        SizeComparator mSizeComparator = new SizeComparator();
-        private Filter mAppFilter = new AppFilter();
-        final private Object mFilterLock = new Object();
-        private Map<String, String> mCurrentFilterMap = null;
-
-        private void generateFilterListLocked(List<ApplicationInfo> list) {
-            mAppLocalList = new ArrayList<ApplicationInfo>(list);
-            synchronized(mFilterLock) {
-                for (ApplicationInfo info : mAppLocalList) {
-                    String label = info.packageName;
-                    AppInfo aInfo = mCache.getEntry(info.packageName);
-                    if ((aInfo != null) && (aInfo.appName != null)) {
-                        label = aInfo.appName.toString();
-                    }
-                    mFilterMap.put(info.packageName, label.toLowerCase());
-                }
-            }
-        }
-
-        private void addFilterListLocked(int newIdx, ApplicationInfo info, CharSequence pLabel) {
-            mAppLocalList.add(newIdx, info);
-            synchronized (mFilterLock) {
-                String label = info.packageName;
-                if (pLabel != null) {
-                    label = pLabel.toString();
-                }
-                mFilterMap.put(info.packageName, label.toLowerCase());
-            }
-        }
-
-        private boolean removeFilterListLocked(String removePkg) {
-            // Remove from filtered list
-            int N = mAppLocalList.size();
-            int i;
-            for (i = (N-1); i >= 0; i--) {
-                ApplicationInfo info = mAppLocalList.get(i);
-                if (info.packageName.equalsIgnoreCase(removePkg)) {
-                    if (localLOGV) Log.i(TAG, "Removing " + removePkg + " from local list");
-                    mAppLocalList.remove(i);
-                    synchronized (mFilterLock) {
-                        mFilterMap.remove(removePkg);
-                    }
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private void reverseGenerateList() {
-            generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
-            sortListInner(mSortOrder);
-        }
-
-        // Make sure the cache or map contains entries for all elements
-        // in appList for a valid sort.
-        public void initMapFromList(List<ApplicationInfo> pAppList, int filterOption) {
-            boolean notify = false;
-            List<ApplicationInfo> appList = null;
-            if (pAppList == null) {
-                // Just refresh the list
-                appList = mAppList;
-            } else {
-                mAppList = new ArrayList<ApplicationInfo>(pAppList);
-                appList = pAppList;
-                notify = true;
-            }
-            generateFilterListLocked(getFilteredApps(appList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
-            // This loop verifies and creates new entries for new packages in list
-            int imax = appList.size();
-            for (int i = 0; i < imax; i++) {
-                ApplicationInfo info  = appList.get(i);
-                AppInfo aInfo = mCache.getEntry(info.packageName);
-                if(aInfo == null){
-                    aInfo = new AppInfo(info.packageName, i, 
-                            info.packageName, -1, mComputingSizeStr);
-                    if (localLOGV) Log.i(TAG, "Creating entry pkg:"+info.packageName+" to map");
-                    mCache.addEntry(aInfo);
-                }
-            }
-            sortListInner(mSortOrder);
-            if (notify) {
-                notifyDataSetChanged();
-            }
-        }
-        
-        public AppInfoAdapter(Context c, List<ApplicationInfo> appList) {
-           mAppList = appList;
-        }
-        
-        public int getCount() {
-            return mAppLocalList.size();
-        }
-        
-        public Object getItem(int position) {
-            return mAppLocalList.get(position);
-        }
-        
-        public boolean isInstalled(String pkgName) {
-            if(pkgName == null) {
-                if (localLOGV) Log.w(TAG, "Null pkg name when checking if installed");
-                return false;
-            }
-            for (ApplicationInfo info : mAppList) {
-                if (info.packageName.equalsIgnoreCase(pkgName)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public ApplicationInfo getApplicationInfo(int position) {
-            int imax = mAppLocalList.size();
-            if( (position < 0) || (position >= imax)) {
-                Log.w(TAG, "Position out of bounds in List Adapter");
-                return null;
-            }
-            return mAppLocalList.get(position);
-        }
-
-        public long getItemId(int position) {
-            int imax = mAppLocalList.size();
-            if( (position < 0) || (position >= imax)) {
-                Log.w(TAG, "Position out of bounds in List Adapter");
-                return -1;
-            }
-            AppInfo aInfo = mCache.getEntry(mAppLocalList.get(position).packageName);
-            if (aInfo == null) {
-                return -1;
-            }
-            return aInfo.index;
-        }
-        
-        public List<ApplicationInfo> getBaseAppList() {
-            return mAppList;
-        }
-        
-        public View getView(int position, View convertView, ViewGroup parent) {
-            if (position >= mAppLocalList.size()) {
-                Log.w(TAG, "Invalid view position:"+position+", actual size is:"+mAppLocalList.size());
-                return null;
-            }
-            // A ViewHolder keeps references to children views to avoid unnecessary calls
-            // to findViewById() on each row.
-            AppViewHolder holder;
-
-            // When convertView is not null, we can reuse it directly, there is no need
-            // to reinflate it. We only inflate a new View when the convertView supplied
-            // by ListView is null.
-            if (convertView == null) {
-                convertView = mInflater.inflate(R.layout.manage_applications_item, null);
-
-                // Creates a ViewHolder and store references to the two children views
-                // we want to bind data to.
-                holder = new AppViewHolder();
-                holder.appName = (TextView) convertView.findViewById(R.id.app_name);
-                holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
-                holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
-                convertView.setTag(holder);
-            } else {
-                // Get the ViewHolder back to get fast access to the TextView
-                // and the ImageView.
-                holder = (AppViewHolder) convertView.getTag();
-            }
-
-            // Bind the data efficiently with the holder
-            ApplicationInfo appInfo = mAppLocalList.get(position);
-            AppInfo mInfo = mCache.getEntry(appInfo.packageName);
-            if(mInfo != null) {
-                if(mInfo.appName != null) {
-                    holder.appName.setText(mInfo.appName);
-                }
-                if(mInfo.appIcon != null) {
-                    holder.appIcon.setImageDrawable(mInfo.appIcon);
-                }
-                if (mInfo.appSize != null) {
-                    holder.appSize.setText(mInfo.appSize);
-                }
-            } else {
-                Log.w(TAG, "No info for package:"+appInfo.packageName+" in property map");
-            }
-            return convertView;
-        }
-        
-        private void adjustIndex() {
-            int imax = mAppLocalList.size();
-            for (int i = 0; i < imax; i++) {
-                ApplicationInfo info = mAppLocalList.get(i);
-                mCache.getEntry(info.packageName).index = i;
-            }
-        }
-        
-        public void sortAppList(List<ApplicationInfo> appList, int sortOrder) {
-            Collections.sort(appList, getAppComparator(sortOrder));
-        }
-        
-        public void sortBaseList(int sortOrder) {
-            if (localLOGV) Log.i(TAG, "Sorting base list based on sortOrder = "+sortOrder);
-            sortAppList(mAppList, sortOrder);
-            generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
-            adjustIndex();
-        }
-
-        private void sortListInner(int sortOrder) {
-            sortAppList(mAppLocalList, sortOrder);
-            adjustIndex(); 
-        }
-        
-        public void sortList(int sortOrder) {
-            if (localLOGV) Log.i(TAG, "sortOrder = "+sortOrder);
-            sortListInner(sortOrder);
-            notifyDataSetChanged();
-        }
-        
-        /*
-         * Reset the application list associated with this adapter.
-         * @param filterOption Sort the list based on this value
-         * @param appList the actual application list that is used to reset
-         * @return Return a boolean value to indicate inconsistency
-         */
-        public boolean resetAppList(int filterOption) {
-           // Change application list based on filter option
-           generateFilterListLocked(getFilteredApps(mAppList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
-           // Check for all properties in map before sorting. Populate values from cache
-           for(ApplicationInfo applicationInfo : mAppLocalList) {
-               AppInfo appInfo = mCache.getEntry(applicationInfo.packageName);
-               if(appInfo == null) {
-                  Log.i(TAG, " Entry does not exist for pkg:  " + applicationInfo.packageName);
-               }
-           }
-           if (mAppLocalList.size() > 0) {
-               sortList(mSortOrder);
-           } else {
-               notifyDataSetChanged();
-           }
-           return true;
-        }
-        
-        private Comparator<ApplicationInfo> getAppComparator(int sortOrder) {
-            if (sortOrder == SORT_ORDER_ALPHA) {
-                return mAlphaComparator;
-            }
-            return mSizeComparator;
-        }
-
-        public void bulkUpdateIcons(Map<String, Drawable> icons) {
-            if (icons == null) {
-                return;
-            }
-            Set<String> keys = icons.keySet();
-            boolean changed = false;
-            for (String key : keys) {
-                Drawable ic = icons.get(key);
-                if (ic != null) {
-                    AppInfo aInfo = mCache.getEntry(key);
-                    if (aInfo != null) {
-                        aInfo.refreshIcon(ic);
-                        changed = true;
-                    }
-                }
-            }
-            if (changed) {
-                notifyDataSetChanged();
-            }
-        }
-
-        public void bulkUpdateLabels(Map<String, CharSequence> map) {
-            if (map == null) {
-                return;
-            }
-            Set<String> keys = map.keySet();
-            boolean changed = false;
-            for (String key : keys) {
-                CharSequence label = map.get(key);
-                AppInfo aInfo = mCache.getEntry(key);
-                if (aInfo != null) {
-                    aInfo.refreshLabel(label);
-                    changed = true;
-                }
-            }
-            if (changed) {
-                notifyDataSetChanged();
-            }
-        }
-
-        private boolean shouldBeInList(int filterOption, ApplicationInfo info) {
-            // Match filter here
-            if (filterOption == FILTER_APPS_RUNNING) {
-                List<ApplicationInfo> runningList = getInstalledApps(FILTER_APPS_RUNNING);
-                for (ApplicationInfo running : runningList) {
-                    if (running.packageName.equalsIgnoreCase(info.packageName)) {
-                        return true;
-                    }
-                }
-            } else if (filterOption == FILTER_APPS_THIRD_PARTY) {
-                if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
-                    return true;
-                } else if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
-                    return true;
-                }
-            } else if (filterOption == FILTER_APPS_SDCARD) {
-                if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
-                    return true;
-                }
-            } else {
-                return true;
-            }
-            return false;
-        }
-        
-        /*
-         * Add a package to the current list.
-         * The package is only added to the displayed list
-         * based on the filter value. The package is always added to the property map.
-         * @param pkgName name of package to be added
-         * @param ps PackageStats of new package
-         */
-        public void addToList(String pkgName, long size, String formattedSize) {
-            if (pkgName == null) {
-                return;
-            }
-            // Get ApplicationInfo
-            ApplicationInfo info = null;
-            try {
-                info = mPm.getApplicationInfo(pkgName, 0);
-            } catch (NameNotFoundException e) {
-                Log.w(TAG, "Ignoring non-existent package:"+pkgName);
-                return;
-            }
-            if(info == null) {
-                // Nothing to do log error message and return
-                Log.i(TAG, "Null ApplicationInfo for package:"+pkgName);
-                return;
-            }
-            // Add entry to base list
-            mAppList.add(info);
-            // Add entry to map. Note that the index gets adjusted later on based on
-            // whether the newly added package is part of displayed list
-            CharSequence label = info.loadLabel(mPm);
-            mCache.addEntry(new AppInfo(pkgName, -1,
-                    label, info.loadIcon(mPm), size, formattedSize));
-            if (addLocalEntry(info, label)) {
-                notifyDataSetChanged();
-            }
-        }
-
-        private boolean addLocalEntry(ApplicationInfo info, CharSequence label) {
-            String pkgName = info.packageName;
-            // Add to list
-            if (shouldBeInList(mFilterApps, info)) {
-                // Binary search returns a negative index (ie -index) of the position where
-                // this might be inserted. 
-                int newIdx = Collections.binarySearch(mAppLocalList, info, 
-                        getAppComparator(mSortOrder));
-                if(newIdx >= 0) {
-                    if (localLOGV) Log.i(TAG, "Strange. Package:" + pkgName + " is not new");
-                    return false;
-                }
-                // New entry
-                newIdx = -newIdx-1;
-                addFilterListLocked(newIdx, info, label);
-                // Adjust index
-                adjustIndex();
-                return true;
-            }
-            return false;
-        }
-
-        public void updatePackage(String pkgName,
-                long size, String formattedSize) {
-            ApplicationInfo info = null;
-            try {
-                info = mPm.getApplicationInfo(pkgName,
-                        PackageManager.GET_UNINSTALLED_PACKAGES);
-            } catch (NameNotFoundException e) {
-                return;
-            }
-            AppInfo aInfo = mCache.getEntry(pkgName);
-            if (aInfo != null) {
-                CharSequence label = info.loadLabel(mPm);
-                aInfo.refreshLabel(label);
-                aInfo.refreshIcon(info.loadIcon(mPm));
-                aInfo.setSize(size, formattedSize);
-                // Check if the entry has to be added to the displayed list
-                addLocalEntry(info, label);
-                // Refresh list since size might have changed
-                notifyDataSetChanged();
-            }
-        }
-
-        private void removePkgBase(String pkgName) {
-            int imax = mAppList.size();
-            for (int i = 0; i < imax; i++) {
-                ApplicationInfo app = mAppList.get(i);
-                if (app.packageName.equalsIgnoreCase(pkgName)) {
-                    if (localLOGV) Log.i(TAG, "Removing pkg: "+pkgName+" from base list");
-                    mAppList.remove(i);
-                    return;
-                }
-            }
-        }
- 
-        public void removeFromList(List<String> pkgNames) {
-            if(pkgNames == null) {
-                return;
-            }
-            if(pkgNames.size()  <= 0) {
-                return;
-            }
-            boolean found = false;
-            for (String pkg : pkgNames) {
-                // Remove from the base application list
-                removePkgBase(pkg);
-                // Remove from cache
-                if (localLOGV) Log.i(TAG, "Removing " + pkg + " from cache");
-                mCache.removeEntry(pkg);
-                // Remove from filtered list
-                if (removeFilterListLocked(pkg)) {
-                    found = true;
-                }
-            }
-            // Adjust indices of list entries
-            if (found) {
-                adjustIndex();
-                if (localLOGV) Log.i(TAG, "adjusting index and notifying list view");
-                notifyDataSetChanged();
-            }
-        }
-
-        public void bulkUpdateSizes(String pkgs[], long sizes[], String formatted[]) {
-            if(pkgs == null || sizes == null || formatted == null) {
-                return;
-            }
-            boolean changed = false;
-            for (int i = 0; i < pkgs.length; i++) {
-                AppInfo entry = mCache.getEntry(pkgs[i]);
-                if (entry == null) {
-                    if (localLOGV) Log.w(TAG, "Entry for package:"+ pkgs[i] +"doesn't exist in map");
-                    continue;
-                }
-                if (entry.setSize(sizes[i], formatted[i])) {
-                    changed = true;
-                }
-            }
-            if (changed) {
-                notifyDataSetChanged();
-            }
-        }
-
-        public Filter getFilter() {
-            return mAppFilter;
-        }
-
-        private class AppFilter extends Filter {
-            @Override
-            protected FilterResults performFiltering(CharSequence prefix) {
-                FilterResults results = new FilterResults();
-                if (prefix == null || prefix.length() == 0) {
-                    synchronized (mFilterLock) {
-                        results.values = new HashMap<String, String>(mFilterMap);
-                        results.count = mFilterMap.size();
-                    }
-                } else {
-                    final String prefixString = prefix.toString().toLowerCase();
-                    final String spacePrefixString = " " + prefixString;
-                    Map<String, String> newMap = new HashMap<String, String>();
-                    synchronized (mFilterLock) {
-                        Map<String, String> localMap = mFilterMap;
-                        Set<String> keys = mFilterMap.keySet();
-                        for (String key : keys) {
-                            String label = localMap.get(key);
-                            if (label == null) continue;
-                            label = label.toLowerCase();
-                            if (label.startsWith(prefixString)
-                                    || label.indexOf(spacePrefixString) != -1) {
-                                newMap.put(key, label);
-                            }
-                        }
-                    }
-                    results.values = newMap;
-                    results.count = newMap.size();
-                }
-                return results;
-            }
-
-            @Override
-            protected void publishResults(CharSequence constraint, FilterResults results) {
-                mCurrentFilterMap = (Map<String, String>) results.values;
-                reverseGenerateList();
-                if (results.count > 0) {
-                    notifyDataSetChanged();
-                } else {
-                    notifyDataSetInvalidated();
-                }
-            }
-        }
-    }
-    
-    /*
-     * Utility method to clear messages to Handler
-     * We need'nt synchronize on the Handler since posting messages is guaranteed
-     * to be thread safe. Even if the other thread that retrieves package sizes
-     * posts a message, we do a cursory check of validity on mAppInfoAdapter's applist
-     */
-    private void clearMessagesInHandler() {
-        mHandler.removeMessages(INIT_PKG_INFO);
-        mHandler.removeMessages(COMPUTE_BULK_SIZE);
-        mHandler.removeMessages(REMOVE_PKG);
-        mHandler.removeMessages(REORDER_LIST);
-        mHandler.removeMessages(ADD_PKG_START);
-        mHandler.removeMessages(ADD_PKG_DONE);
-        mHandler.removeMessages(REFRESH_LABELS);
-        mHandler.removeMessages(REFRESH_DONE);
-        mHandler.removeMessages(NEXT_LOAD_STEP);
-        mHandler.removeMessages(COMPUTE_END);
-    }
-    
-    private void sendMessageToHandler(int msgId, int arg1) {
-        Message msg = mHandler.obtainMessage(msgId);
-        msg.arg1 = arg1;
-        mHandler.sendMessage(msg);
-    }
-    
-    private void sendMessageToHandler(int msgId, Bundle data) {
-        Message msg = mHandler.obtainMessage(msgId);
-        msg.setData(data);
-        mHandler.sendMessage(msg);
-    }
-    
-    private void sendMessageToHandler(int msgId) {
-        mHandler.sendEmptyMessage(msgId);
-    }
-    
-    /*
-     * Stats Observer class used to compute package sizes and retrieve size information
-     * PkgSizeOberver is the call back thats used when invoking getPackageSizeInfo on
-     * PackageManager. The values in call back onGetStatsCompleted are validated
-     * and the specified message is passed to mHandler. The package name
-     * and the AppInfo object corresponding to the package name are set on the message
-     */
-    class PkgSizeObserver extends IPackageStatsObserver.Stub {
-        String pkgName;
-        public void onGetStatsCompleted(PackageStats pStats, boolean pSucceeded) {
-            if(DEBUG_PKG_DELAY) {
-                try {
-                    Thread.sleep(10*1000);
-                } catch (InterruptedException e) {
-                }
-            }
-            Bundle data = new Bundle();
-            data.putString(ATTR_PKG_NAME, pkgName);
-            data.putBoolean(ATTR_GET_SIZE_STATUS, pSucceeded);
-            if(pSucceeded && pStats != null) {
-                if (localLOGV) Log.i(TAG, "onGetStatsCompleted::"+pkgName+", ("+
-                        pStats.cacheSize+","+
-                        pStats.codeSize+", "+pStats.dataSize);
-                long total = getTotalSize(pStats);
-                data.putLong(ATTR_PKG_STATS, total);
-                CharSequence sizeStr = getSizeStr(total);
-                data.putString(ATTR_PKG_SIZE_STR, sizeStr.toString());
-            } else {
-                Log.w(TAG, "Invalid package stats from PackageManager");
-            }
-            // Post message to Handler
-            Message msg = mHandler.obtainMessage(ADD_PKG_DONE, data);
-            msg.setData(data);
-            mHandler.sendMessage(msg);
-        }
-
-        public void invokeGetSizeInfo(String packageName) {
-            if (packageName == null) {
-                return;
-            }
-            pkgName = packageName;
-            if(localLOGV) Log.i(TAG, "Invoking getPackageSizeInfo for package:"+
-                    packageName);
-            mPm.getPackageSizeInfo(packageName, this);
-        }
-    }
-    
-    /**
-     * Receives notifications when applications are added/removed.
-     */
-    private class PackageIntentReceiver extends BroadcastReceiver {
-         void registerReceiver() {
-             IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
-             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-             filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-             filter.addDataScheme("package");
-             ManageApplications.this.registerReceiver(this, filter);
-             // Register for events related to sdcard installation.
-             IntentFilter sdFilter = new IntentFilter();
-             sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
-             sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
-             ManageApplications.this.registerReceiver(this, sdFilter);
-         }
-         @Override
-         public void onReceive(Context context, Intent intent) {
-             String actionStr = intent.getAction();
-             if (Intent.ACTION_PACKAGE_ADDED.equals(actionStr) ||
-                     Intent.ACTION_PACKAGE_REMOVED.equals(actionStr)) {
-                 Uri data = intent.getData();
-                 String pkgName = data.getEncodedSchemeSpecificPart();
-                 updatePackageList(actionStr, pkgName);
-             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr) ||
-                     Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(actionStr)) {
-                 // When applications become available or unavailable (perhaps because
-                 // the SD card was inserted or ejected) we need to refresh the
-                 // AppInfo with new label, icon and size information as appropriate
-                 // given the newfound (un)availability of the application.
-                 // A simple way to do that is to treat the refresh as a package
-                 // removal followed by a package addition.
-                 String pkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
-                 if (pkgList == null || pkgList.length == 0) {
-                     // Ignore
-                     return;
-                 }
-                 for (String pkgName : pkgList) {
-                     updatePackageList(Intent.ACTION_PACKAGE_REMOVED, pkgName);
-                     updatePackageList(Intent.ACTION_PACKAGE_ADDED, pkgName);
-                 }
-             }
-         }
-    }
-
-    private void updatePackageList(String actionStr, String pkgName) {
-        if (Intent.ACTION_PACKAGE_ADDED.equalsIgnoreCase(actionStr)) {
-            Bundle data = new Bundle();
-            data.putString(ATTR_PKG_NAME, pkgName);
-            sendMessageToHandler(ADD_PKG_START, data);
-        } else if (Intent.ACTION_PACKAGE_REMOVED.equalsIgnoreCase(actionStr)) {
-            Bundle data = new Bundle();
-            data.putString(ATTR_PKG_NAME, pkgName);
-            sendMessageToHandler(REMOVE_PKG, data);
-        }
-    }
-
-    static final String TAB_DOWNLOADED = "Downloaded";
-    static final String TAB_RUNNING = "Running";
-    static final String TAB_ALL = "All";
-    static final String TAB_SDCARD = "OnSdCard";
-    private View mRootView;
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if(localLOGV) Log.i(TAG, "Activity created");
-        long sCreate;
-        if (DEBUG_TIME) {
-            sCreate = SystemClock.elapsedRealtime();
-        }
-        Intent intent = getIntent();
-        String action = intent.getAction();
-        String defaultTabTag = TAB_DOWNLOADED;
-        if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
-            mSortOrder = SORT_ORDER_SIZE;
-            mFilterApps = FILTER_APPS_ALL;
-            defaultTabTag = TAB_ALL;
-            mSizesFirst = true;
-        }
-        mPm = getPackageManager();
-        // initialize some window features
-        requestWindowFeature(Window.FEATURE_RIGHT_ICON);
-        requestWindowFeature(Window.FEATURE_PROGRESS);
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-        showLoadingMsg();
-        mDefaultAppIcon = Resources.getSystem().getDrawable(
-                com.android.internal.R.drawable.sym_def_app_icon);
-        mInvalidSizeStr = getText(R.string.invalid_size_value);
-        mComputingSizeStr = getText(R.string.computing_size);
-        // initialize the inflater
-        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        mRootView = mInflater.inflate(R.layout.compute_sizes, null);
-        mReceiver = new PackageIntentReceiver();
-        mObserver = new PkgSizeObserver();
-        // Create adapter and list view here
-        List<ApplicationInfo> appList = getInstalledApps(FILTER_APPS_ALL);
-        mAppInfoAdapter = new AppInfoAdapter(this, appList);
-        ListView lv = (ListView) mRootView.findViewById(android.R.id.list);
-        lv.setOnItemClickListener(this);
-        lv.setSaveEnabled(true);
-        lv.setItemsCanFocus(true);
-        lv.setOnItemClickListener(this);
-        lv.setTextFilterEnabled(true);
-        mListView = lv;
-        if (DEBUG_TIME) {
-            Log.i(TAG, "Total time in Activity.create:: " +
-                    (SystemClock.elapsedRealtime() - sCreate)+ " ms");
-        }
-        // Get initial info from file for the very first time this activity started
-        long sStart;
-        if (DEBUG_TIME) {
-            sStart = SystemClock.elapsedRealtime();
-        }
-        mCache.loadCache();
-        if (DEBUG_TIME) {
-            Log.i(TAG, "Took " + (SystemClock.elapsedRealtime()-sStart) + " ms to init cache");
-        }
-
-        final TabHost tabHost = getTabHost();
-        tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED)
-                .setIndicator(getString(R.string.filter_apps_third_party),
-                        getResources().getDrawable(R.drawable.ic_tab_download))
-                .setContent(this));
-        tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING)
-                .setIndicator(getString(R.string.filter_apps_running),
-                        getResources().getDrawable(R.drawable.ic_tab_running))
-                .setContent(this));
-        tabHost.addTab(tabHost.newTabSpec(TAB_ALL)
-                .setIndicator(getString(R.string.filter_apps_all),
-                        getResources().getDrawable(R.drawable.ic_tab_all))
-                .setContent(this));
-        tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD)
-                .setIndicator(getString(R.string.filter_apps_onsdcard),
-                        getResources().getDrawable(R.drawable.ic_tab_sdcard))
-                .setContent(this));
-        tabHost.setCurrentTabByTag(defaultTabTag);
-        tabHost.setOnTabChangedListener(this);
-    }
-    
-    @Override
-    protected void onDestroy() {
-        // Persist values in cache
-        mCache.updateCache();
-        super.onDestroy();
-    }
-
-    @Override
-    public Dialog onCreateDialog(int id, Bundle args) {
-        if (id == DLG_LOADING) {
-            ProgressDialog dlg = new ProgressDialog(this);
-            dlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-            dlg.setMessage(getText(R.string.loading));
-            dlg.setIndeterminate(true);        
-            dlg.setOnCancelListener(this);
-            return dlg;
-        }
-        return null;
-    }
-
-    private void showLoadingMsg() {
-        if (DEBUG_TIME) {
-            mLoadTimeStart = SystemClock.elapsedRealtime();
-        }
-        showDialog(DLG_LOADING); 
-        if(localLOGV) Log.i(TAG, "Displaying Loading message");
-    }
-    
-    private void dismissLoadingMsg() {
-        if(localLOGV) Log.i(TAG, "Dismissing Loading message");
-        dismissDialog(DLG_LOADING);
-        if (DEBUG_TIME) Log.i(TAG, "Displayed loading message for "+
-                (SystemClock.elapsedRealtime() - mLoadTimeStart) + " ms");
-    }
-
-    class AppInfoCache {
-        final static boolean FILE_CACHE = true;
-        private static final String mFileCacheName="ManageAppsInfo.txt";
-        private static final int FILE_BUFFER_SIZE = 1024;
-        private static final boolean DEBUG_CACHE = false;
-        private static final boolean DEBUG_CACHE_TIME = false;
-        private Map<String, AppInfo> mAppPropCache = new HashMap<String, AppInfo>();
-
-        private boolean isEmpty() {
-            return (mAppPropCache.size() == 0);
-        }
-
-        private AppInfo getEntry(String pkgName) {
-            return mAppPropCache.get(pkgName);
-        }
-
-        private Set<String> getPkgList() {
-            return mAppPropCache.keySet();
-        }
-
-        public void addEntry(AppInfo aInfo) {
-            if ((aInfo != null) && (aInfo.pkgName != null)) {
-                mAppPropCache.put(aInfo.pkgName, aInfo);
-            }
-        }
-
-        public void removeEntry(String pkgName) {
-            if (pkgName != null) {
-                mAppPropCache.remove(pkgName);
-            }
-        }
-
-        private void readFromFile() {
-            File cacheFile = new File(getFilesDir(), mFileCacheName);
-            if (!cacheFile.exists()) {
-                return;
-            }
-            FileInputStream fis = null;
-            boolean err = false;
-            try {
-                fis = new FileInputStream(cacheFile);
-            } catch (FileNotFoundException e) {
-                Log.w(TAG, "Error opening file for read operation : " + cacheFile
-                        + " with exception " + e);
-                return;
-            }
-            try {
-                byte[] byteBuff = new byte[FILE_BUFFER_SIZE];
-                byte[] lenBytes = new byte[2];
-                mAppPropCache.clear();
-                while(fis.available() > 0) {
-                    fis.read(lenBytes, 0, 2);
-                    int buffLen = (lenBytes[0] << 8) | lenBytes[1];
-                    if ((buffLen <= 0) || (buffLen > byteBuff.length)) {
-                        err = true;
-                        break;
-                    }
-                    // Buffer length cannot be greater than max.
-                    fis.read(byteBuff, 0, buffLen);
-                    String buffStr = new String(byteBuff);
-                    if (DEBUG_CACHE) {
-                        Log.i(TAG, "Read string of len= " + buffLen + " :: " + buffStr + " from file");
-                    }
-                    // Parse string for sizes
-                    String substrs[] = buffStr.split(",");
-                    if (substrs.length < 4) {
-                        // Something wrong. Bail out and let recomputation proceed.
-                        err = true;
-                        break;
-                    }
-                    long size = -1;
-                    int idx = -1;
-                    try {
-                        size = Long.parseLong(substrs[1]);
-                    } catch (NumberFormatException e) {
-                        err = true;
-                        break;
-                    }
-                    if (DEBUG_CACHE) {
-                        Log.i(TAG, "Creating entry(" + substrs[0] + ", " + idx+"," + size + ", " + substrs[2] + ")");
-                    }
-                    AppInfo aInfo = new AppInfo(substrs[0], idx, substrs[3], size, substrs[2]);
-                    mAppPropCache.put(aInfo.pkgName, aInfo);
-                }
-            } catch (IOException e) {
-                Log.w(TAG, "Failed reading from file : " + cacheFile + " with exception : " + e);
-                err = true;
-            } finally {
-                if (fis != null) {
-                    try {
-                        fis.close();
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed to close file " + cacheFile + " with exception : " +e);
-                        err = true;
-                    }
-                }
-                if (err) {
-                    Log.i(TAG, "Failed to load cache. Not using cache for now.");
-                    // Clear cache and bail out
-                    mAppPropCache.clear();
-                }
-            }
-        }
-
-        boolean writeToFile() {
-            File cacheFile = new File(getFilesDir(), mFileCacheName);
-            FileOutputStream fos = null;
-            try {
-                long opStartTime = SystemClock.uptimeMillis();
-                fos = new FileOutputStream(cacheFile);
-                Set<String> keys = mAppPropCache.keySet();
-                byte[] lenBytes = new byte[2];
-                for (String key : keys) {
-                    AppInfo aInfo = mAppPropCache.get(key);
-                    StringBuilder buff = new StringBuilder(aInfo.pkgName);
-                    buff.append(",");
-                    buff.append(aInfo.size);
-                    buff.append(",");
-                    buff.append(aInfo.appSize);
-                    buff.append(",");
-                    buff.append(aInfo.appName);
-                    if (DEBUG_CACHE) {
-                        Log.i(TAG, "Writing str : " + buff.toString() + " to file of length:" +
-                                buff.toString().length());
-                    }
-                    try {
-                        byte[] byteBuff = buff.toString().getBytes();
-                        int len = byteBuff.length;
-                        if (byteBuff.length >= FILE_BUFFER_SIZE) {
-                            // Truncate the output
-                            len = FILE_BUFFER_SIZE;
-                        }
-                        // Use 2 bytes to write length
-                        lenBytes[1] = (byte) (len & 0x00ff);
-                        lenBytes[0] = (byte) ((len & 0x00ff00) >> 8);
-                        fos.write(lenBytes, 0, 2);
-                        fos.write(byteBuff, 0, len);
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed to write to file : " + cacheFile + " with exception : " + e);
-                        return false;
-                    }
-                }
-                if (DEBUG_CACHE_TIME) {
-                    Log.i(TAG, "Took " + (SystemClock.uptimeMillis() - opStartTime) + " ms to write and process from file");
-                }
-                return true;
-            } catch (FileNotFoundException e) {
-                Log.w(TAG, "Error opening file for write operation : " + cacheFile+
-                        " with exception : " + e);
-                return false;
-            } finally {
-                if (fos != null) {
-                    try {
-                        fos.close();
-                    } catch (IOException e) {
-                        Log.w(TAG, "Failed closing file : " + cacheFile + " with exception : " + e);
-                        return false;
-                    }
-                }
-            }
-        }
-        private void loadCache() {
-             // Restore preferences
-            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
-            boolean disable = settings.getBoolean(PREF_DISABLE_CACHE, true);
-            if (disable) Log.w(TAG, "Cache has been disabled");
-            // Disable cache till the data is loaded successfully
-            SharedPreferences.Editor editor = settings.edit();
-            editor.putBoolean(PREF_DISABLE_CACHE, true);
-            editor.commit();
-            if (FILE_CACHE && !disable) {
-                readFromFile();
-                // Enable cache since the file has been read successfully
-                editor.putBoolean(PREF_DISABLE_CACHE, false);
-                editor.commit();
-            }
-        }
-
-        private void updateCache() {
-            SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
-            SharedPreferences.Editor editor = settings.edit();
-            editor.putBoolean(PREF_DISABLE_CACHE, true);
-            editor.commit();
-            if (FILE_CACHE) {
-                boolean writeStatus = writeToFile();
-                mAppPropCache.clear();
-                if (writeStatus) {
-                    // Enable cache since the file has been read successfully
-                    editor.putBoolean(PREF_DISABLE_CACHE, false);
-                    editor.commit();
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        // Register receiver
-        mReceiver.registerReceiver();
-        sendMessageToHandler(INIT_PKG_INFO);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        // Stop the background threads
-        if (mResourceThread != null) {
-            mResourceThread.setAbort();
-        }
-        if (mSizeComputor != null) {
-            mSizeComputor.setAbort();
-        }
-        // clear all messages related to application list
-        clearMessagesInHandler();
-        // register receiver here
-        unregisterReceiver(mReceiver);
-    }
-    
-    // Avoid the restart and pause when orientation changes
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-    }
-    
-    /*
-     * comparator class used to sort AppInfo objects based on size
-     */
-    class SizeComparator implements Comparator<ApplicationInfo> {
-        public final int compare(ApplicationInfo a, ApplicationInfo b) {
-            AppInfo ainfo = mCache.getEntry(a.packageName);
-            AppInfo binfo = mCache.getEntry(b.packageName);
-            long atotal = ainfo.size;
-            long btotal = binfo.size;
-            long ret = atotal - btotal;
-            // negate result to sort in descending order
-            if (ret < 0) {
-                return 1;
-            }
-            if (ret == 0) {
-                return 0;
-            }
-            return -1;
-        }
-    }
-
-    /*
-     * Customized comparator class to compare labels.
-     * Don't use the one defined in ApplicationInfo since that loads the labels again.
-     */
-    class AlphaComparator implements Comparator<ApplicationInfo> {
-        private final Collator   sCollator = Collator.getInstance();
-
-        public final int compare(ApplicationInfo a, ApplicationInfo b) {
-            AppInfo ainfo = mCache.getEntry(a.packageName);
-            AppInfo binfo = mCache.getEntry(b.packageName);
-            // Check for null app names, to avoid NPE in rare cases
-            if (ainfo == null || ainfo.appName == null) return -1;
-            if (binfo == null || binfo.appName == null) return 1;
-            return sCollator.compare(ainfo.appName.toString(), binfo.appName.toString());
-        }
-    }
-
-    // utility method used to start sub activity
-    private void startApplicationDetailsActivity() {
-        // Create intent to start new activity
-        Intent intent = new Intent(Intent.ACTION_VIEW);
-        intent.setClass(this, InstalledAppDetails.class);
-        intent.putExtra(APP_PKG_NAME, mCurrentPkgName);
-        // start new activity to display extended information
-        startActivityForResult(intent, INSTALLED_APP_DETAILS);
-    }
-    
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
-                .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
-        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
-                .setIcon(android.R.drawable.ic_menu_sort_by_size); 
-        return true;
-    }
-    
-    @Override
-    public boolean onPrepareOptionsMenu(Menu menu) {
-        if (mFirst) {
-            menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
-            menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        int menuId = item.getItemId();
-        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
-            sendMessageToHandler(REORDER_LIST, menuId);
-        }
-        return true;
-    }
-
-    public void onItemClick(AdapterView<?> parent, View view, int position,
-            long id) {
-        ApplicationInfo info = (ApplicationInfo)mAppInfoAdapter.getItem(position);
-        mCurrentPkgName = info.packageName;
-        startApplicationDetailsActivity();
-    }
-    
-    // Finish the activity if the user presses the back button to cancel the activity
-    public void onCancel(DialogInterface dialog) {
-        finish();
-    }
-
-    public View createTabContent(String tag) {
-        return mRootView;
-    }
-
-    public void onTabChanged(String tabId) {
-        int newOption;
-        if (TAB_DOWNLOADED.equalsIgnoreCase(tabId)) {
-            newOption = FILTER_APPS_THIRD_PARTY;
-        } else if (TAB_RUNNING.equalsIgnoreCase(tabId)) {
-            newOption = FILTER_APPS_RUNNING;
-        } else if (TAB_ALL.equalsIgnoreCase(tabId)) {
-            newOption = FILTER_APPS_ALL;
-        } else if (TAB_SDCARD.equalsIgnoreCase(tabId)) {
-            newOption = FILTER_APPS_SDCARD;
-        } else {
-            // Invalid option. Do nothing
-            return;
-        }
-        sendMessageToHandler(REORDER_LIST, newOption);
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode,
-            Intent data) {
-        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
-            // Refresh package attributes
-            try {
-                ApplicationInfo info = mPm.getApplicationInfo(mCurrentPkgName,
-                        PackageManager.GET_UNINSTALLED_PACKAGES);
-            } catch (NameNotFoundException e) {
-                Bundle rData = new Bundle();
-                rData.putString(ATTR_PKG_NAME, mCurrentPkgName);
-                sendMessageToHandler(REMOVE_PKG, rData);
-                mCurrentPkgName = null;
-            }
-        }
-    }
-}
diff --git a/src/com/android/settings/RunningServices.java b/src/com/android/settings/RunningServices.java
deleted file mode 100644
index ed970a7..0000000
--- a/src/com/android/settings/RunningServices.java
+++ /dev/null
@@ -1,1172 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings;
-
-import com.android.settings.R;
-import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ListActivity;
-import android.app.PendingIntent;
-import android.content.ActivityNotFoundException;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageItemInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ServiceInfo;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.text.format.DateUtils;
-import android.text.format.Formatter;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-
-import java.io.FileInputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-public class RunningServices extends ListActivity
-        implements AbsListView.RecyclerListener,
-        DialogInterface.OnClickListener {
-    static final String TAG = "RunningServices";
-    
-    /** Maximum number of services to retrieve */
-    static final int MAX_SERVICES = 100;
-    
-    static final int MSG_UPDATE_TIMES = 1;
-    static final int MSG_UPDATE_CONTENTS = 2;
-    static final int MSG_REFRESH_UI = 3;
-    
-    static final long TIME_UPDATE_DELAY = 1000;
-    static final long CONTENTS_UPDATE_DELAY = 2000;
-    
-    // Memory pages are 4K.
-    static final long PAGE_SIZE = 4*1024;
-    
-    long SECONDARY_SERVER_MEM;
-    
-    final HashMap<View, ActiveItem> mActiveItems = new HashMap<View, ActiveItem>();
-    
-    ActivityManager mAm;
-    
-    State mState;
-    
-    StringBuilder mBuilder = new StringBuilder(128);
-    
-    BaseItem mCurSelected;
-    
-    int mProcessBgColor;
-    
-    LinearColorBar mColorBar;
-    TextView mBackgroundProcessText;
-    TextView mForegroundProcessText;
-    
-    int mLastNumBackgroundProcesses = -1;
-    int mLastNumForegroundProcesses = -1;
-    int mLastNumServiceProcesses = -1;
-    long mLastBackgroundProcessMemory = -1;
-    long mLastForegroundProcessMemory = -1;
-    long mLastServiceProcessMemory = -1;
-    long mLastAvailMemory = -1;
-    
-    Dialog mCurDialog;
-    
-    byte[] mBuffer = new byte[1024];
-    
-    class ActiveItem {
-        View mRootView;
-        BaseItem mItem;
-        ActivityManager.RunningServiceInfo mService;
-        ViewHolder mHolder;
-        long mFirstRunTime;
-        
-        void updateTime(Context context) {
-            if (mItem.mIsProcess) {
-                String size = mItem.mSizeStr != null ? mItem.mSizeStr : "";
-                if (!size.equals(mItem.mCurSizeStr)) {
-                    mItem.mCurSizeStr = size;
-                    mHolder.size.setText(size);
-                }
-            } else {
-                if (mItem.mActiveSince >= 0) {
-                    mHolder.size.setText(DateUtils.formatElapsedTime(mBuilder,
-                            (SystemClock.uptimeMillis()-mFirstRunTime)/1000));
-                } else {
-                    mHolder.size.setText(context.getResources().getText(
-                            R.string.service_restarting));
-                }
-            }
-        }
-    }
-    
-    static class BaseItem {
-        final boolean mIsProcess;
-        
-        PackageItemInfo mPackageInfo;
-        CharSequence mDisplayLabel;
-        String mLabel;
-        String mDescription;
-        
-        int mCurSeq;
-        
-        long mActiveSince;
-        long mSize;
-        String mSizeStr;
-        String mCurSizeStr;
-        boolean mNeedDivider;
-        
-        public BaseItem(boolean isProcess) {
-            mIsProcess = isProcess;
-        }
-    }
-    
-    static class ServiceItem extends BaseItem {
-        ActivityManager.RunningServiceInfo mRunningService;
-        ServiceInfo mServiceInfo;
-        boolean mShownAsStarted;
-        
-        public ServiceItem() {
-            super(false);
-        }
-    }
-    
-    static class ProcessItem extends BaseItem {
-        final HashMap<ComponentName, ServiceItem> mServices
-                = new HashMap<ComponentName, ServiceItem>();
-        final SparseArray<ProcessItem> mDependentProcesses
-                = new SparseArray<ProcessItem>();
-        
-        final int mUid;
-        final String mProcessName;
-        int mPid;
-        
-        ProcessItem mClient;
-        int mLastNumDependentProcesses;
-        
-        int mRunningSeq;
-        ActivityManager.RunningAppProcessInfo mRunningProcessInfo;
-        
-        // Purely for sorting.
-        boolean mIsSystem;
-        boolean mIsStarted;
-        long mActiveSince;
-        
-        public ProcessItem(Context context, int uid, String processName) {
-            super(true);
-            mDescription = context.getResources().getString(
-                    R.string.service_process_name, processName);
-            mUid = uid;
-            mProcessName = processName;
-        }
-        
-        void ensureLabel(PackageManager pm) {
-            if (mLabel != null) {
-                return;
-            }
-            
-            try {
-                ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0);
-                if (ai.uid == mUid) {
-                    mDisplayLabel = ai.loadLabel(pm);
-                    mLabel = mDisplayLabel.toString();
-                    mPackageInfo = ai;
-                    return;
-                }
-            } catch (PackageManager.NameNotFoundException e) {
-            }
-            
-            // If we couldn't get information about the overall
-            // process, try to find something about the uid.
-            String[] pkgs = pm.getPackagesForUid(mUid);
-            
-            // If there is one package with this uid, that is what we want.
-            if (pkgs.length == 1) {
-                try {
-                    ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
-                    mDisplayLabel = ai.loadLabel(pm);
-                    mLabel = mDisplayLabel.toString();
-                    mPackageInfo = ai;
-                    return;
-                } catch (PackageManager.NameNotFoundException e) {
-                }
-            }
-            
-            // If there are multiple, see if one gives us the official name
-            // for this uid.
-            for (String name : pkgs) {
-                try {
-                    PackageInfo pi = pm.getPackageInfo(name, 0);
-                    if (pi.sharedUserLabel != 0) {
-                        CharSequence nm = pm.getText(name,
-                                pi.sharedUserLabel, pi.applicationInfo);
-                        if (nm != null) {
-                            mDisplayLabel = nm;
-                            mLabel = nm.toString();
-                            mPackageInfo = pi.applicationInfo;
-                            return;
-                        }
-                    }
-                } catch (PackageManager.NameNotFoundException e) {
-                }
-            }
-            
-            // If still don't have anything to display, just use the
-            // service info.
-            if (mServices.size() > 0) {
-                mPackageInfo = mServices.values().iterator().next()
-                        .mServiceInfo.applicationInfo;
-                mDisplayLabel = mPackageInfo.loadLabel(pm);
-                mLabel = mDisplayLabel.toString();
-                return;
-            }
-            
-            // Finally... whatever, just pick the first package's name.
-            try {
-                ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
-                mDisplayLabel = ai.loadLabel(pm);
-                mLabel = mDisplayLabel.toString();
-                mPackageInfo = ai;
-                return;
-            } catch (PackageManager.NameNotFoundException e) {
-            }
-        }
-        
-        boolean updateService(Context context,
-                ActivityManager.RunningServiceInfo service) {
-            final PackageManager pm = context.getPackageManager();
-            
-            boolean changed = false;
-            ServiceItem si = mServices.get(service.service);
-            if (si == null) {
-                changed = true;
-                si = new ServiceItem();
-                si.mRunningService = service;
-                try {
-                    si.mServiceInfo = pm.getServiceInfo(service.service, 0);
-                } catch (PackageManager.NameNotFoundException e) {
-                }
-                if (si.mServiceInfo != null && (si.mServiceInfo.labelRes != 0
-                        || si.mServiceInfo.nonLocalizedLabel != null)) {
-                    si.mDisplayLabel = si.mServiceInfo.loadLabel(pm);
-                    si.mLabel = si.mDisplayLabel.toString();
-                } else {
-                    si.mLabel = si.mRunningService.service.getClassName();
-                    int tail = si.mLabel.lastIndexOf('.');
-                    if (tail >= 0) {
-                        si.mLabel = si.mLabel.substring(tail+1, si.mLabel.length());
-                    }
-                    si.mDisplayLabel = si.mLabel;
-                }
-                si.mPackageInfo = si.mServiceInfo.applicationInfo;
-                mServices.put(service.service, si);
-            }
-            si.mCurSeq = mCurSeq;
-            si.mRunningService = service;
-            long activeSince = service.restarting == 0 ? service.activeSince : -1;
-            if (si.mActiveSince != activeSince) {
-                si.mActiveSince = activeSince;
-                changed = true;
-            }
-            if (service.clientPackage != null && service.clientLabel != 0) {
-                if (si.mShownAsStarted) {
-                    si.mShownAsStarted = false;
-                    changed = true;
-                }
-                try {
-                    Resources clientr = pm.getResourcesForApplication(service.clientPackage);
-                    String label = clientr.getString(service.clientLabel);
-                    si.mDescription = context.getResources().getString(
-                            R.string.service_client_name, label);
-                } catch (PackageManager.NameNotFoundException e) {
-                    si.mDescription = null;
-                }
-            } else {
-                if (!si.mShownAsStarted) {
-                    si.mShownAsStarted = true;
-                    changed = true;
-                }
-                si.mDescription = context.getResources().getString(
-                        R.string.service_started_by_app);
-            }
-            
-            return changed;
-        }
-        
-        boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) {
-            mSize = ((long)mem.getTotalPss()) * 1024;
-            if (mCurSeq == curSeq) {
-                String sizeStr = Formatter.formatShortFileSize(
-                        context, mSize);
-                if (!sizeStr.equals(mSizeStr)){
-                    mSizeStr = sizeStr;
-                    // We update this on the second tick where we update just
-                    // the text in the current items, so no need to say we
-                    // changed here.
-                    return false;
-                }
-            }
-            return false;
-        }
-        
-        boolean buildDependencyChain(Context context, PackageManager pm, int curSeq) {
-            final int NP = mDependentProcesses.size();
-            boolean changed = false;
-            for (int i=0; i<NP; i++) {
-                ProcessItem proc = mDependentProcesses.valueAt(i);
-                if (proc.mClient != this) {
-                    changed = true;
-                    proc.mClient = this;
-                }
-                proc.mCurSeq = curSeq;
-                proc.ensureLabel(pm);
-                changed |= proc.buildDependencyChain(context, pm, curSeq);
-            }
-            
-            if (mLastNumDependentProcesses != mDependentProcesses.size()) {
-                changed = true;
-                mLastNumDependentProcesses = mDependentProcesses.size();
-            }
-            
-            return changed;
-        }
-        
-        void addDependentProcesses(ArrayList<BaseItem> dest,
-                ArrayList<ProcessItem> destProc) {
-            final int NP = mDependentProcesses.size();
-            for (int i=0; i<NP; i++) {
-                ProcessItem proc = mDependentProcesses.valueAt(i);
-                proc.addDependentProcesses(dest, destProc);
-                dest.add(proc);
-                if (proc.mPid > 0) {
-                    destProc.add(proc);
-                }
-            }
-        }
-    }
-    
-    static class ServiceProcessComparator implements Comparator<ProcessItem> {
-        public int compare(ProcessItem object1, ProcessItem object2) {
-            if (object1.mIsStarted != object2.mIsStarted) {
-                // Non-started processes go last.
-                return object1.mIsStarted ? -1 : 1;
-            }
-            if (object1.mIsSystem != object2.mIsSystem) {
-                // System processes go below non-system.
-                return object1.mIsSystem ? 1 : -1;
-            }
-            if (object1.mActiveSince != object2.mActiveSince) {
-                // Remaining ones are sorted with the longest running
-                // services last.
-                return (object1.mActiveSince > object2.mActiveSince) ? -1 : 1;
-            }
-            return 0;
-        }
-    }
-    
-    static class State {
-        final SparseArray<HashMap<String, ProcessItem>> mProcesses
-                = new SparseArray<HashMap<String, ProcessItem>>();
-        final SparseArray<ProcessItem> mActiveProcesses
-                = new SparseArray<ProcessItem>();
-        final ServiceProcessComparator mServiceProcessComparator
-                = new ServiceProcessComparator();
-        
-        // Temporary for finding process dependencies.
-        final SparseArray<ProcessItem> mRunningProcesses
-                = new SparseArray<ProcessItem>();
-        
-        final ArrayList<ProcessItem> mProcessItems = new ArrayList<ProcessItem>();
-        final ArrayList<ProcessItem> mAllProcessItems = new ArrayList<ProcessItem>();
-        
-        int mSequence = 0;
-        
-        // ----- following protected by mLock -----
-        
-        // Lock for protecting the state that will be shared between the
-        // background update thread and the UI thread.
-        final Object mLock = new Object();
-        
-        ArrayList<BaseItem> mItems = new ArrayList<BaseItem>();
-        
-        int mNumBackgroundProcesses;
-        long mBackgroundProcessMemory;
-        int mNumForegroundProcesses;
-        long mForegroundProcessMemory;
-        int mNumServiceProcesses;
-        long mServiceProcessMemory;
-        
-        boolean update(Context context, ActivityManager am) {
-            final PackageManager pm = context.getPackageManager();
-            
-            mSequence++;
-            
-            boolean changed = false;
-            
-            List<ActivityManager.RunningServiceInfo> services 
-                    = am.getRunningServices(MAX_SERVICES);
-            final int NS = services != null ? services.size() : 0;
-            for (int i=0; i<NS; i++) {
-                ActivityManager.RunningServiceInfo si = services.get(i);
-                // We are not interested in services that have not been started
-                // and don't have a known client, because
-                // there is nothing the user can do about them.
-                if (!si.started && si.clientLabel == 0) {
-                    continue;
-                }
-                // We likewise don't care about services running in a
-                // persistent process like the system or phone.
-                if ((si.flags&ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS)
-                        != 0) {
-                    continue;
-                }
-                
-                HashMap<String, ProcessItem> procs = mProcesses.get(si.uid);
-                if (procs == null) {
-                    procs = new HashMap<String, ProcessItem>();
-                    mProcesses.put(si.uid, procs);
-                }
-                ProcessItem proc = procs.get(si.process);
-                if (proc == null) {
-                    changed = true;
-                    proc = new ProcessItem(context, si.uid, si.process);
-                    procs.put(si.process, proc);
-                }
-                
-                if (proc.mCurSeq != mSequence) {
-                    int pid = si.restarting == 0 ? si.pid : 0;
-                    if (pid != proc.mPid) {
-                        changed = true;
-                        if (proc.mPid != pid) {
-                            if (proc.mPid != 0) {
-                                mActiveProcesses.remove(proc.mPid);
-                            }
-                            if (pid != 0) {
-                                mActiveProcesses.put(pid, proc);
-                            }
-                            proc.mPid = pid;
-                        }
-                    }
-                    proc.mDependentProcesses.clear();
-                    proc.mCurSeq = mSequence;
-                }
-                changed |= proc.updateService(context, si);
-            }
-            
-            // Now update the map of other processes that are running (but
-            // don't have services actively running inside them).
-            List<ActivityManager.RunningAppProcessInfo> processes
-                    = am.getRunningAppProcesses();
-            final int NP = processes != null ? processes.size() : 0;
-            for (int i=0; i<NP; i++) {
-                ActivityManager.RunningAppProcessInfo pi = processes.get(i);
-                ProcessItem proc = mActiveProcesses.get(pi.pid);
-                if (proc == null) {
-                    // This process is not one that is a direct container
-                    // of a service, so look for it in the secondary
-                    // running list.
-                    proc = mRunningProcesses.get(pi.pid);
-                    if (proc == null) {
-                        proc = new ProcessItem(context, pi.uid, pi.processName);
-                        proc.mPid = pi.pid;
-                        mRunningProcesses.put(pi.pid, proc);
-                    }
-                    proc.mDependentProcesses.clear();
-                }
-                proc.mRunningSeq = mSequence;
-                proc.mRunningProcessInfo = pi;
-            }
-            
-            // Build the chains from client processes to the process they are
-            // dependent on; also remove any old running processes.
-            int NRP = mRunningProcesses.size();
-            for (int i=0; i<NRP; i++) {
-                ProcessItem proc = mRunningProcesses.valueAt(i);
-                if (proc.mRunningSeq == mSequence) {
-                    int clientPid = proc.mRunningProcessInfo.importanceReasonPid;
-                    if (clientPid != 0) {
-                        ProcessItem client = mActiveProcesses.get(clientPid);
-                        if (client == null) {
-                            client = mRunningProcesses.get(clientPid);
-                        }
-                        if (client != null) {
-                            client.mDependentProcesses.put(proc.mPid, proc);
-                        }
-                    } else {
-                        // In this pass the process doesn't have a client.
-                        // Clear to make sure if it later gets the same one
-                        // that we will detect the change.
-                        proc.mClient = null;
-                    }
-                } else {
-                    mRunningProcesses.remove(mRunningProcesses.keyAt(i));
-                }
-            }
-            
-            // Follow the tree from all primary service processes to all
-            // processes they are dependent on, marking these processes as
-            // still being active and determining if anything has changed.
-            final int NAP = mActiveProcesses.size();
-            for (int i=0; i<NAP; i++) {
-                ProcessItem proc = mActiveProcesses.valueAt(i);
-                if (proc.mCurSeq == mSequence) {
-                    changed |= proc.buildDependencyChain(context, pm, mSequence);
-                }
-            }
-            
-            // Look for services and their primary processes that no longer exist...
-            for (int i=0; i<mProcesses.size(); i++) {
-                HashMap<String, ProcessItem> procs = mProcesses.valueAt(i);
-                Iterator<ProcessItem> pit = procs.values().iterator();
-                while (pit.hasNext()) {
-                    ProcessItem pi = pit.next();
-                    if (pi.mCurSeq == mSequence) {
-                        pi.ensureLabel(pm);
-                        if (pi.mPid == 0) {
-                            // Sanity: a non-process can't be dependent on
-                            // anything.
-                            pi.mDependentProcesses.clear();
-                        }
-                    } else {
-                        changed = true;
-                        pit.remove();
-                        if (procs.size() == 0) {
-                            mProcesses.remove(mProcesses.keyAt(i));
-                        }
-                        if (pi.mPid != 0) {
-                            mActiveProcesses.remove(pi.mPid);
-                        }
-                        continue;
-                    }
-                    Iterator<ServiceItem> sit = pi.mServices.values().iterator();
-                    while (sit.hasNext()) {
-                        ServiceItem si = sit.next();
-                        if (si.mCurSeq != mSequence) {
-                            changed = true;
-                            sit.remove();
-                        }
-                    }
-                }
-            }
-            
-            if (changed) {
-                // First determine an order for the services.
-                ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>();
-                for (int i=0; i<mProcesses.size(); i++) {
-                    for (ProcessItem pi : mProcesses.valueAt(i).values()) {
-                        pi.mIsSystem = false;
-                        pi.mIsStarted = true;
-                        pi.mActiveSince = Long.MAX_VALUE;
-                        for (ServiceItem si : pi.mServices.values()) {
-                            if (si.mServiceInfo != null
-                                    && (si.mServiceInfo.applicationInfo.flags
-                                            & ApplicationInfo.FLAG_SYSTEM) != 0) {
-                                pi.mIsSystem = true;
-                            }
-                            if (si.mRunningService != null
-                                    && si.mRunningService.clientLabel != 0) {
-                                pi.mIsStarted = false;
-                                if (pi.mActiveSince > si.mRunningService.activeSince) {
-                                    pi.mActiveSince = si.mRunningService.activeSince;
-                                }
-                            }
-                        }
-                        sortedProcesses.add(pi);
-                    }
-                }
-                
-                Collections.sort(sortedProcesses, mServiceProcessComparator);
-                
-                ArrayList<BaseItem> newItems = new ArrayList<BaseItem>();
-                mProcessItems.clear();
-                for (int i=0; i<sortedProcesses.size(); i++) {
-                    ProcessItem pi = sortedProcesses.get(i);
-                    pi.mNeedDivider = false;
-                    // First add processes we are dependent on.
-                    pi.addDependentProcesses(newItems, mProcessItems);
-                    // And add the process itself.
-                    newItems.add(pi);
-                    if (pi.mPid > 0) {
-                        mProcessItems.add(pi);
-                    }
-                    // And finally the services running in it.
-                    boolean needDivider = false;
-                    for (ServiceItem si : pi.mServices.values()) {
-                        si.mNeedDivider = needDivider;
-                        needDivider = true;
-                        newItems.add(si);
-                    }
-                }
-                synchronized (mLock) {
-                    mItems = newItems;
-                }
-            }
-            
-            // Count number of interesting other (non-active) processes, and
-            // build a list of all processes we will retrieve memory for.
-            mAllProcessItems.clear();
-            mAllProcessItems.addAll(mProcessItems);
-            int numBackgroundProcesses = 0;
-            int numForegroundProcesses = 0;
-            int numServiceProcesses = 0;
-            NRP = mRunningProcesses.size();
-            for (int i=0; i<NRP; i++) {
-                ProcessItem proc = mRunningProcesses.valueAt(i);
-                if (proc.mCurSeq != mSequence) {
-                    // We didn't hit this process as a dependency on one
-                    // of our active ones, so add it up if needed.
-                    if (proc.mRunningProcessInfo.importance >=
-                            ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
-                        numBackgroundProcesses++;
-                        mAllProcessItems.add(proc);
-                    } else if (proc.mRunningProcessInfo.importance <=
-                            ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
-                        numForegroundProcesses++;
-                        mAllProcessItems.add(proc);
-                    } else {
-                        Log.i(TAG, "Unknown non-service process: "
-                                + proc.mProcessName + " #" + proc.mPid);
-                    }
-                } else {
-                    numServiceProcesses++;
-                }
-            }
-            
-            long backgroundProcessMemory = 0;
-            long foregroundProcessMemory = 0;
-            long serviceProcessMemory = 0;
-            try {
-                final int numProc = mAllProcessItems.size();
-                int[] pids = new int[numProc];
-                for (int i=0; i<numProc; i++) {
-                    pids[i] = mAllProcessItems.get(i).mPid;
-                }
-                Debug.MemoryInfo[] mem = ActivityManagerNative.getDefault()
-                        .getProcessMemoryInfo(pids);
-                for (int i=pids.length-1; i>=0; i--) {
-                    ProcessItem proc = mAllProcessItems.get(i);
-                    changed |= proc.updateSize(context, mem[i], mSequence);
-                    if (proc.mCurSeq == mSequence) {
-                        serviceProcessMemory += proc.mSize;
-                    } else if (proc.mRunningProcessInfo.importance >=
-                            ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
-                        backgroundProcessMemory += proc.mSize;
-                    } else if (proc.mRunningProcessInfo.importance <=
-                            ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
-                        foregroundProcessMemory += proc.mSize;
-                    }
-                }
-            } catch (RemoteException e) {
-            }
-            
-            synchronized (mLock) {
-                mNumBackgroundProcesses = numBackgroundProcesses;
-                mNumForegroundProcesses = numForegroundProcesses;
-                mNumServiceProcesses = numServiceProcesses;
-                mBackgroundProcessMemory = backgroundProcessMemory;
-                mForegroundProcessMemory = foregroundProcessMemory;
-                mServiceProcessMemory = serviceProcessMemory;
-            }
-            
-            return changed;
-        }
-        
-        ArrayList<BaseItem> getCurrentItems() {
-            synchronized (mLock) {
-                return mItems;
-            }
-        }
-    }
-    
-    static class TimeTicker extends TextView {
-        public TimeTicker(Context context, AttributeSet attrs) {
-            super(context, attrs);
-        }
-    }
-    
-    static class ViewHolder {
-        ImageView separator;
-        ImageView icon;
-        TextView name;
-        TextView description;
-        TextView size;
-    }
-    
-    class ServiceListAdapter extends BaseAdapter {
-        final State mState;
-        final LayoutInflater mInflater;
-        ArrayList<BaseItem> mItems;
-        
-        ServiceListAdapter(State state) {
-            mState = state;
-            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            refreshItems();
-        }
-
-        void refreshItems() {
-            ArrayList<BaseItem> newItems = mState.getCurrentItems();
-            if (mItems != newItems) {
-                mItems = newItems;
-            }
-            if (mItems == null) {
-                mItems = new ArrayList<BaseItem>();
-            }
-        }
-        
-        public boolean hasStableIds() {
-            return true;
-        }
-        
-        public int getCount() {
-            return mItems.size();
-        }
-
-        public Object getItem(int position) {
-            return mItems.get(position);
-        }
-
-        public long getItemId(int position) {
-            return mItems.get(position).hashCode();
-        }
-
-        public boolean areAllItemsEnabled() {
-            return false;
-        }
-
-        public boolean isEnabled(int position) {
-            return !mItems.get(position).mIsProcess;
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            View v;
-            if (convertView == null) {
-                v = newView(parent);
-            } else {
-                v = convertView;
-            }
-            bindView(v, position);
-            return v;
-        }
-        
-        public View newView(ViewGroup parent) {
-            View v = mInflater.inflate(R.layout.running_services_item, parent, false);
-            ViewHolder h = new ViewHolder();
-            h.separator = (ImageView)v.findViewById(R.id.separator);
-            h.icon = (ImageView)v.findViewById(R.id.icon);
-            h.name = (TextView)v.findViewById(R.id.name);
-            h.description = (TextView)v.findViewById(R.id.description);
-            h.size = (TextView)v.findViewById(R.id.size);
-            v.setTag(h);
-            return v;
-        }
-        
-        public void bindView(View view, int position) {
-            synchronized (mState.mLock) {
-                ViewHolder vh = (ViewHolder) view.getTag();
-                if (position >= mItems.size()) {
-                    // List must have changed since we last reported its
-                    // size...  ignore here, we will be doing a data changed
-                    // to refresh the entire list.
-                    return;
-                }
-                BaseItem item = mItems.get(position);
-                vh.name.setText(item.mDisplayLabel);
-                vh.separator.setVisibility(item.mNeedDivider
-                        ? View.VISIBLE : View.INVISIBLE);
-                ActiveItem ai = new ActiveItem();
-                ai.mRootView = view;
-                ai.mItem = item;
-                ai.mHolder = vh;
-                ai.mFirstRunTime = item.mActiveSince;
-                vh.description.setText(item.mDescription);
-                if (item.mIsProcess) {
-                    view.setBackgroundColor(mProcessBgColor);
-                    vh.icon.setImageDrawable(null);
-                    vh.icon.setVisibility(View.GONE);
-                    vh.description.setText(item.mDescription);
-                    item.mCurSizeStr = null;
-                } else {
-                    view.setBackgroundDrawable(null);
-                    vh.icon.setImageDrawable(item.mPackageInfo.loadIcon(getPackageManager()));
-                    vh.icon.setVisibility(View.VISIBLE);
-                    vh.description.setText(item.mDescription);
-                    ai.mFirstRunTime = item.mActiveSince;
-                }
-                ai.updateTime(RunningServices.this);
-                mActiveItems.put(view, ai);
-            }
-        }
-    }
-    
-    public static class LinearColorBar extends LinearLayout {
-        private float mRedRatio;
-        private float mYellowRatio;
-        private float mGreenRatio;
-        
-        final Rect mRect = new Rect();
-        final Paint mPaint = new Paint();
-        
-        public LinearColorBar(Context context, AttributeSet attrs) {
-            super(context, attrs);
-            setWillNotDraw(false);
-            mPaint.setStyle(Paint.Style.FILL);
-        }
-
-        public void setRatios(float red, float yellow, float green) {
-            mRedRatio = red;
-            mYellowRatio = yellow;
-            mGreenRatio = green;
-            invalidate();
-        }
-        
-        @Override
-        protected void onDraw(Canvas canvas) {
-            super.onDraw(canvas);
-            
-            int width = getWidth();
-            mRect.top = 0;
-            mRect.bottom = getHeight();
-            
-            int left = 0;
-            
-            int right = left + (int)(width*mRedRatio);
-            if (left < right) {
-                mRect.left = left;
-                mRect.right = right;
-                mPaint.setColor(0xffff8080);
-                canvas.drawRect(mRect, mPaint);
-                width -= (right-left);
-                left = right;
-            }
-            
-            right = left + (int)(width*mYellowRatio);
-            if (left < right) {
-                mRect.left = left;
-                mRect.right = right;
-                mPaint.setColor(0xffffff00);
-                canvas.drawRect(mRect, mPaint);
-                width -= (right-left);
-                left = right;
-            }
-            
-            right = left + width;
-            if (left < right) {
-                mRect.left = left;
-                mRect.right = right;
-                mPaint.setColor(0xff80ff80);
-                canvas.drawRect(mRect, mPaint);
-            }
-        }
-    }
-    
-    HandlerThread mBackgroundThread;
-    final class BackgroundHandler extends Handler {
-        public BackgroundHandler(Looper looper) {
-            super(looper);
-        }
-        
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_UPDATE_CONTENTS:
-                    Message cmd = mHandler.obtainMessage(MSG_REFRESH_UI);
-                    cmd.arg1 = mState.update(RunningServices.this, mAm) ? 1 : 0;
-                    mHandler.sendMessage(cmd);
-                    removeMessages(MSG_UPDATE_CONTENTS);
-                    msg = obtainMessage(MSG_UPDATE_CONTENTS);
-                    sendMessageDelayed(msg, CONTENTS_UPDATE_DELAY);
-                    break;
-            }
-        }
-    };
-    BackgroundHandler mBackgroundHandler;
-    
-    final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_UPDATE_TIMES:
-                    Iterator<ActiveItem> it = mActiveItems.values().iterator();
-                    while (it.hasNext()) {
-                        ActiveItem ai = it.next();
-                        if (ai.mRootView.getWindowToken() == null) {
-                            // Clean out any dead views, just in case.
-                            it.remove();
-                            continue;
-                        }
-                        ai.updateTime(RunningServices.this);
-                    }
-                    removeMessages(MSG_UPDATE_TIMES);
-                    msg = obtainMessage(MSG_UPDATE_TIMES);
-                    sendMessageDelayed(msg, TIME_UPDATE_DELAY);
-                    break;
-                case MSG_REFRESH_UI:
-                    refreshUi(msg.arg1 != 0);
-                    break;
-            }
-        }
-    };
-    
-    private boolean matchText(byte[] buffer, int index, String text) {
-        int N = text.length();
-        if ((index+N) >= buffer.length) {
-            return false;
-        }
-        for (int i=0; i<N; i++) {
-            if (buffer[index+i] != text.charAt(i)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    
-    private long extractMemValue(byte[] buffer, int index) {
-        while (index < buffer.length && buffer[index] != '\n') {
-            if (buffer[index] >= '0' && buffer[index] <= '9') {
-                int start = index;
-                index++;
-                while (index < buffer.length && buffer[index] >= '0'
-                    && buffer[index] <= '9') {
-                    index++;
-                }
-                String str = new String(buffer, start, index-start);
-                return ((long)Integer.parseInt(str)) * 1024;
-            }
-            index++;
-        }
-        return 0;
-    }
-    
-    private long readAvailMem() {
-        try {
-            long memFree = 0;
-            long memCached = 0;
-            FileInputStream is = new FileInputStream("/proc/meminfo");
-            int len = is.read(mBuffer);
-            is.close();
-            final int BUFLEN = mBuffer.length;
-            for (int i=0; i<len && (memFree == 0 || memCached == 0); i++) {
-                if (matchText(mBuffer, i, "MemFree")) {
-                    i += 7;
-                    memFree = extractMemValue(mBuffer, i);
-                } else if (matchText(mBuffer, i, "Cached")) {
-                    i += 6;
-                    memCached = extractMemValue(mBuffer, i);
-                }
-                while (i < BUFLEN && mBuffer[i] != '\n') {
-                    i++;
-                }
-            }
-            return memFree + memCached;
-        } catch (java.io.FileNotFoundException e) {
-        } catch (java.io.IOException e) {
-        }
-        return 0;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
-        mState = (State)getLastNonConfigurationInstance();
-        if (mState == null) {
-            mState = new State();
-        }
-        mProcessBgColor = 0xff505050;
-        setContentView(R.layout.running_services);
-        getListView().setDivider(null);
-        getListView().setAdapter(new ServiceListAdapter(mState));
-        mColorBar = (LinearColorBar)findViewById(R.id.color_bar);
-        mBackgroundProcessText = (TextView)findViewById(R.id.backgroundText);
-        mForegroundProcessText = (TextView)findViewById(R.id.foregroundText);
-        
-        // Magic!  Implementation detail!  Don't count on this!
-        SECONDARY_SERVER_MEM =
-            Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_MEM"))*PAGE_SIZE;
-    }
-
-    void refreshUi(boolean dataChanged) {
-        if (dataChanged) {
-            ServiceListAdapter adapter = (ServiceListAdapter)(getListView().getAdapter());
-            adapter.refreshItems();
-            adapter.notifyDataSetChanged();
-        }
-        
-        // This is the amount of available memory until we start killing
-        // background services.
-        long availMem = readAvailMem() - SECONDARY_SERVER_MEM;
-        if (availMem < 0) {
-            availMem = 0;
-        }
-        
-        synchronized (mState.mLock) {
-            if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
-                    || mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
-                    || mLastAvailMemory != availMem) {
-                mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
-                mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
-                mLastAvailMemory = availMem;
-                String availStr = availMem != 0
-                        ? Formatter.formatShortFileSize(this, availMem) : "0";
-                String sizeStr = Formatter.formatShortFileSize(this, mLastBackgroundProcessMemory);
-                mBackgroundProcessText.setText(getResources().getString(
-                        R.string.service_background_processes,
-                        mLastNumBackgroundProcesses, availStr, sizeStr));
-            }
-            if (mLastNumForegroundProcesses != mState.mNumForegroundProcesses
-                    || mLastForegroundProcessMemory != mState.mForegroundProcessMemory) {
-                mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
-                mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
-                String sizeStr = Formatter.formatShortFileSize(this, mLastForegroundProcessMemory);
-                mForegroundProcessText.setText(getResources().getString(
-                        R.string.service_foreground_processes, mLastNumForegroundProcesses, sizeStr));
-            }
-            mLastNumServiceProcesses = mState.mNumServiceProcesses;
-            mLastServiceProcessMemory = mState.mServiceProcessMemory;
-            
-            float totalMem = availMem + mLastBackgroundProcessMemory
-                    + mLastForegroundProcessMemory + mLastServiceProcessMemory;
-            mColorBar.setRatios(mLastForegroundProcessMemory/totalMem,
-                    mLastServiceProcessMemory/totalMem,
-                    (availMem+mLastBackgroundProcessMemory)/totalMem);
-        }
-    }
-    
-    @Override
-    protected void onListItemClick(ListView l, View v, int position, long id) {
-        BaseItem bi = (BaseItem)l.getAdapter().getItem(position);
-        if (!bi.mIsProcess) {
-            ServiceItem si = (ServiceItem)bi;
-            if (si.mRunningService.clientLabel != 0) {
-                mCurSelected = null;
-                PendingIntent pi = mAm.getRunningServiceControlPanel(
-                        si.mRunningService.service);
-                if (pi != null) {
-                    try {
-                        this.startIntentSender(pi.getIntentSender(), null,
-                                Intent.FLAG_ACTIVITY_NEW_TASK
-                                        | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
-                                Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
-                    } catch (IntentSender.SendIntentException e) {
-                        Log.w(TAG, e);
-                    } catch (IllegalArgumentException e) {
-                        Log.w(TAG, e);
-                    } catch (ActivityNotFoundException e) {
-                        Log.w(TAG, e);
-                    }
-                }
-            } else {
-                mCurSelected = bi;
-                AlertDialog.Builder builder = new AlertDialog.Builder(this);
-                builder.setTitle(R.string.confirm_stop_service);
-                String msg = getResources().getString(
-                        R.string.confirm_stop_service_msg,
-                        si.mPackageInfo.loadLabel(getPackageManager()));
-                builder.setMessage(msg);
-                builder.setPositiveButton(R.string.confirm_stop_stop, this);
-                builder.setNegativeButton(R.string.confirm_stop_cancel, null);
-                builder.setCancelable(true);
-                mCurDialog = builder.show();
-            }
-        } else {
-            mCurSelected = null;
-        }
-    }
-
-    public void onClick(DialogInterface dialog, int which) {
-        if (mCurSelected != null) {
-            stopService(new Intent().setComponent(
-                    ((ServiceItem)mCurSelected).mRunningService.service));
-            if (mBackgroundHandler != null) {
-                mBackgroundHandler.sendEmptyMessage(MSG_UPDATE_CONTENTS);
-            }
-        }
-    }
-
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mHandler.removeMessages(MSG_UPDATE_TIMES);
-        if (mBackgroundThread != null) {
-            mBackgroundThread.quit();
-            mBackgroundThread = null;
-            mBackgroundHandler = null;
-        }
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        refreshUi(mState.update(this, mAm));
-        mBackgroundThread = new HandlerThread("RunningServices");
-        mBackgroundThread.start();
-        mBackgroundHandler = new BackgroundHandler(mBackgroundThread.getLooper());
-        mHandler.removeMessages(MSG_UPDATE_TIMES);
-        Message msg = mHandler.obtainMessage(MSG_UPDATE_TIMES);
-        mHandler.sendMessageDelayed(msg, TIME_UPDATE_DELAY);
-        mBackgroundHandler.removeMessages(MSG_UPDATE_CONTENTS);
-        msg = mBackgroundHandler.obtainMessage(MSG_UPDATE_CONTENTS);
-        mBackgroundHandler.sendMessageDelayed(msg, CONTENTS_UPDATE_DELAY);
-    }
-
-    @Override
-    public Object onRetainNonConfigurationInstance() {
-        return mState;
-    }
-
-    public void onMovedToScrapHeap(View view) {
-        mActiveItems.remove(view);
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (mCurDialog != null) {
-            mCurDialog.dismiss();
-        }
-    }
-}
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index b29db2d..454ea60 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -31,6 +31,7 @@
 import android.database.Cursor;
 import android.location.LocationManager;
 import android.os.Bundle;
+import android.os.SystemProperties;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
@@ -61,6 +62,10 @@
     private static final String KEY_VISIBLE_PATTERN = "visiblepattern";
     private static final String KEY_TACTILE_FEEDBACK_ENABLED = "unlock_tactile_feedback";
 
+    // Encrypted File Systems constants
+    private static final String PROPERTY_EFS_ENABLED = "persist.security.efs.enabled";
+    private static final String PROPERTY_EFS_TRANSITION = "persist.security.efs.trans";
+
     private CheckBoxPreference mVisiblePattern;
     private CheckBoxPreference mTactileFeedback;
 
@@ -75,6 +80,9 @@
     // Credential storage
     private CredentialStorage mCredentialStorage = new CredentialStorage();
 
+    // Encrypted file system
+    private  CheckBoxPreference mEncryptedFSEnabled;
+
     private CheckBoxPreference mNetwork;
     private CheckBoxPreference mGps;
     private CheckBoxPreference mAssistedGps;
@@ -204,6 +212,11 @@
         root.addPreference(credentialsCat);
         mCredentialStorage.createPreferences(credentialsCat, CredentialStorage.TYPE_KEYSTORE);
 
+        // File System Encryption
+        PreferenceCategory encryptedfsCat = new PreferenceCategory(this);
+        encryptedfsCat.setTitle(R.string.encrypted_fs_category);
+        //root.addPreference(encryptedfsCat);
+        mCredentialStorage.createPreferences(encryptedfsCat, CredentialStorage.TYPE_ENCRYPTEDFS);
         return root;
     }
 
@@ -297,18 +310,21 @@
         private static final int MINIMUM_PASSWORD_LENGTH = 8;
 
         private static final int TYPE_KEYSTORE = 0;
+        private static final int TYPE_ENCRYPTEDFS = 1;
 
         // Dialog identifiers
         private static final int DLG_BASE = 0;
         private static final int DLG_UNLOCK = DLG_BASE + 1;
         private static final int DLG_PASSWORD = DLG_UNLOCK + 1;
         private static final int DLG_RESET = DLG_PASSWORD + 1;
+        private static final int DLG_ENABLE_EFS = DLG_RESET + 1;
 
         private KeyStore mKeyStore = KeyStore.getInstance();
         private int mState;
         private boolean mSubmit = false;
         private boolean mExternal = false;
 
+        private boolean mWillEnableEncryptedFS;
         private int mShowingDialog = 0;
 
         // Key Store controls
@@ -317,6 +333,10 @@
         private Preference mPasswordButton;
         private Preference mResetButton;
 
+
+        // Encrypted file system controls
+        private  CheckBoxPreference mEncryptedFSEnabled;
+
         void resume() {
             mState = mKeyStore.test();
             updatePreferences(mState);
@@ -368,6 +388,10 @@
                     lock();
                 }
                 return true;
+            } else if (preference == mEncryptedFSEnabled) {
+                Boolean bval = (Boolean)value;
+                mWillEnableEncryptedFS = bval.booleanValue();
+                showSwitchEncryptedFSDialog();
             }
             return true;
         }
@@ -386,9 +410,26 @@
         }
 
         public void onClick(DialogInterface dialog, int button) {
-            mSubmit = (button == DialogInterface.BUTTON_POSITIVE);
-            if (button == DialogInterface.BUTTON_NEUTRAL) {
-                reset();
+            if (mShowingDialog != DLG_ENABLE_EFS) {
+                mSubmit = (button == DialogInterface.BUTTON_POSITIVE);
+                if (button == DialogInterface.BUTTON_NEUTRAL) {
+                    reset();
+                }
+            } else {
+                if (button == DialogInterface.BUTTON_POSITIVE) {
+                    Intent intent = new Intent("android.intent.action.MASTER_CLEAR");
+                    intent.putExtra("enableEFS", mWillEnableEncryptedFS);
+                    sendBroadcast(intent);
+                    updatePreferences(mState);
+                } else if (button == DialogInterface.BUTTON_NEGATIVE) {
+                    // Cancel action
+                    Toast.makeText(SecuritySettings.this, R.string.encrypted_fs_cancel_confirm,
+                            Toast.LENGTH_SHORT).show();
+                    updatePreferences(mState);
+                } else {
+                    // Unknown - should not happen
+                    return;
+                }
             }
         }
 
@@ -502,16 +543,25 @@
                 category.addPreference(mResetButton);
                 break;
 
+            case TYPE_ENCRYPTEDFS:
+                mEncryptedFSEnabled = new CheckBoxPreference(SecuritySettings.this);
+                mEncryptedFSEnabled.setTitle(R.string.encrypted_fs_enable);
+                mEncryptedFSEnabled.setSummary(R.string.encrypted_fs_enable_summary);
+                mEncryptedFSEnabled.setOnPreferenceChangeListener(this);
+                // category.addPreference(mEncryptedFSEnabled);
+                break;
             }
         }
 
         private void updatePreferences(int state) {
             mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
-
-            mResetButton.setEnabled(state != KeyStore.UNINITIALIZED);
-            mAccessCheckBox.setEnabled(state != KeyStore.UNINITIALIZED);
+            boolean encFSEnabled = SystemProperties.getBoolean(PROPERTY_EFS_ENABLED,
+                    false);
+            mResetButton.setEnabled((!encFSEnabled) && (state != KeyStore.UNINITIALIZED));
+            mAccessCheckBox.setEnabled((state != KeyStore.UNINITIALIZED) && (!encFSEnabled));
 
             // Encrypted File system preferences
+            mEncryptedFSEnabled.setChecked(encFSEnabled);
 
             // Show a toast message if the state is changed.
             if (mState == state) {
@@ -581,5 +631,24 @@
                     .setNegativeButton(getString(android.R.string.cancel), this)
                     .create().show();
         }
+
+        private void showSwitchEncryptedFSDialog() {
+            AlertDialog.Builder builder = new AlertDialog.Builder(SecuritySettings.this)
+                    .setCancelable(false)
+                    .setTitle(R.string.encrypted_fs_alert_dialog_title);
+
+            mShowingDialog = DLG_ENABLE_EFS;
+            if (mWillEnableEncryptedFS) {
+                 builder.setMessage(R.string.encrypted_fs_enable_dialog)
+                         .setPositiveButton(R.string.encrypted_fs_enable_button, this)
+                         .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
+                         .create().show();
+            } else {
+                builder.setMessage(R.string.encrypted_fs_disable_dialog)
+                        .setPositiveButton(R.string.encrypted_fs_disable_button, this)
+                        .setNegativeButton(R.string.encrypted_fs_cancel_button, this)
+                        .create().show();
+            }
+        }
     }
 }
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
new file mode 100644
index 0000000..1f94d0a
--- /dev/null
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -0,0 +1,594 @@
+package com.android.settings.applications;
+
+import android.app.Application;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageStatsObserver;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageStats;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemClock;
+import android.text.format.Formatter;
+import android.util.Log;
+
+import java.text.Collator;
+import java.text.Normalizer;
+import java.text.Normalizer.Form;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Keeps track of information about all installed applications, lazy-loading
+ * as needed.
+ */
+public class ApplicationsState {
+    static final String TAG = "ApplicationsState";
+    static final boolean DEBUG = false;
+
+    public static interface Callbacks {
+        public void onRunningStateChanged(boolean running);
+        public void onPackageListChanged();
+        public void onPackageIconChanged();
+        public void onPackageSizeChanged(String packageName);
+        public void onAllSizesComputed();
+    }
+
+    public static interface AppFilter {
+        public boolean filterApp(ApplicationInfo info);
+    }
+
+    static final int SIZE_UNKNOWN = -1;
+    static final int SIZE_INVALID = -2;
+
+    static final Pattern REMOVE_DIACRITICALS_PATTERN
+            = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
+
+    public static String normalize(String str) {
+        String tmp = Normalizer.normalize(str, Form.NFD);
+        return REMOVE_DIACRITICALS_PATTERN.matcher(tmp)
+                .replaceAll("").toLowerCase();
+    }
+
+    public static class AppEntry {
+        final String label;
+        final long id;
+        long size;
+        
+        long cacheSize;
+        long codeSize;
+        long dataSize;
+
+        String getNormalizedLabel() {
+            if (normalizedLabel != null) {
+                return normalizedLabel;
+            }
+            normalizedLabel = normalize(label);
+            return normalizedLabel;
+        }
+
+        // Need to synchronize on 'this' for the following.
+        ApplicationInfo info;
+        Drawable icon;
+        String sizeStr;
+        boolean sizeStale;
+        long sizeLoadStart;
+
+        String normalizedLabel;
+
+        AppEntry(Context context, ApplicationInfo info, long id) {
+            CharSequence label = info.loadLabel(context.getPackageManager());
+            this.label = label != null ? label.toString() : info.packageName;
+            this.id = id;
+            this.info = info;
+            this.size = SIZE_UNKNOWN;
+            this.sizeStale = true;
+        }
+    }
+
+    public static final Comparator<AppEntry> ALPHA_COMPARATOR = new Comparator<AppEntry>() {
+        private final Collator sCollator = Collator.getInstance();
+        @Override
+        public int compare(AppEntry object1, AppEntry object2) {
+            return sCollator.compare(object1.label, object2.label);
+        }
+    };
+
+    public static final Comparator<AppEntry> SIZE_COMPARATOR = new Comparator<AppEntry>() {
+        private final Collator sCollator = Collator.getInstance();
+        @Override
+        public int compare(AppEntry object1, AppEntry object2) {
+            if (object1.size < object2.size) return 1;
+            if (object1.size > object2.size) return -1;
+            return sCollator.compare(object1.label, object2.label);
+        }
+    };
+
+    public static final AppFilter THIRD_PARTY_FILTER = new AppFilter() {
+        @Override
+        public boolean filterApp(ApplicationInfo info) {
+            if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+                return true;
+            } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    public static final AppFilter ON_SD_CARD_FILTER = new AppFilter() {
+        @Override
+        public boolean filterApp(ApplicationInfo info) {
+            if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
+                return true;
+            }
+            return false;
+        }
+    };
+
+    final Context mContext;
+    final PackageManager mPm;
+    PackageIntentReceiver mPackageIntentReceiver;
+
+    boolean mResumed;
+    Callbacks mCurCallbacks;
+
+    // Information about all applications.  Synchronize on mAppEntries
+    // to protect access to these.
+    final HashMap<String, AppEntry> mEntriesMap = new HashMap<String, AppEntry>();
+    final ArrayList<AppEntry> mAppEntries = new ArrayList<AppEntry>();
+    List<ApplicationInfo> mApplications = new ArrayList<ApplicationInfo>();
+    long mCurId = 1;
+    String mCurComputingSizePkg;
+
+    /**
+     * Receives notifications when applications are added/removed.
+     */
+    private class PackageIntentReceiver extends BroadcastReceiver {
+         void registerReceiver() {
+             IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
+             filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+             filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+             filter.addDataScheme("package");
+             mContext.registerReceiver(this, filter);
+             // Register for events related to sdcard installation.
+             IntentFilter sdFilter = new IntentFilter();
+             sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
+             sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
+             mContext.registerReceiver(this, sdFilter);
+         }
+         @Override
+         public void onReceive(Context context, Intent intent) {
+             String actionStr = intent.getAction();
+             if (Intent.ACTION_PACKAGE_ADDED.equals(actionStr)) {
+                 Uri data = intent.getData();
+                 String pkgName = data.getEncodedSchemeSpecificPart();
+                 addPackage(pkgName);
+             } else if (Intent.ACTION_PACKAGE_REMOVED.equals(actionStr)) {
+                 Uri data = intent.getData();
+                 String pkgName = data.getEncodedSchemeSpecificPart();
+                 removePackage(pkgName);
+             } else if (Intent.ACTION_PACKAGE_CHANGED.equals(actionStr)) {
+                 Uri data = intent.getData();
+                 String pkgName = data.getEncodedSchemeSpecificPart();
+                 removePackage(pkgName);
+                 addPackage(pkgName);
+             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr) ||
+                     Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(actionStr)) {
+                 // When applications become available or unavailable (perhaps because
+                 // the SD card was inserted or ejected) we need to refresh the
+                 // AppInfo with new label, icon and size information as appropriate
+                 // given the newfound (un)availability of the application.
+                 // A simple way to do that is to treat the refresh as a package
+                 // removal followed by a package addition.
+                 String pkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+                 if (pkgList == null || pkgList.length == 0) {
+                     // Ignore
+                     return;
+                 }
+                 boolean avail = Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr);
+                 for (String pkgName : pkgList) {
+                     if (avail) addPackage(pkgName);
+                     else removePackage(pkgName);
+                 }
+             }
+         }
+    }
+
+    class MainHandler extends Handler {
+        static final int MSG_PACKAGE_LIST_CHANGED = 1;
+        static final int MSG_PACKAGE_ICON_CHANGED = 2;
+        static final int MSG_PACKAGE_SIZE_CHANGED = 4;
+        static final int MSG_ALL_SIZES_COMPUTED = 5;
+        static final int MSG_RUNNING_STATE_CHANGED = 6;
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_PACKAGE_LIST_CHANGED: {
+                    if (mCurCallbacks != null) {
+                        mCurCallbacks.onPackageListChanged();
+                    }
+                } break;
+                case MSG_PACKAGE_ICON_CHANGED: {
+                    if (mCurCallbacks != null) {
+                        mCurCallbacks.onPackageIconChanged();
+                    }
+                } break;
+                case MSG_PACKAGE_SIZE_CHANGED: {
+                    if (mCurCallbacks != null) {
+                        mCurCallbacks.onPackageSizeChanged((String)msg.obj);
+                    }
+                } break;
+                case MSG_ALL_SIZES_COMPUTED: {
+                    if (mCurCallbacks != null) {
+                        mCurCallbacks.onAllSizesComputed();
+                    }
+                } break;
+                case MSG_RUNNING_STATE_CHANGED: {
+                    if (mCurCallbacks != null) {
+                        mCurCallbacks.onRunningStateChanged(msg.arg1 != 0);
+                    }
+                } break;
+            }
+        }
+    }
+
+    final MainHandler mMainHandler = new MainHandler();
+
+    // --------------------------------------------------------------
+
+    static final Object sLock = new Object();
+    static ApplicationsState sInstance;
+
+    static ApplicationsState getInstance(Application app) {
+        synchronized (sLock) {
+            if (sInstance == null) {
+                sInstance = new ApplicationsState(app);
+            }
+            return sInstance;
+        }
+    }
+
+    private ApplicationsState(Application app) {
+        mContext = app;
+        mPm = mContext.getPackageManager();
+        mThread = new HandlerThread("ApplicationsState.Loader",
+                Process.THREAD_PRIORITY_BACKGROUND);
+        mThread.start();
+        mBackgroundHandler = new BackgroundHandler(mThread.getLooper());
+    }
+
+    void resume(Callbacks callbacks) {
+        synchronized (mEntriesMap) {
+            mCurCallbacks = callbacks;
+            mResumed = true;
+            if (mPackageIntentReceiver == null) {
+                mPackageIntentReceiver = new PackageIntentReceiver();
+                mPackageIntentReceiver.registerReceiver();
+            }
+            mApplications = mPm.getInstalledApplications(
+                    PackageManager.GET_UNINSTALLED_PACKAGES |
+                    PackageManager.GET_DISABLED_COMPONENTS);
+            if (mApplications == null) {
+                mApplications = new ArrayList<ApplicationInfo>();
+            }
+            for (int i=0; i<mAppEntries.size(); i++) {
+                mAppEntries.get(i).sizeStale = true;
+            }
+            mCurComputingSizePkg = null;
+            if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) {
+                mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES);
+            }
+        }
+    }
+
+    void pause() {
+        synchronized (mEntriesMap) {
+            mCurCallbacks = null;
+            mResumed = false;
+        }
+    }
+
+    // Creates a new list of app entries with the given filter and comparator.
+    ArrayList<AppEntry> rebuild(AppFilter filter, Comparator<AppEntry> comparator) {
+        ArrayList<AppEntry> filteredApps = new ArrayList<AppEntry>();
+        synchronized (mEntriesMap) {
+            if (DEBUG) Log.i(TAG, "Rebuilding...");
+            for (int i=0; i<mApplications.size(); i++) {
+                ApplicationInfo info = mApplications.get(i);
+                if (filter == null || filter.filterApp(info)) {
+                    AppEntry entry = getEntryLocked(info);
+                    if (DEBUG) Log.i(TAG, "Using " + info.packageName + ": " + entry);
+                    filteredApps.add(entry);
+                }
+            }
+        }
+        Collections.sort(filteredApps, comparator);
+        return filteredApps;
+    }
+
+    AppEntry getEntry(String packageName) {
+        synchronized (mEntriesMap) {
+            AppEntry entry = mEntriesMap.get(packageName);
+            if (entry == null) {
+                for (int i=0; i<mApplications.size(); i++) {
+                    ApplicationInfo info = mApplications.get(i);
+                    if (packageName.equals(info.packageName)) {
+                        entry = getEntryLocked(info);
+                        break;
+                    }
+                }
+            }
+            return entry;
+        }
+    }
+    
+    void ensureIcon(AppEntry entry) {
+        if (entry.icon != null) {
+            return;
+        }
+        synchronized (entry) {
+            if (entry.icon == null) {
+                entry.icon = entry.info.loadIcon(mPm);
+            }
+        }
+    }
+
+    void requestSize(String packageName) {
+        synchronized (mEntriesMap) {
+            AppEntry entry = mEntriesMap.get(packageName);
+            if (entry != null) {
+                mPm.getPackageSizeInfo(packageName, mBackgroundHandler.mStatsObserver);
+            }
+        }
+    }
+
+    int indexOfApplicationInfoLocked(String pkgName) {
+        for (int i=mApplications.size()-1; i>=0; i--) {
+            if (mApplications.get(i).packageName.equals(pkgName)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    void addPackage(String pkgName) {
+        try {
+            synchronized (mEntriesMap) {
+                if (DEBUG) Log.i(TAG, "Adding package " + pkgName);
+                if (!mResumed) {
+                    // If we are not resumed, we will do a full query the
+                    // next time we resume, so there is no reason to do work
+                    // here.
+                    return;
+                }
+                if (indexOfApplicationInfoLocked(pkgName) >= 0) {
+                    if (DEBUG) Log.i(TAG, "Package already exists!");
+                    return;
+                }
+                ApplicationInfo info = mPm.getApplicationInfo(pkgName,
+                        PackageManager.GET_UNINSTALLED_PACKAGES |
+                        PackageManager.GET_DISABLED_COMPONENTS);
+                mApplications.add(info);
+                if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) {
+                    mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES);
+                }
+                if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+                    mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED);
+                }
+            }
+        } catch (NameNotFoundException e) {
+        }
+    }
+
+    void removePackage(String pkgName) {
+        synchronized (mEntriesMap) {
+            int idx = indexOfApplicationInfoLocked(pkgName);
+            if (DEBUG) Log.i(TAG, "removePackage: " + pkgName + " @ " + idx);
+            if (idx >= 0) {
+                AppEntry entry = mEntriesMap.get(pkgName);
+                if (DEBUG) Log.i(TAG, "removePackage: " + entry);
+                if (entry != null) {
+                    mEntriesMap.remove(pkgName);
+                    mAppEntries.remove(entry);
+                }
+                mApplications.remove(idx);
+                if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_LIST_CHANGED)) {
+                    mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_LIST_CHANGED);
+                }
+            }
+        }
+    }
+
+    AppEntry getEntryLocked(ApplicationInfo info) {
+        AppEntry entry = mEntriesMap.get(info.packageName);
+        if (DEBUG) Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry);
+        if (entry == null) {
+            if (DEBUG) Log.i(TAG, "Creating AppEntry for " + info.packageName);
+            entry = new AppEntry(mContext, info, mCurId++);
+            mEntriesMap.put(info.packageName, entry);
+            mAppEntries.add(entry);
+        } else if (entry.info != info) {
+            entry.info = info;
+        }
+        return entry;
+    }
+
+    // --------------------------------------------------------------
+
+    private long getTotalSize(PackageStats ps) {
+        if (ps != null) {
+            return ps.cacheSize+ps.codeSize+ps.dataSize;
+        }
+        return SIZE_INVALID;
+    }
+
+    private String getSizeStr(long size) {
+        if (size >= 0) {
+            return Formatter.formatFileSize(mContext, size);
+        }
+        return null;
+    }
+
+    final HandlerThread mThread;
+    final BackgroundHandler mBackgroundHandler;
+    class BackgroundHandler extends Handler {
+        static final int MSG_LOAD_ENTRIES = 1;
+        static final int MSG_LOAD_ICONS = 2;
+        static final int MSG_LOAD_SIZES = 3;
+
+        boolean mRunning;
+
+        final IPackageStatsObserver.Stub mStatsObserver = new IPackageStatsObserver.Stub() {
+            public void onGetStatsCompleted(PackageStats stats, boolean succeeded) {
+                boolean sizeChanged = false;
+                synchronized (mEntriesMap) {
+                    AppEntry entry = mEntriesMap.get(stats.packageName);
+                    if (entry != null) {
+                        synchronized (entry) {
+                            entry.sizeStale = false;
+                            entry.sizeLoadStart = 0;
+                            long newSize = getTotalSize(stats);
+                            if (entry.size != newSize ||
+                                    entry.cacheSize != stats.cacheSize ||
+                                    entry.codeSize != stats.codeSize ||
+                                    entry.dataSize != stats.dataSize) {
+                                entry.size = newSize;
+                                entry.cacheSize = stats.cacheSize;
+                                entry.codeSize = stats.codeSize;
+                                entry.dataSize = stats.dataSize;
+                                entry.sizeStr = getSizeStr(entry.size);
+                                if (DEBUG) Log.i(TAG, "Set size of " + entry.label + " " + entry
+                                        + ": " + entry.sizeStr);
+                                sizeChanged = true;
+                            }
+                        }
+                        if (sizeChanged) {
+                            Message msg = mMainHandler.obtainMessage(
+                                    MainHandler.MSG_PACKAGE_SIZE_CHANGED, stats.packageName);
+                            mMainHandler.sendMessage(msg);
+                        }
+                    }
+                    if (mCurComputingSizePkg == null
+                            || mCurComputingSizePkg.equals(stats.packageName)) {
+                        mCurComputingSizePkg = null;
+                        sendEmptyMessage(MSG_LOAD_SIZES);
+                    }
+                }
+            }
+        };
+
+        BackgroundHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_LOAD_ENTRIES: {
+                    int numDone = 0;
+                    synchronized (mEntriesMap) {
+                        for (int i=0; i<mApplications.size() && numDone<6; i++) {
+                            if (!mRunning) {
+                                mRunning = true;
+                                Message m = mMainHandler.obtainMessage(
+                                        MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+                                mMainHandler.sendMessage(m);
+                            }
+                            ApplicationInfo info = mApplications.get(i);
+                            if (mEntriesMap.get(info.packageName) == null) {
+                                numDone++;
+                                getEntryLocked(info);
+                            }
+                        }
+                    }
+
+                    if (numDone >= 6) {
+                        sendEmptyMessage(MSG_LOAD_ENTRIES);
+                    } else {
+                        sendEmptyMessage(MSG_LOAD_ICONS);
+                    }
+                } break;
+                case MSG_LOAD_ICONS: {
+                    int numDone = 0;
+                    synchronized (mEntriesMap) {
+                        for (int i=0; i<mAppEntries.size() && numDone<2; i++) {
+                            AppEntry entry = mAppEntries.get(i);
+                            if (entry.icon == null) {
+                                if (!mRunning) {
+                                    mRunning = true;
+                                    Message m = mMainHandler.obtainMessage(
+                                            MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+                                    mMainHandler.sendMessage(m);
+                                }
+                                numDone++;
+                                synchronized (entry) {
+                                    entry.icon = entry.info.loadIcon(mPm);
+                                }
+                            }
+                        }
+                    }
+                    if (numDone > 0) {
+                        if (!mMainHandler.hasMessages(MainHandler.MSG_PACKAGE_ICON_CHANGED)) {
+                            mMainHandler.sendEmptyMessage(MainHandler.MSG_PACKAGE_ICON_CHANGED);
+                        }
+                    }
+                    if (numDone >= 2) {
+                        sendEmptyMessage(MSG_LOAD_ICONS);
+                    } else {
+                        sendEmptyMessage(MSG_LOAD_SIZES);
+                    }
+                } break;
+                case MSG_LOAD_SIZES: {
+                    synchronized (mEntriesMap) {
+                        if (mCurComputingSizePkg != null) {
+                            return;
+                        }
+
+                        long now = SystemClock.uptimeMillis();
+                        for (int i=0; i<mAppEntries.size(); i++) {
+                            AppEntry entry = mAppEntries.get(i);
+                            if (entry.size == SIZE_UNKNOWN || entry.sizeStale) {
+                                if (entry.sizeLoadStart == 0 ||
+                                        (entry.sizeLoadStart < (now-20*1000))) {
+                                    if (!mRunning) {
+                                        mRunning = true;
+                                        Message m = mMainHandler.obtainMessage(
+                                                MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+                                        mMainHandler.sendMessage(m);
+                                    }
+                                    entry.sizeLoadStart = now;
+                                    mCurComputingSizePkg = entry.info.packageName;
+                                    mPm.getPackageSizeInfo(mCurComputingSizePkg, mStatsObserver);
+                                }
+                                return;
+                            }
+                        }
+                        if (!mMainHandler.hasMessages(MainHandler.MSG_ALL_SIZES_COMPUTED)) {
+                            mMainHandler.sendEmptyMessage(MainHandler.MSG_ALL_SIZES_COMPUTED);
+                            mRunning = false;
+                            Message m = mMainHandler.obtainMessage(
+                                    MainHandler.MSG_RUNNING_STATE_CHANGED, 0);
+                            mMainHandler.sendMessage(m);
+                        }
+                    }
+                } break;
+            }
+        }
+
+    }
+}
diff --git a/src/com/android/settings/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
similarity index 64%
rename from src/com/android/settings/InstalledAppDetails.java
rename to src/com/android/settings/applications/InstalledAppDetails.java
index 0ca35b8..8765dfb 100644
--- a/src/com/android/settings/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -1,5 +1,3 @@
-
-
 /**
  * Copyright (C) 2007 The Android Open Source Project
  *
@@ -16,10 +14,11 @@
  * under the License.
  */
 
-package com.android.settings;
+package com.android.settings.applications;
 
 import com.android.internal.content.PackageHelper;
 import com.android.settings.R;
+
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlertDialog;
@@ -33,22 +32,21 @@
 import android.content.pm.IPackageDataObserver;
 import android.content.pm.IPackageManager;
 import android.content.pm.IPackageMoveObserver;
-import android.content.pm.IPackageStatsObserver;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageParser;
-import android.content.pm.PackageStats;
+import android.content.pm.ResolveInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.storage.IMountService;
 import android.text.format.Formatter;
 import android.util.Log;
+
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 import android.content.ComponentName;
@@ -68,10 +66,14 @@
  * For non-system applications, there is no option to clear data. Instead there is an option to
  * uninstall the application.
  */
-public class InstalledAppDetails extends Activity implements View.OnClickListener {
+public class InstalledAppDetails extends Activity
+        implements View.OnClickListener, ApplicationsState.Callbacks {
     private static final String TAG="InstalledAppDetails";
-    private static final int _UNKNOWN_APP=R.string.unknown;
-    private ApplicationInfo mAppInfo;
+    
+    private PackageManager mPm;
+    private ApplicationsState mState;
+    private ApplicationsState.AppEntry mAppEntry;
+    private PackageInfo mPackageInfo;
     private Button mUninstallButton;
     private boolean mMoveInProgress = false;
     private boolean mUpdatedSysApp = false;
@@ -81,7 +83,6 @@
     private TextView mTotalSize;
     private TextView mAppSize;
     private TextView mDataSize;
-    private PkgSizeObserver mSizeObserver;
     private ClearUserDataObserver mClearDataObserver;
     // Views related to cache info
     private TextView mCacheSize;
@@ -92,18 +93,20 @@
     private Button mMoveAppButton;
     private int mMoveErrorCode;
     
-    PackageStats mSizeInfo;
-    private PackageManager mPm;
     private PackageMoveObserver mPackageMoveObserver;
     
+    private boolean mHaveSizes = false;
+    private long mLastCodeSize = -1;
+    private long mLastDataSize = -1;
+    private long mLastCacheSize = -1;
+    private long mLastTotalSize = -1;
+    
     //internal constants used in Handler
     private static final int OP_SUCCESSFUL = 1;
     private static final int OP_FAILED = 2;
     private static final int CLEAR_USER_DATA = 1;
-    private static final int GET_PKG_SIZE = 2;
     private static final int CLEAR_CACHE = 3;
     private static final int PACKAGE_MOVE = 4;
-    private static final String ATTR_PACKAGE_STATS="PackageStats";
     
     // invalid size value used initially and also when size retrieval through PackageManager
     // fails for whatever reason
@@ -132,12 +135,9 @@
                 case CLEAR_USER_DATA:
                     processClearMsg(msg);
                     break;
-                case GET_PKG_SIZE:
-                    refreshSizeInfo(msg);
-                    break;
                 case CLEAR_CACHE:
                     // Refresh size info
-                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
+                    mState.requestSize(mAppEntry.info.packageName);
                     break;
                 case PACKAGE_MOVE:
                     processMoveMsg(msg);
@@ -156,17 +156,6 @@
         }
     }
     
-    class PkgSizeObserver extends IPackageStatsObserver.Stub {
-        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
-             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
-             Bundle data = new Bundle();
-             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
-             msg.setData(data);
-             mHandler.sendMessage(msg);
-            
-         }
-     }
-
     class ClearCacheObserver extends IPackageDataObserver.Stub {
         public void onRemoveCompleted(final String packageName, final boolean succeeded) {
             final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
@@ -191,7 +180,7 @@
     }
     
     private void initDataButtons() {
-        if (mAppInfo.manageSpaceActivityName != null) {
+        if (mAppEntry.info.manageSpaceActivityName != null) {
             mClearDataButton.setText(R.string.manage_space_text);
         } else {
             mClearDataButton.setText(R.string.clear_user_data_text);
@@ -218,34 +207,25 @@
     }
 
     private void initMoveButton() {
-        String pkgName = mAppInfo.packageName;
         boolean dataOnly = false;
-        ApplicationInfo info1 = null;
-        PackageInfo pkgInfo = null;
-
-        try {
-            info1 = mPm.getApplicationInfo(pkgName, 0);
-            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
-                    PackageManager.GET_UNINSTALLED_PACKAGES);
-        } catch (NameNotFoundException e) {
-        }
-        dataOnly = (info1 == null) && (mAppInfo != null);
+        dataOnly = (mPackageInfo == null) && (mAppEntry != null);
         boolean moveDisable = true;
         if (dataOnly) {
             mMoveAppButton.setText(R.string.move_app);
-        } else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
+        } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
             mMoveAppButton.setText(R.string.move_app_to_internal);
             // Always let apps move to internal storage from sdcard.
             moveDisable = false;
         } else {
             mMoveAppButton.setText(R.string.move_app_to_sdcard);
-            if ((mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
-                    (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 &&
-                    pkgInfo != null) {
-                if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
-                        pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
+            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
+                    (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) == 0 &&
+                    mPackageInfo != null) {
+                if (mPackageInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
+                        mPackageInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
                     moveDisable = false;
-                } else if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
+                } else if (mPackageInfo.installLocation
+                        == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) {
                     IPackageManager ipm  = IPackageManager.Stub.asInterface(
                             ServiceManager.getService("package"));
                     int loc;
@@ -272,16 +252,41 @@
     }
 
     private void initUninstallButtons() {
-        mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
+        mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
         boolean enabled = true;
         if (mUpdatedSysApp) {
             mUninstallButton.setText(R.string.app_factory_reset);
         } else {
-            if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0){
-                // Disable button for system applications.
+            if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                 enabled = false;
+                try {
+                    // Try to prevent the user from bricking their phone
+                    // by not allowing disabling of apps signed with the
+                    // system cert and any launcher app in the system.
+                    PackageInfo sys = mPm.getPackageInfo("android",
+                            PackageManager.GET_SIGNATURES);
+                    Intent intent = new Intent(Intent.ACTION_MAIN);
+                    intent.addCategory(Intent.CATEGORY_HOME);
+                    intent.setPackage(mAppEntry.info.packageName);
+                    List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
+                    if ((homes != null && homes.size() > 0) ||
+                            (mPackageInfo != null &&
+                                    sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
+                        // Disable button for core system applications.
+                        mUninstallButton.setText(R.string.disable_text);
+                    } else if (mAppEntry.info.enabled) {
+                        mUninstallButton.setText(R.string.disable_text);
+                        enabled = true;
+                    } else {
+                        mUninstallButton.setText(R.string.enable_text);
+                        enabled = true;
+                    }
+                } catch (PackageManager.NameNotFoundException e) {
+                    Log.w(TAG, "Unable to get package info", e);
+                }
+            } else {
+                mUninstallButton.setText(R.string.uninstall_text);
             }
-            mUninstallButton.setText(R.string.uninstall_text);
         }
         mUninstallButton.setEnabled(enabled);
         if (enabled) {
@@ -290,49 +295,22 @@
         }
     }
 
-    private boolean initAppInfo(String packageName) {
-        try {
-            mAppInfo = mPm.getApplicationInfo(packageName,
-                    PackageManager.GET_UNINSTALLED_PACKAGES);
-            return true;
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, "Exception when retrieving package: " + packageName, e);
-            showDialogInner(DLG_APP_NOT_FOUND);
-            return false;
-        }
-    }
-
     /** Called when the activity is first created. */
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         
-        // Get package manager
+        mState = ApplicationsState.getInstance(getApplication());
         mPm = getPackageManager();
         
-        // Get application's name from intent
-        Intent intent = getIntent();
-        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
-        if (! initAppInfo(packageName)) {
-            return; // could not find package, finish called
-        }
-        
-        // Try retrieving package stats again
-        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
-        mComputingStr = getText(R.string.computing_size);
-        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
-        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
-        mSizeObserver = new PkgSizeObserver();
         setContentView(R.layout.installed_app_details);
-        //TODO download str and download url
+        
+        mComputingStr = getText(R.string.computing_size);
         
         // Set default values on sizes
         mTotalSize = (TextView)findViewById(R.id.total_size_text);
-        mTotalSize.setText(totalSizeStr);
         mAppSize = (TextView)findViewById(R.id.application_size_text);
-        mAppSize.setText(appSizeStr);
         mDataSize = (TextView)findViewById(R.id.data_size_text);
-        mDataSize.setText(dataSizeStr);
         
         // Get Control button panel
         View btnPanel = findViewById(R.id.control_buttons_panel);
@@ -346,51 +324,22 @@
         mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button);
         mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button);
         
-         // Cache section
-         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
-         mCacheSize.setText(mComputingStr);
-         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
-
-         // Get list of preferred activities
-         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
-         List<ComponentName> prefActList = new ArrayList<ComponentName>();
-         
-         // Intent list cannot be null. so pass empty list
-         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
-         mPm.getPreferredActivities(intentList,  prefActList, packageName);
-         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
-         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
-         if(prefActList.size() <= 0) {
-             // Disable clear activities button
-             autoLaunchView.setText(R.string.auto_launch_disable_text);
-             mActivitiesButton.setEnabled(false);
-         } else {
-             autoLaunchView.setText(R.string.auto_launch_enable_text);
-             mActivitiesButton.setOnClickListener(this);
-         }
-         
-         // Security permissions section
-         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
-         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
-         if(asp.getPermissionCount() > 0) {
-             permsView.setVisibility(View.VISIBLE);
-             // Make the security sections header visible
-             LinearLayout securityList = (LinearLayout) permsView.findViewById(
-                     R.id.security_settings_list);
-             securityList.addView(asp.getPermissionsView());
-         } else {
-             permsView.setVisibility(View.GONE);
-         }
+        // Cache section
+        mCacheSize = (TextView) findViewById(R.id.cache_size_text);
+        mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
+        
+        mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
     }
 
     // Utility method to set applicaiton label and icon.
     private void setAppLabelAndIcon(PackageInfo pkgInfo) {
         View appSnippet = findViewById(R.id.app_snippet);
         ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
-        icon.setImageDrawable(mAppInfo.loadIcon(mPm));
+        mState.ensureIcon(mAppEntry);
+        icon.setImageDrawable(mAppEntry.icon);
         // Set application name.
         TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
-        label.setText(mAppInfo.loadLabel(mPm));
+        label.setText(mAppEntry.label);
         // Version number of application
         mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size);
 
@@ -407,35 +356,105 @@
     public void onResume() {
         super.onResume();
         
-        if (mAppInfo == null) {
+        mState.resume(this);
+        if (!refreshUi()) {
             setIntentAndFinish(true, true);
-            return; // onCreate must have failed, make sure to exit
-        }
-        if (! initAppInfo(mAppInfo.packageName)) {
-            return; // could not find package, finish called
-        }
-        
-        PackageInfo pkgInfo = null;
-        // Get application info again to refresh changed properties of application
-        try {
-            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
-                    PackageManager.GET_UNINSTALLED_PACKAGES);
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
-            showDialogInner(DLG_APP_NOT_FOUND);
-            return; // could not find package, finish called
-        }
-        
-        checkForceStop();
-        setAppLabelAndIcon(pkgInfo);
-        refreshButtons();
-        
-        // Refresh size info
-        if (mAppInfo != null && mAppInfo.packageName != null) {
-            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
         }
     }
 
+    @Override
+    public void onPause() {
+        super.onPause();
+        mState.pause();
+    }
+
+    @Override
+    public void onAllSizesComputed() {
+    }
+
+    @Override
+    public void onPackageIconChanged() {
+    }
+
+    @Override
+    public void onPackageListChanged() {
+        refreshUi();
+    }
+
+    @Override
+    public void onPackageSizeChanged(String packageName) {
+        if (packageName.equals(mAppEntry.info.packageName)) {
+            refreshSizeInfo();
+        }
+    }
+
+    @Override
+    public void onRunningStateChanged(boolean running) {
+    }
+
+    private boolean refreshUi() {
+        if (mMoveInProgress) {
+            return true;
+        }
+        
+        Intent intent = getIntent();
+        final String packageName = intent.getData().getSchemeSpecificPart();
+        mAppEntry = mState.getEntry(packageName);
+        
+        if (mAppEntry == null) {
+            return false; // onCreate must have failed, make sure to exit
+        }
+        
+        // Get application info again to refresh changed properties of application
+        try {
+            mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
+                    PackageManager.GET_DISABLED_COMPONENTS |
+                    PackageManager.GET_UNINSTALLED_PACKAGES |
+                    PackageManager.GET_SIGNATURES);
+        } catch (NameNotFoundException e) {
+            Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
+            return false; // onCreate must have failed, make sure to exit
+        }
+        
+        // Get list of preferred activities
+        List<ComponentName> prefActList = new ArrayList<ComponentName>();
+        
+        // Intent list cannot be null. so pass empty list
+        List<IntentFilter> intentList = new ArrayList<IntentFilter>();
+        mPm.getPreferredActivities(intentList, prefActList, packageName);
+        if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
+        TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
+        if (prefActList.size() <= 0) {
+            // Disable clear activities button
+            autoLaunchView.setText(R.string.auto_launch_disable_text);
+            mActivitiesButton.setEnabled(false);
+        } else {
+            autoLaunchView.setText(R.string.auto_launch_enable_text);
+            mActivitiesButton.setEnabled(true);
+            mActivitiesButton.setOnClickListener(this);
+        }
+         
+        // Security permissions section
+        LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
+        AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
+        if (asp.getPermissionCount() > 0) {
+            permsView.setVisibility(View.VISIBLE);
+            // Make the security sections header visible
+            LinearLayout securityList = (LinearLayout) permsView.findViewById(
+                    R.id.security_settings_list);
+            securityList.removeAllViews();
+            securityList.addView(asp.getPermissionsView());
+        } else {
+            permsView.setVisibility(View.GONE);
+        }
+        
+        checkForceStop();
+        setAppLabelAndIcon(mPackageInfo);
+        refreshButtons();
+        refreshSizeInfo();
+        return true;
+    }
+    
     private void setIntentAndFinish(boolean finish, boolean appChanged) {
         if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
         Intent intent = new Intent();
@@ -446,60 +465,50 @@
         }
     }
     
-    /*
-     * Private method to handle get size info notification from observer when
-     * the async operation from PackageManager is complete. The current user data
-     * info has to be refreshed in the manage applications screen as well as the current screen.
-     */
-    private void refreshSizeInfo(Message msg) {
-        boolean changed = false;
-        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
-        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
-        if(mSizeInfo == null) {
-            mSizeInfo = newPs;
-            String str = getSizeStr(newTot);
-            mTotalSize.setText(str);
-            mAppSize.setText(getSizeStr(newPs.codeSize));
-            mDataSize.setText(getSizeStr(newPs.dataSize));
-            mCacheSize.setText(getSizeStr(newPs.cacheSize));
-        } else {
-            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
-            if(newTot != oldTot) {
-                String str = getSizeStr(newTot);
-                mTotalSize.setText(str);
-                changed = true;
+    private void refreshSizeInfo() {
+        if (mAppEntry.size == ApplicationsState.SIZE_INVALID
+                || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) {
+            mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1;
+            if (!mHaveSizes) {
+                mAppSize.setText(mComputingStr);
+                mDataSize.setText(mComputingStr);
+                mCacheSize.setText(mComputingStr);
+                mTotalSize.setText(mComputingStr);
             }
-            if(newPs.codeSize != mSizeInfo.codeSize) {
-                mAppSize.setText(getSizeStr(newPs.codeSize));
-                changed = true;
-            }
-            if(newPs.dataSize != mSizeInfo.dataSize) {
-                mDataSize.setText(getSizeStr(newPs.dataSize));
-                changed = true;
-            }
-            if(newPs.cacheSize != mSizeInfo.cacheSize) {
-                mCacheSize.setText(getSizeStr(newPs.cacheSize));
-                changed = true;
-            }
-            if(changed) {
-                mSizeInfo = newPs;
-            }
-        }
-        // If data size is zero disable clear data button
-        if (newPs.dataSize == 0) {
             mClearDataButton.setEnabled(false);
-        }
-        long data = mSizeInfo.dataSize;
-        refreshCacheInfo(newPs.cacheSize);
-    }
-    
-    private void refreshCacheInfo(long cacheSize) {
-        // Set cache info
-        mCacheSize.setText(getSizeStr(cacheSize));
-        if (cacheSize <= 0) {
             mClearCacheButton.setEnabled(false);
+            
         } else {
-            mClearCacheButton.setOnClickListener(this);
+            mHaveSizes = true;
+            if (mLastCodeSize != mAppEntry.codeSize) {
+                mLastCodeSize = mAppEntry.codeSize;
+                mAppSize.setText(getSizeStr(mAppEntry.codeSize));
+            }
+            if (mLastDataSize != mAppEntry.dataSize) {
+                mLastDataSize = mAppEntry.dataSize;
+                mDataSize.setText(getSizeStr(mAppEntry.dataSize));
+            }
+            if (mLastCacheSize != mAppEntry.cacheSize) {
+                mLastCacheSize = mAppEntry.cacheSize;
+                mCacheSize.setText(getSizeStr(mAppEntry.cacheSize));
+            }
+            if (mLastTotalSize != mAppEntry.size) {
+                mLastTotalSize = mAppEntry.size;
+                mTotalSize.setText(getSizeStr(mAppEntry.size));
+            }
+            
+            if (mAppEntry.dataSize <= 0) {
+                mClearDataButton.setEnabled(false);
+            } else {
+                mClearDataButton.setEnabled(true);
+                mClearDataButton.setOnClickListener(this);
+            }
+            if (mAppEntry.cacheSize <= 0) {
+                mClearCacheButton.setEnabled(false);
+            } else {
+                mClearCacheButton.setEnabled(true);
+                mClearCacheButton.setOnClickListener(this);
+            }
         }
     }
     
@@ -509,14 +518,15 @@
      */
     private void processClearMsg(Message msg) {
         int result = msg.arg1;
-        String packageName = mAppInfo.packageName;
+        String packageName = mAppEntry.info.packageName;
         mClearDataButton.setText(R.string.clear_user_data_text);
         if(result == OP_SUCCESSFUL) {
             Log.i(TAG, "Cleared user data for package : "+packageName);
-            mPm.getPackageSizeInfo(packageName, mSizeObserver);
+            mState.requestSize(mAppEntry.info.packageName);
         } else {
             mClearDataButton.setEnabled(true);
         }
+        checkForceStop();
     }
 
     private void refreshButtons() {
@@ -533,23 +543,18 @@
 
     private void processMoveMsg(Message msg) {
         int result = msg.arg1;
-        String packageName = mAppInfo.packageName;
+        String packageName = mAppEntry.info.packageName;
         // Refresh the button attributes.
         mMoveInProgress = false;
-        if(result == PackageManager.MOVE_SUCCEEDED) {
+        if (result == PackageManager.MOVE_SUCCEEDED) {
             Log.i(TAG, "Moved resources for " + packageName);
             // Refresh size information again.
-            mPm.getPackageSizeInfo(packageName, mSizeObserver);
+            mState.requestSize(mAppEntry.info.packageName);
         } else {
             mMoveErrorCode = result;
             showDialogInner(DLG_MOVE_FAILED);
         }
-        
-        if (! initAppInfo(packageName)) {
-            return; // could not find package, finish called
-        }
-        
-        refreshButtons();
+        refreshUi();
     }
 
     /*
@@ -559,14 +564,14 @@
     private  void initiateClearUserData() {
         mClearDataButton.setEnabled(false);
         // Invoke uninstall or clear user data based on sysPackage
-        String packageName = mAppInfo.packageName;
+        String packageName = mAppEntry.info.packageName;
         Log.i(TAG, "Clearing user data for package : " + packageName);
-        if(mClearDataObserver == null) {
+        if (mClearDataObserver == null) {
             mClearDataObserver = new ClearUserDataObserver();
         }
         ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
         boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
-        if(!res) {
+        if (!res) {
             // Clearing data failed for some obscure reason. Just log error for now
             Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
             showDialogInner(DLG_CANNOT_CLEAR_DATA);
@@ -606,7 +611,7 @@
                     new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int which) {
                     // Clear user data here
-                    uninstallPkg(mAppInfo.packageName);
+                    uninstallPkg(mAppEntry.info.packageName);
                 }
             })
             .setNegativeButton(R.string.dlg_cancel, null)
@@ -638,29 +643,29 @@
                 }
             })
             .create();
-            case DLG_FORCE_STOP:
-                return new AlertDialog.Builder(this)
-                .setTitle(getString(R.string.force_stop_dlg_title))
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(getString(R.string.force_stop_dlg_text))
-                .setPositiveButton(R.string.dlg_ok,
-                    new DialogInterface.OnClickListener() {
+        case DLG_FORCE_STOP:
+            return new AlertDialog.Builder(this)
+            .setTitle(getString(R.string.force_stop_dlg_title))
+            .setIcon(android.R.drawable.ic_dialog_alert)
+            .setMessage(getString(R.string.force_stop_dlg_text))
+            .setPositiveButton(R.string.dlg_ok,
+                new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int which) {
                     // Force stop
-                    forceStopPackage(mAppInfo.packageName);
+                    forceStopPackage(mAppEntry.info.packageName);
                 }
             })
             .setNegativeButton(R.string.dlg_cancel, null)
             .create();
-            case DLG_MOVE_FAILED:
-                CharSequence msg = getString(R.string.move_app_failed_dlg_text,
-                        getMoveErrMsg(mMoveErrorCode));
-                return new AlertDialog.Builder(this)
-                .setTitle(getString(R.string.move_app_failed_dlg_title))
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setMessage(msg)
-                .setNeutralButton(R.string.dlg_ok, null)
-                .create();
+        case DLG_MOVE_FAILED:
+            CharSequence msg = getString(R.string.move_app_failed_dlg_text,
+                    getMoveErrMsg(mMoveErrorCode));
+            return new AlertDialog.Builder(this)
+            .setTitle(getString(R.string.move_app_failed_dlg_title))
+            .setIcon(android.R.drawable.ic_dialog_alert)
+            .setMessage(msg)
+            .setNeutralButton(R.string.dlg_ok, null)
+            .create();
         }
         return null;
     }
@@ -690,32 +695,59 @@
     
     private void checkForceStop() {
         Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART,
-                Uri.fromParts("package", mAppInfo.packageName, null));
-        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName });
-        intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid);
+                Uri.fromParts("package", mAppEntry.info.packageName, null));
+        intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName });
+        intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid);
         sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null,
                 Activity.RESULT_CANCELED, null, null);
     }
     
+    static class DisableChanger extends AsyncTask<Object, Object, Object> {
+        final PackageManager mPm;
+        final WeakReference<InstalledAppDetails> mActivity;
+        final ApplicationInfo mInfo;
+        final int mState;
+
+        DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) {
+            mPm = activity.mPm;
+            mActivity = new WeakReference<InstalledAppDetails>(activity);
+            mInfo = info;
+            mState = state;
+        }
+
+        @Override
+        protected Object doInBackground(Object... params) {
+            mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0);
+            return null;
+        }
+    }
+
     /*
      * Method implementing functionality of buttons clicked
      * @see android.view.View.OnClickListener#onClick(android.view.View)
      */
     public void onClick(View v) {
-        String packageName = mAppInfo.packageName;
+        String packageName = mAppEntry.info.packageName;
         if(v == mUninstallButton) {
             if (mUpdatedSysApp) {
                 showDialogInner(DLG_FACTORY_RESET);
             } else {
-                uninstallPkg(packageName);
+                if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                    new DisableChanger(this, mAppEntry.info, mAppEntry.info.enabled ?
+                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED
+                            : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT).execute((Object)null);
+                } else {
+                    uninstallPkg(packageName);
+                }
             }
         } else if(v == mActivitiesButton) {
             mPm.clearPackagePreferredActivities(packageName);
             mActivitiesButton.setEnabled(false);
         } else if(v == mClearDataButton) {
-            if (mAppInfo.manageSpaceActivityName != null) {
+            if (mAppEntry.info.manageSpaceActivityName != null) {
                 Intent intent = new Intent(Intent.ACTION_DEFAULT);
-                intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
+                intent.setClassName(mAppEntry.info.packageName,
+                        mAppEntry.info.manageSpaceActivityName);
                 startActivityForResult(intent, -1);
             } else {
                 showDialogInner(DLG_CLEAR_DATA);
@@ -727,16 +759,17 @@
             }
             mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
         } else if (v == mForceStopButton) {
-            forceStopPackage(mAppInfo.packageName);
+            showDialogInner(DLG_FORCE_STOP);
+            //forceStopPackage(mAppInfo.packageName);
         } else if (v == mMoveAppButton) {
             if (mPackageMoveObserver == null) {
                 mPackageMoveObserver = new PackageMoveObserver();
             }
-            int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
+            int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ?
                     PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA;
             mMoveInProgress = true;
             refreshButtons();
-            mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags);
+            mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags);
         }
     }
 }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
new file mode 100644
index 0000000..772e48d
--- /dev/null
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -0,0 +1,627 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import com.android.settings.R;
+import com.android.settings.applications.ApplicationsState.AppEntry;
+
+import android.app.TabActivity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.animation.AnimationUtils;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Filter;
+import android.widget.Filterable;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TabHost;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+
+/**
+ * Activity to pick an application that will be used to display installation information and
+ * options to uninstall/delete user data for system applications. This activity
+ * can be launched through Settings or via the ACTION_MANAGE_PACKAGE_STORAGE
+ * intent.
+ */
+public class ManageApplications extends TabActivity implements
+        OnItemClickListener, DialogInterface.OnCancelListener,
+        TabHost.TabContentFactory, TabHost.OnTabChangeListener {
+    static final String TAG = "ManageApplications";
+    static final boolean DEBUG = false;
+    
+    // attributes used as keys when passing values to InstalledAppDetails activity
+    public static final String APP_CHG = "chg";
+    
+    // constant value that can be used to check return code from sub activity.
+    private static final int INSTALLED_APP_DETAILS = 1;
+    
+    // sort order that can be changed through the menu can be sorted alphabetically
+    // or size(descending)
+    private static final int MENU_OPTIONS_BASE = 0;
+    // Filter options used for displayed list of applications
+    public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
+    public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 1;
+    public static final int FILTER_APPS_SDCARD = MENU_OPTIONS_BASE + 2;
+
+    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
+    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
+    // sort order
+    private int mSortOrder = SORT_ORDER_ALPHA;
+    // Filter value
+    private int mFilterApps = FILTER_APPS_THIRD_PARTY;
+    
+    private ApplicationsState mApplicationsState;
+    private ApplicationsAdapter mApplicationsAdapter;
+    
+    // Size resource used for packages whose size computation failed for some reason
+    private CharSequence mInvalidSizeStr;
+    private CharSequence mComputingSizeStr;
+    
+    // layout inflater object used to inflate views
+    private LayoutInflater mInflater;
+    
+    private String mCurrentPkgName;
+    
+    private View mLoadingContainer;
+
+    private View mListContainer;
+
+    // ListView used to display list
+    private ListView mListView;
+    // Custom view used to display running processes
+    private RunningProcessesView mRunningProcessesView;
+    
+    // These are for keeping track of activity and tab switch state.
+    private int mCurView;
+    private boolean mCreatedRunning;
+
+    private boolean mResumedRunning;
+    private boolean mActivityResumed;
+    private Object mNonConfigInstance;
+    
+    final Runnable mRunningProcessesAvail = new Runnable() {
+        public void run() {
+            handleRunningProcessesAvail();
+        }
+    };
+
+    // View Holder used when displaying views
+    static class AppViewHolder {
+        ApplicationsState.AppEntry entry;
+        TextView appName;
+        ImageView appIcon;
+        TextView appSize;
+        TextView disabled;
+        
+        void updateSizeText(ManageApplications ma) {
+            if (DEBUG) Log.i(TAG, "updateSizeText of " + entry.label + " " + entry
+                    + ": " + entry.sizeStr);
+            if (entry.sizeStr != null) {
+                appSize.setText(entry.sizeStr);
+            } else if (entry.size == ApplicationsState.SIZE_INVALID) {
+                appSize.setText(ma.mInvalidSizeStr);
+            }
+        }
+    }
+    
+    /*
+     * Custom adapter implementation for the ListView
+     * This adapter maintains a map for each displayed application and its properties
+     * An index value on each AppInfo object indicates the correct position or index
+     * in the list. If the list gets updated dynamically when the user is viewing the list of
+     * applications, we need to return the correct index of position. This is done by mapping
+     * the getId methods via the package name into the internal maps and indices.
+     * The order of applications in the list is mirrored in mAppLocalList
+     */
+    class ApplicationsAdapter extends BaseAdapter implements Filterable,
+            ApplicationsState.Callbacks, AbsListView.RecyclerListener {
+        private final ApplicationsState mState;
+        private final ArrayList<View> mActive = new ArrayList<View>();
+        private ArrayList<ApplicationsState.AppEntry> mBaseEntries;
+        private ArrayList<ApplicationsState.AppEntry> mEntries;
+        private boolean mResumed;
+        private int mLastFilterMode=-1, mLastSortMode=-1;
+        CharSequence mCurFilterPrefix;
+
+        private Filter mFilter = new Filter() {
+            @Override
+            protected FilterResults performFiltering(CharSequence constraint) {
+                ArrayList<ApplicationsState.AppEntry> entries
+                        = applyPrefixFilter(constraint, mBaseEntries);
+                FilterResults fr = new FilterResults();
+                fr.values = entries;
+                fr.count = entries.size();
+                return fr;
+            }
+
+            @Override
+            protected void publishResults(CharSequence constraint, FilterResults results) {
+                mCurFilterPrefix = constraint;
+                mEntries = (ArrayList<ApplicationsState.AppEntry>)results.values;
+                notifyDataSetChanged();
+            }
+        };
+
+        public ApplicationsAdapter(ApplicationsState state) {
+            mState = state;
+        }
+
+        public void resume(int filter, int sort) {
+            if (DEBUG) Log.i(TAG, "Resume!  mResumed=" + mResumed);
+            if (!mResumed) {
+                mResumed = true;
+                mState.resume(this);
+                mLastFilterMode = filter;
+                mLastSortMode = sort;
+                rebuild();
+            } else {
+                rebuild(filter, sort);
+            }
+        }
+
+        public void pause() {
+            if (mResumed) {
+                mResumed = false;
+                mState.pause();
+            }
+        }
+
+        public void rebuild(int filter, int sort) {
+            if (filter == mLastFilterMode && sort == mLastSortMode) {
+                return;
+            }
+            mLastFilterMode = filter;
+            mLastSortMode = sort;
+            rebuild();
+        }
+        
+        public void rebuild() {
+            if (DEBUG) Log.i(TAG, "Rebuilding app list...");
+            ApplicationsState.AppFilter filterObj;
+            Comparator<AppEntry> comparatorObj;
+            switch (mLastFilterMode) {
+                case FILTER_APPS_THIRD_PARTY:
+                    filterObj = ApplicationsState.THIRD_PARTY_FILTER;
+                    break;
+                case FILTER_APPS_SDCARD:
+                    filterObj = ApplicationsState.ON_SD_CARD_FILTER;
+                    break;
+                default:
+                    filterObj = null;
+                    break;
+            }
+            switch (mLastSortMode) {
+                case SORT_ORDER_SIZE:
+                    comparatorObj = ApplicationsState.SIZE_COMPARATOR;
+                    break;
+                default:
+                    comparatorObj = ApplicationsState.ALPHA_COMPARATOR;
+                    break;
+            }
+            mBaseEntries = mState.rebuild(filterObj, comparatorObj);
+            mEntries = applyPrefixFilter(mCurFilterPrefix, mBaseEntries);
+            notifyDataSetChanged();
+        }
+
+        ArrayList<ApplicationsState.AppEntry> applyPrefixFilter(CharSequence prefix,
+                ArrayList<ApplicationsState.AppEntry> origEntries) {
+            if (prefix == null || prefix.length() == 0) {
+                return origEntries;
+            } else {
+                String prefixStr = ApplicationsState.normalize(prefix.toString());
+                final String spacePrefixStr = " " + prefixStr;
+                ArrayList<ApplicationsState.AppEntry> newEntries
+                        = new ArrayList<ApplicationsState.AppEntry>();
+                for (int i=0; i<origEntries.size(); i++) {
+                    ApplicationsState.AppEntry entry = origEntries.get(i);
+                    String nlabel = entry.getNormalizedLabel();
+                    if (nlabel.startsWith(prefixStr) || nlabel.indexOf(spacePrefixStr) != -1) {
+                        newEntries.add(entry);
+                    }
+                }
+                return newEntries;
+            }
+        }
+
+        @Override
+        public void onRunningStateChanged(boolean running) {
+            setProgressBarIndeterminateVisibility(running);
+        }
+
+        @Override
+        public void onPackageListChanged() {
+            rebuild();
+        }
+
+        @Override
+        public void onPackageIconChanged() {
+            // We ensure icons are loaded when their item is displayed, so
+            // don't care about icons loaded in the background.
+        }
+
+        @Override
+        public void onPackageSizeChanged(String packageName) {
+            for (int i=0; i<mActive.size(); i++) {
+                AppViewHolder holder = (AppViewHolder)mActive.get(i).getTag();
+                if (holder.entry.info.packageName.equals(packageName)) {
+                    synchronized (holder.entry) {
+                        holder.updateSizeText(ManageApplications.this);
+                    }
+                    if (holder.entry.info.packageName.equals(mCurrentPkgName)
+                            && mLastSortMode == SORT_ORDER_SIZE) {
+                        // We got the size information for the last app the
+                        // user viewed, and are sorting by size...  they may
+                        // have cleared data, so we immediately want to resort
+                        // the list with the new size to reflect it to the user.
+                        rebuild();
+                    }
+                    return;
+                }
+            }
+        }
+
+        @Override
+        public void onAllSizesComputed() {
+            if (mLastSortMode == SORT_ORDER_SIZE) {
+                rebuild();
+            }
+        }
+        
+        public int getCount() {
+            return mEntries != null ? mEntries.size() : 0;
+        }
+        
+        public Object getItem(int position) {
+            return mEntries.get(position);
+        }
+        
+        public ApplicationsState.AppEntry getAppEntry(int position) {
+            return mEntries.get(position);
+        }
+
+        public long getItemId(int position) {
+            return mEntries.get(position).id;
+        }
+        
+        public View getView(int position, View convertView, ViewGroup parent) {
+            // A ViewHolder keeps references to children views to avoid unnecessary calls
+            // to findViewById() on each row.
+            AppViewHolder holder;
+
+            // When convertView is not null, we can reuse it directly, there is no need
+            // to reinflate it. We only inflate a new View when the convertView supplied
+            // by ListView is null.
+            if (convertView == null) {
+                convertView = mInflater.inflate(R.layout.manage_applications_item, null);
+
+                // Creates a ViewHolder and store references to the two children views
+                // we want to bind data to.
+                holder = new AppViewHolder();
+                holder.appName = (TextView) convertView.findViewById(R.id.app_name);
+                holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
+                holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
+                holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
+                convertView.setTag(holder);
+            } else {
+                // Get the ViewHolder back to get fast access to the TextView
+                // and the ImageView.
+                holder = (AppViewHolder) convertView.getTag();
+            }
+
+            // Bind the data efficiently with the holder
+            ApplicationsState.AppEntry entry = mEntries.get(position);
+            synchronized (entry) {
+                holder.entry = entry;
+                if (entry.label != null) {
+                    holder.appName.setText(entry.label);
+                    holder.appName.setTextColor(getResources().getColorStateList(
+                            entry.info.enabled ? android.R.color.primary_text_dark
+                                    : android.R.color.secondary_text_dark));
+                }
+                mState.ensureIcon(entry);
+                if (entry.icon != null) {
+                    holder.appIcon.setImageDrawable(entry.icon);
+                }
+                holder.updateSizeText(ManageApplications.this);
+                holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
+            }
+            mActive.remove(convertView);
+            mActive.add(convertView);
+            return convertView;
+        }
+
+        @Override
+        public Filter getFilter() {
+            return mFilter;
+        }
+
+        @Override
+        public void onMovedToScrapHeap(View view) {
+            mActive.remove(view);
+        }
+    }
+    
+    static final String TAB_DOWNLOADED = "Downloaded";
+    static final String TAB_RUNNING = "Running";
+    static final String TAB_ALL = "All";
+    static final String TAB_SDCARD = "OnSdCard";
+    private View mRootView;
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mApplicationsState = ApplicationsState.getInstance(getApplication());
+        mApplicationsAdapter = new ApplicationsAdapter(mApplicationsState);
+        Intent intent = getIntent();
+        String action = intent.getAction();
+        String defaultTabTag = TAB_DOWNLOADED;
+        if (intent.getComponent().getClassName().equals(
+                "com.android.settings.RunningServices")) {
+            defaultTabTag = TAB_RUNNING;
+        } else if (intent.getComponent().getClassName().equals(
+                "com.android.settings.applications.StorageUse")
+                || action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
+            mSortOrder = SORT_ORDER_SIZE;
+            mFilterApps = FILTER_APPS_ALL;
+            defaultTabTag = TAB_ALL;
+        }
+        
+        if (savedInstanceState != null) {
+            mSortOrder = savedInstanceState.getInt("sortOrder", mSortOrder);
+            mFilterApps = savedInstanceState.getInt("filterApps", mFilterApps);
+            String tmp = savedInstanceState.getString("defaultTabTag");
+            if (tmp != null) defaultTabTag = tmp;
+        }
+        
+        mNonConfigInstance = getLastNonConfigurationInstance();
+        
+        // initialize some window features
+        requestWindowFeature(Window.FEATURE_RIGHT_ICON);
+        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+        mInvalidSizeStr = getText(R.string.invalid_size_value);
+        mComputingSizeStr = getText(R.string.computing_size);
+        // initialize the inflater
+        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mRootView = mInflater.inflate(R.layout.manage_applications, null);
+        mLoadingContainer = mRootView.findViewById(R.id.loading_container);
+        mListContainer = mRootView.findViewById(R.id.list_container);
+        // Create adapter and list view here
+        ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
+        View emptyView = mListContainer.findViewById(com.android.internal.R.id.empty);
+        if (emptyView != null) {
+            lv.setEmptyView(emptyView);
+        }
+        lv.setOnItemClickListener(this);
+        lv.setSaveEnabled(true);
+        lv.setItemsCanFocus(true);
+        lv.setOnItemClickListener(this);
+        lv.setTextFilterEnabled(true);
+        mListView = lv;
+        lv.setRecyclerListener(mApplicationsAdapter);
+        mListView.setAdapter(mApplicationsAdapter);
+        mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
+                R.id.running_processes);
+
+        final TabHost tabHost = getTabHost();
+        tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED)
+                .setIndicator(getString(R.string.filter_apps_third_party),
+                        getResources().getDrawable(R.drawable.ic_tab_download))
+                .setContent(this));
+        tabHost.addTab(tabHost.newTabSpec(TAB_ALL)
+                .setIndicator(getString(R.string.filter_apps_all),
+                        getResources().getDrawable(R.drawable.ic_tab_all))
+                .setContent(this));
+        tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD)
+                .setIndicator(getString(R.string.filter_apps_onsdcard),
+                        getResources().getDrawable(R.drawable.ic_tab_sdcard))
+                .setContent(this));
+        tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING)
+                .setIndicator(getString(R.string.filter_apps_running),
+                        getResources().getDrawable(R.drawable.ic_tab_running))
+                .setContent(this));
+        tabHost.setCurrentTabByTag(defaultTabTag);
+        tabHost.setOnTabChangedListener(this);
+    }
+    
+    @Override
+    public void onStart() {
+        super.onStart();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mActivityResumed = true;
+        showCurrentTab();
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("sortOrder", mSortOrder);
+        outState.putInt("filterApps", mFilterApps);
+        outState.putString("defautTabTag", getTabHost().getCurrentTabTag());
+    }
+
+    @Override
+    public Object onRetainNonConfigurationInstance() {
+        return mRunningProcessesView.doRetainNonConfigurationInstance();
+    }
+    
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mActivityResumed = false;
+        mApplicationsAdapter.pause();
+        if (mResumedRunning) {
+            mRunningProcessesView.doPause();
+            mResumedRunning = false;
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode,
+            Intent data) {
+        if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
+            mApplicationsState.requestSize(mCurrentPkgName);
+        }
+    }
+    
+    // utility method used to start sub activity
+    private void startApplicationDetailsActivity() {
+        // Create intent to start new activity
+        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
+                Uri.fromParts("package", mCurrentPkgName, null));
+        // start new activity to display extended information
+        startActivityForResult(intent, INSTALLED_APP_DETAILS);
+    }
+    
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
+                .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
+        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
+                .setIcon(android.R.drawable.ic_menu_sort_by_size); 
+        return true;
+    }
+    
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
+        menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        int menuId = item.getItemId();
+        if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
+            mSortOrder = menuId;
+            mApplicationsAdapter.rebuild(mFilterApps, mSortOrder);
+        }
+        return true;
+    }
+
+    public void onItemClick(AdapterView<?> parent, View view, int position,
+            long id) {
+        ApplicationsState.AppEntry entry = mApplicationsAdapter.getAppEntry(position);
+        mCurrentPkgName = entry.info.packageName;
+        startApplicationDetailsActivity();
+    }
+    
+    // Finish the activity if the user presses the back button to cancel the activity
+    public void onCancel(DialogInterface dialog) {
+        finish();
+    }
+
+    public View createTabContent(String tag) {
+        return mRootView;
+    }
+
+    static final int VIEW_NOTHING = 0;
+    static final int VIEW_LIST = 1;
+    static final int VIEW_RUNNING = 2;
+
+    private void selectView(int which) {
+        if (which == VIEW_LIST) {
+            if (mResumedRunning) {
+                mRunningProcessesView.doPause();
+                mResumedRunning = false;
+            }
+            if (mCurView != which) {
+                mRunningProcessesView.setVisibility(View.GONE);
+                mListContainer.setVisibility(View.VISIBLE);
+            }
+            if (mActivityResumed) {
+                mApplicationsAdapter.resume(mFilterApps, mSortOrder);
+            }
+        } else if (which == VIEW_RUNNING) {
+            if (!mCreatedRunning) {
+                mRunningProcessesView.doCreate(null, mNonConfigInstance);
+                mCreatedRunning = true;
+            }
+            boolean haveData = true;
+            if (mActivityResumed && !mResumedRunning) {
+                haveData = mRunningProcessesView.doResume(mRunningProcessesAvail);
+                mResumedRunning = true;
+            }
+            mApplicationsAdapter.pause();
+            if (mCurView != which) {
+                if (haveData) {
+                    mRunningProcessesView.setVisibility(View.VISIBLE);
+                } else {
+                    mLoadingContainer.setVisibility(View.VISIBLE);
+                }
+                mListContainer.setVisibility(View.GONE);
+            }
+        }
+        mCurView = which;
+    }
+
+    void handleRunningProcessesAvail() {
+        if (mCurView == VIEW_RUNNING) {
+            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
+                    this, android.R.anim.fade_out));
+            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
+                    this, android.R.anim.fade_in));
+            mRunningProcessesView.setVisibility(View.VISIBLE);
+            mLoadingContainer.setVisibility(View.GONE);
+        }
+    }
+
+    public void showCurrentTab() {
+        String tabId = getTabHost().getCurrentTabTag();
+        int newOption;
+        if (TAB_DOWNLOADED.equalsIgnoreCase(tabId)) {
+            newOption = FILTER_APPS_THIRD_PARTY;
+        } else if (TAB_ALL.equalsIgnoreCase(tabId)) {
+            newOption = FILTER_APPS_ALL;
+        } else if (TAB_SDCARD.equalsIgnoreCase(tabId)) {
+            newOption = FILTER_APPS_SDCARD;
+        } else if (TAB_RUNNING.equalsIgnoreCase(tabId)) {
+            selectView(VIEW_RUNNING);
+            return;
+        } else {
+            // Invalid option. Do nothing
+            return;
+        }
+        
+        mFilterApps = newOption;
+        selectView(VIEW_LIST);
+    }
+
+    public void onTabChanged(String tabId) {
+        showCurrentTab();
+    }
+}
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
new file mode 100644
index 0000000..1de67f7
--- /dev/null
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -0,0 +1,533 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import com.android.settings.R;
+
+import android.app.ActivityManager;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.text.format.DateUtils;
+import android.text.format.Formatter;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.AbsListView.RecyclerListener;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class RunningProcessesView extends FrameLayout
+        implements AdapterView.OnItemClickListener, RecyclerListener,
+        RunningState.OnRefreshUiListener {
+    
+    // Memory pages are 4K.
+    static final long PAGE_SIZE = 4*1024;
+    
+    long SECONDARY_SERVER_MEM;
+    
+    final HashMap<View, ActiveItem> mActiveItems = new HashMap<View, ActiveItem>();
+    
+    ActivityManager mAm;
+    
+    RunningState mState;
+    
+    Runnable mDataAvail;
+
+    StringBuilder mBuilder = new StringBuilder(128);
+    
+    RunningState.BaseItem mCurSelected;
+    
+    ListView mListView;
+    LinearColorBar mColorBar;
+    TextView mBackgroundProcessText;
+    TextView mForegroundProcessText;
+    
+    int mLastNumBackgroundProcesses = -1;
+    int mLastNumForegroundProcesses = -1;
+    int mLastNumServiceProcesses = -1;
+    long mLastBackgroundProcessMemory = -1;
+    long mLastForegroundProcessMemory = -1;
+    long mLastServiceProcessMemory = -1;
+    long mLastAvailMemory = -1;
+    
+    Dialog mCurDialog;
+    
+    byte[] mBuffer = new byte[1024];
+    
+    public static class ActiveItem {
+        View mRootView;
+        RunningState.BaseItem mItem;
+        ActivityManager.RunningServiceInfo mService;
+        ViewHolder mHolder;
+        long mFirstRunTime;
+        
+        void updateTime(Context context, StringBuilder builder) {
+            TextView uptimeView = null;
+            
+            if (mItem instanceof RunningState.ServiceItem) {
+                // If we are displaying a service, then the service
+                // uptime goes at the top.
+                uptimeView = mHolder.size;
+                
+            } else {
+                String size = mItem.mSizeStr != null ? mItem.mSizeStr : "";
+                if (!size.equals(mItem.mCurSizeStr)) {
+                    mItem.mCurSizeStr = size;
+                    mHolder.size.setText(size);
+                }
+                
+                if (mItem instanceof RunningState.MergedItem) {
+                    // This item represents both services and proceses,
+                    // so show the service uptime below.
+                    uptimeView = mHolder.uptime;
+                }
+            }
+            
+            if (uptimeView != null) {
+                if (mFirstRunTime >= 0) {
+                    //Log.i("foo", "Time for " + mItem.mDisplayLabel
+                    //        + ": " + (SystemClock.uptimeMillis()-mFirstRunTime));
+                    uptimeView.setText(DateUtils.formatElapsedTime(builder,
+                            (SystemClock.elapsedRealtime()-mFirstRunTime)/1000));
+                } else {
+                    boolean isService = false;
+                    if (mItem instanceof RunningState.MergedItem) {
+                        isService = ((RunningState.MergedItem)mItem).mServices.size() > 0;
+                    }
+                    if (isService) {
+                        uptimeView.setText(context.getResources().getText(
+                                R.string.service_restarting));
+                    } else {
+                        uptimeView.setText("");
+                    }
+                }
+            }
+        }
+    }
+    
+    public static class ViewHolder {
+        public View rootView;
+        public ImageView icon;
+        public TextView name;
+        public TextView description;
+        public TextView size;
+        public TextView uptime;
+        
+        public ViewHolder(View v) {
+            rootView = v;
+            icon = (ImageView)v.findViewById(R.id.icon);
+            name = (TextView)v.findViewById(R.id.name);
+            description = (TextView)v.findViewById(R.id.description);
+            size = (TextView)v.findViewById(R.id.size);
+            uptime = (TextView)v.findViewById(R.id.uptime);
+            v.setTag(this);
+        }
+        
+        public ActiveItem bind(RunningState state, RunningState.BaseItem item,
+                StringBuilder builder) {
+            synchronized (state.mLock) {
+                name.setText(item.mDisplayLabel);
+                ActiveItem ai = new ActiveItem();
+                ai.mRootView = rootView;
+                ai.mItem = item;
+                ai.mHolder = this;
+                ai.mFirstRunTime = item.mActiveSince;
+                description.setText(item.mDescription);
+                item.mCurSizeStr = null;
+                icon.setImageDrawable(item.mPackageInfo.loadIcon(
+                        rootView.getContext().getPackageManager()));
+                icon.setVisibility(View.VISIBLE);
+                ai.updateTime(rootView.getContext(), builder);
+                return ai;
+            }
+        }
+    }
+    
+    static class TimeTicker extends TextView {
+        public TimeTicker(Context context, AttributeSet attrs) {
+            super(context, attrs);
+        }
+    }
+    
+    class ServiceListAdapter extends BaseAdapter {
+        final RunningState mState;
+        final LayoutInflater mInflater;
+        ArrayList<RunningState.MergedItem> mItems;
+        
+        ServiceListAdapter(RunningState state) {
+            mState = state;
+            mInflater = (LayoutInflater)getContext().getSystemService(
+                    Context.LAYOUT_INFLATER_SERVICE);
+            refreshItems();
+        }
+
+        void refreshItems() {
+            ArrayList<RunningState.MergedItem> newItems = mState.getCurrentMergedItems();
+            if (mItems != newItems) {
+                mItems = newItems;
+            }
+            if (mItems == null) {
+                mItems = new ArrayList<RunningState.MergedItem>();
+            }
+        }
+        
+        public boolean hasStableIds() {
+            return true;
+        }
+        
+        public int getCount() {
+            return mItems.size();
+        }
+
+        @Override
+        public boolean isEmpty() {
+            return mState.hasData() && mItems.size() == 0;
+        }
+
+        public Object getItem(int position) {
+            return mItems.get(position);
+        }
+
+        public long getItemId(int position) {
+            return mItems.get(position).hashCode();
+        }
+
+        public boolean areAllItemsEnabled() {
+            return false;
+        }
+
+        public boolean isEnabled(int position) {
+            return !mItems.get(position).mIsProcess;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            View v;
+            if (convertView == null) {
+                v = newView(parent);
+            } else {
+                v = convertView;
+            }
+            bindView(v, position);
+            return v;
+        }
+        
+        public View newView(ViewGroup parent) {
+            View v = mInflater.inflate(R.layout.running_processes_item, parent, false);
+            new ViewHolder(v);
+            return v;
+        }
+        
+        public void bindView(View view, int position) {
+            synchronized (mState.mLock) {
+                if (position >= mItems.size()) {
+                    // List must have changed since we last reported its
+                    // size...  ignore here, we will be doing a data changed
+                    // to refresh the entire list.
+                    return;
+                }
+                ViewHolder vh = (ViewHolder) view.getTag();
+                RunningState.MergedItem item = mItems.get(position);
+                ActiveItem ai = vh.bind(mState, item, mBuilder);
+                mActiveItems.put(view, ai);
+            }
+        }
+    }
+    
+    public static class LinearColorBar extends LinearLayout {
+        private float mRedRatio;
+        private float mYellowRatio;
+        private float mGreenRatio;
+        
+        final Rect mRect = new Rect();
+        final Paint mPaint = new Paint();
+        
+        public LinearColorBar(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            setWillNotDraw(false);
+            mPaint.setStyle(Paint.Style.FILL);
+        }
+
+        public void setRatios(float red, float yellow, float green) {
+            mRedRatio = red;
+            mYellowRatio = yellow;
+            mGreenRatio = green;
+            invalidate();
+        }
+        
+        @Override
+        protected void onDraw(Canvas canvas) {
+            super.onDraw(canvas);
+            
+            int width = getWidth();
+            mRect.top = 0;
+            mRect.bottom = getHeight();
+            
+            int left = 0;
+            
+            int right = left + (int)(width*mRedRatio);
+            if (left < right) {
+                mRect.left = left;
+                mRect.right = right;
+                mPaint.setColor(0xffff8080);
+                canvas.drawRect(mRect, mPaint);
+                width -= (right-left);
+                left = right;
+            }
+            
+            right = left + (int)(width*mYellowRatio);
+            if (left < right) {
+                mRect.left = left;
+                mRect.right = right;
+                mPaint.setColor(0xffffff00);
+                canvas.drawRect(mRect, mPaint);
+                width -= (right-left);
+                left = right;
+            }
+            
+            right = left + width;
+            if (left < right) {
+                mRect.left = left;
+                mRect.right = right;
+                mPaint.setColor(0xff80ff80);
+                canvas.drawRect(mRect, mPaint);
+            }
+        }
+    }
+    
+    private boolean matchText(byte[] buffer, int index, String text) {
+        int N = text.length();
+        if ((index+N) >= buffer.length) {
+            return false;
+        }
+        for (int i=0; i<N; i++) {
+            if (buffer[index+i] != text.charAt(i)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    
+    private long extractMemValue(byte[] buffer, int index) {
+        while (index < buffer.length && buffer[index] != '\n') {
+            if (buffer[index] >= '0' && buffer[index] <= '9') {
+                int start = index;
+                index++;
+                while (index < buffer.length && buffer[index] >= '0'
+                    && buffer[index] <= '9') {
+                    index++;
+                }
+                String str = new String(buffer, 0, start, index-start);
+                return ((long)Integer.parseInt(str)) * 1024;
+            }
+            index++;
+        }
+        return 0;
+    }
+    
+    private long readAvailMem() {
+        try {
+            long memFree = 0;
+            long memCached = 0;
+            FileInputStream is = new FileInputStream("/proc/meminfo");
+            int len = is.read(mBuffer);
+            is.close();
+            final int BUFLEN = mBuffer.length;
+            for (int i=0; i<len && (memFree == 0 || memCached == 0); i++) {
+                if (matchText(mBuffer, i, "MemFree")) {
+                    i += 7;
+                    memFree = extractMemValue(mBuffer, i);
+                } else if (matchText(mBuffer, i, "Cached")) {
+                    i += 6;
+                    memCached = extractMemValue(mBuffer, i);
+                }
+                while (i < BUFLEN && mBuffer[i] != '\n') {
+                    i++;
+                }
+            }
+            return memFree + memCached;
+        } catch (java.io.FileNotFoundException e) {
+        } catch (java.io.IOException e) {
+        }
+        return 0;
+    }
+
+    
+    void refreshUi(boolean dataChanged) {
+        if (dataChanged) {
+            ServiceListAdapter adapter = (ServiceListAdapter)(mListView.getAdapter());
+            adapter.refreshItems();
+            adapter.notifyDataSetChanged();
+        }
+        
+        if (mDataAvail != null) {
+            mDataAvail.run();
+            mDataAvail = null;
+        }
+
+        // This is the amount of available memory until we start killing
+        // background services.
+        long availMem = readAvailMem() - SECONDARY_SERVER_MEM;
+        if (availMem < 0) {
+            availMem = 0;
+        }
+        
+        synchronized (mState.mLock) {
+            if (mLastNumBackgroundProcesses != mState.mNumBackgroundProcesses
+                    || mLastBackgroundProcessMemory != mState.mBackgroundProcessMemory
+                    || mLastAvailMemory != availMem) {
+                mLastNumBackgroundProcesses = mState.mNumBackgroundProcesses;
+                mLastBackgroundProcessMemory = mState.mBackgroundProcessMemory;
+                mLastAvailMemory = availMem;
+                String sizeStr = Formatter.formatShortFileSize(getContext(),
+                        mLastAvailMemory + mLastBackgroundProcessMemory);
+                mBackgroundProcessText.setText(getResources().getString(
+                        R.string.service_background_processes, sizeStr));
+            }
+            if (mLastNumForegroundProcesses != mState.mNumForegroundProcesses
+                    || mLastForegroundProcessMemory != mState.mForegroundProcessMemory
+                    || mLastNumServiceProcesses != mState.mNumServiceProcesses
+                    || mLastServiceProcessMemory != mState.mServiceProcessMemory) {
+                mLastNumForegroundProcesses = mState.mNumForegroundProcesses;
+                mLastForegroundProcessMemory = mState.mForegroundProcessMemory;
+                mLastNumServiceProcesses = mState.mNumServiceProcesses;
+                mLastServiceProcessMemory = mState.mServiceProcessMemory;
+                String sizeStr = Formatter.formatShortFileSize(getContext(),
+                        mLastForegroundProcessMemory + mLastServiceProcessMemory);
+                mForegroundProcessText.setText(getResources().getString(
+                        R.string.service_foreground_processes, sizeStr));
+            }
+            
+            float totalMem = availMem + mLastBackgroundProcessMemory
+                    + mLastForegroundProcessMemory + mLastServiceProcessMemory;
+            mColorBar.setRatios(mLastForegroundProcessMemory/totalMem,
+                    mLastServiceProcessMemory/totalMem,
+                    (availMem+mLastBackgroundProcessMemory)/totalMem);
+        }
+    }
+    
+    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+        ListView l = (ListView)parent;
+        RunningState.MergedItem mi = (RunningState.MergedItem)l.getAdapter().getItem(position);
+        mCurSelected = mi;
+        Intent intent = new Intent();
+        intent.putExtra(RunningServiceDetails.KEY_UID, mi.mProcess.mUid);
+        intent.putExtra(RunningServiceDetails.KEY_PROCESS, mi.mProcess.mProcessName);
+        intent.setClass(getContext(), RunningServiceDetails.class);
+        getContext().startActivity(intent);
+    }
+
+    public void onMovedToScrapHeap(View view) {
+        mActiveItems.remove(view);
+    }
+
+    public RunningProcessesView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+    
+    public void doCreate(Bundle savedInstanceState, Object nonConfigurationInstace) {
+        mAm = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE);
+        mState = RunningState.getInstance(getContext());
+        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(
+                Context.LAYOUT_INFLATER_SERVICE);
+        inflater.inflate(R.layout.running_processes_view, this);
+        mListView = (ListView)findViewById(android.R.id.list);
+        View emptyView = findViewById(com.android.internal.R.id.empty);
+        if (emptyView != null) {
+            mListView.setEmptyView(emptyView);
+        }
+        mListView.setOnItemClickListener(this);
+        mListView.setRecyclerListener(this);
+        mListView.setAdapter(new ServiceListAdapter(mState));
+        mColorBar = (LinearColorBar)findViewById(R.id.color_bar);
+        mBackgroundProcessText = (TextView)findViewById(R.id.backgroundText);
+        mForegroundProcessText = (TextView)findViewById(R.id.foregroundText);
+        
+        // Magic!  Implementation detail!  Don't count on this!
+        SECONDARY_SERVER_MEM =
+            Integer.valueOf(SystemProperties.get("ro.SECONDARY_SERVER_MEM"))*PAGE_SIZE;
+    }
+    
+    public void doPause() {
+        mState.pause();
+        mDataAvail = null;
+    }
+
+    public boolean doResume(Runnable dataAvail) {
+        mState.resume(this);
+        if (mState.hasData()) {
+            // If the state already has its data, then let's populate our
+            // list right now to avoid flicker.
+            refreshUi(true);
+            return true;
+        }
+        mDataAvail = dataAvail;
+        return false;
+    }
+
+    public Object doRetainNonConfigurationInstance() {
+        return null;
+    }
+
+    void updateTimes() {
+        Iterator<ActiveItem> it = mActiveItems.values().iterator();
+        while (it.hasNext()) {
+            ActiveItem ai = it.next();
+            if (ai.mRootView.getWindowToken() == null) {
+                // Clean out any dead views, just in case.
+                it.remove();
+                continue;
+            }
+            ai.updateTime(getContext(), mBuilder);
+        }
+    }
+
+    @Override
+    public void onRefreshUi(int what) {
+        switch (what) {
+            case REFRESH_TIME:
+                updateTimes();
+                break;
+            case REFRESH_DATA:
+                refreshUi(false);
+                updateTimes();
+                break;
+            case REFRESH_STRUCTURE:
+                refreshUi(true);
+                updateTimes();
+                break;
+        }
+    }
+}
diff --git a/src/com/android/settings/applications/RunningServiceDetails.java b/src/com/android/settings/applications/RunningServiceDetails.java
new file mode 100644
index 0000000..b8dd10e
--- /dev/null
+++ b/src/com/android/settings/applications/RunningServiceDetails.java
@@ -0,0 +1,455 @@
+package com.android.settings.applications;
+
+import com.android.settings.R;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ApplicationErrorReport;
+import android.app.PendingIntent;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+import android.os.SystemClock;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class RunningServiceDetails extends Activity
+        implements RunningState.OnRefreshUiListener {
+    static final String TAG = "RunningServicesDetails";
+    
+    static final String KEY_UID = "uid";
+    static final String KEY_PROCESS = "process";
+    
+    ActivityManager mAm;
+    LayoutInflater mInflater;
+    
+    RunningState mState;
+    
+    int mUid;
+    String mProcessName;
+    
+    RunningState.MergedItem mMergedItem;
+    
+    ViewGroup mAllDetails;
+    ViewGroup mSnippet;
+    RunningProcessesView.ActiveItem mSnippetActiveItem;
+    RunningProcessesView.ViewHolder mSnippetViewHolder;
+    
+    int mNumServices, mNumProcesses;
+    
+    TextView mServicesHeader;
+    TextView mProcessesHeader;
+    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
+    
+    class ActiveDetail implements View.OnClickListener {
+        View mRootView;
+        Button mStopButton;
+        Button mReportButton;
+        RunningState.ServiceItem mServiceItem;
+        RunningProcessesView.ActiveItem mActiveItem;
+        RunningProcessesView.ViewHolder mViewHolder;
+        PendingIntent mManageIntent;
+        ComponentName mInstaller;
+
+        public void onClick(View v) {
+            if (v == mReportButton) {
+                ApplicationErrorReport report = new ApplicationErrorReport();
+                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
+                report.packageName = mServiceItem.mServiceInfo.packageName;
+                report.installerPackageName = mInstaller.getPackageName();
+                report.processName = mServiceItem.mRunningService.process;
+                report.time = System.currentTimeMillis();
+                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
+                        & ApplicationInfo.FLAG_SYSTEM) != 0;
+                ApplicationErrorReport.RunningServiceInfo info
+                        = new ApplicationErrorReport.RunningServiceInfo();
+                if (mActiveItem.mFirstRunTime >= 0) {
+                    info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime;
+                } else {
+                    info.durationMillis = -1;
+                }
+                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
+                        mServiceItem.mServiceInfo.name);
+                File filename = getFileStreamPath("service_dump.txt");
+                FileOutputStream output = null;
+                try {
+                    output = new FileOutputStream(filename);
+                    Debug.dumpService("activity", output.getFD(),
+                            new String[] { "-a", "service", comp.flattenToString() });
+                } catch (IOException e) {
+                    Log.w(TAG, "Can't dump service: " + comp, e);
+                } finally {
+                    if (output != null) try { output.close(); } catch (IOException e) {}
+                }
+                FileInputStream input = null;
+                try {
+                    input = new FileInputStream(filename);
+                    byte[] buffer = new byte[(int) filename.length()];
+                    input.read(buffer);
+                    info.serviceDetails = new String(buffer);
+                } catch (IOException e) {
+                    Log.w(TAG, "Can't read service dump: " + comp, e);
+                } finally {
+                    if (input != null) try { input.close(); } catch (IOException e) {}
+                }
+                filename.delete();
+                Log.i(TAG, "Details: " + info.serviceDetails);
+                report.runningServiceInfo = info;
+                Intent result = new Intent(Intent.ACTION_APP_ERROR);
+                result.setComponent(mInstaller);
+                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
+                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                startActivity(result);
+                return;
+            }
+
+            if (mManageIntent != null) {
+                try {
+                    startIntentSender(mManageIntent.getIntentSender(), null,
+                            Intent.FLAG_ACTIVITY_NEW_TASK
+                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
+                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
+                } catch (IntentSender.SendIntentException e) {
+                    Log.w(TAG, e);
+                } catch (IllegalArgumentException e) {
+                    Log.w(TAG, e);
+                } catch (ActivityNotFoundException e) {
+                    Log.w(TAG, e);
+                }
+            } else if (mActiveItem.mItem instanceof RunningState.ServiceItem) {
+                RunningState.ServiceItem si = (RunningState.ServiceItem)mActiveItem.mItem;
+                stopService(new Intent().setComponent(si.mRunningService.service));
+                if (mMergedItem == null || mMergedItem.mServices.size() <= 1) {
+                    // If there was only one service, we are finishing it,
+                    // so no reason for the UI to stick around.
+                    finish();
+                } else {
+                    mState.updateNow();
+                }
+            } else {
+                // Heavy-weight process.  We'll do a force-stop on it.
+                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
+                finish();
+            }
+        }
+    }
+    
+    StringBuilder mBuilder = new StringBuilder(128);
+    
+    boolean findMergedItem() {
+        RunningState.MergedItem item = null;
+        ArrayList<RunningState.MergedItem> newItems = mState.getCurrentMergedItems();
+        if (newItems != null) {
+            for (int i=0; i<newItems.size(); i++) {
+                RunningState.MergedItem mi = newItems.get(i);
+                if (mi.mProcess.mUid == mUid
+                        && mi.mProcess.mProcessName.equals(mProcessName)) {
+                    item = mi;
+                    break;
+                }
+            }
+        }
+        if (mMergedItem != item) {
+            mMergedItem = item;
+            return true;
+        }
+        return false;
+    }
+    
+    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) {
+        if (mNumServices == 0) {
+            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
+                    mAllDetails, false);
+            mServicesHeader.setText(R.string.runningservicedetails_services_title);
+            mAllDetails.addView(mServicesHeader);
+        }
+        mNumServices++;
+        
+        RunningState.BaseItem bi = si != null ? si : mi;
+        
+        ActiveDetail detail = new ActiveDetail();
+        View root = mInflater.inflate(R.layout.running_service_details_service,
+                mAllDetails, false);
+        mAllDetails.addView(root);
+        detail.mRootView = root;
+        detail.mServiceItem = si;
+        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
+        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
+        
+        if (si != null && si.mRunningService.clientLabel != 0) {
+            detail.mManageIntent = mAm.getRunningServiceControlPanel(
+                    si.mRunningService.service);
+        }
+        
+        TextView description = (TextView)root.findViewById(R.id.comp_description);
+        if (si != null && si.mServiceInfo.descriptionRes != 0) {
+            description.setText(getPackageManager().getText(
+                    si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
+                    si.mServiceInfo.applicationInfo));
+        } else {
+            if (detail.mManageIntent != null) {
+                try {
+                    Resources clientr = getPackageManager().getResourcesForApplication(
+                            si.mRunningService.clientPackage);
+                    String label = clientr.getString(si.mRunningService.clientLabel);
+                    description.setText(getString(R.string.service_manage_description,
+                            label));
+                } catch (PackageManager.NameNotFoundException e) {
+                }
+            } else {
+                description.setText(getText(si != null
+                        ? R.string.service_stop_description
+                        : R.string.heavy_weight_stop_description));
+            }
+        }
+        
+        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
+        detail.mStopButton.setOnClickListener(detail);
+        detail.mStopButton.setText(getText(detail.mManageIntent != null
+                ? R.string.service_manage : R.string.service_stop));
+
+        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
+        detail.mReportButton.setOnClickListener(detail);
+        detail.mReportButton.setText(com.android.internal.R.string.report);
+        // check if error reporting is enabled in secure settings
+        int enabled = Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
+        if (enabled != 0) {
+            detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
+                    this, si.mServiceInfo.packageName, si.mServiceInfo.applicationInfo.flags);
+            detail.mReportButton.setEnabled(detail.mInstaller != null);
+        } else {
+            detail.mReportButton.setEnabled(false);
+        }
+        
+        mActiveDetails.add(detail);
+    }
+    
+    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
+        if (mNumProcesses == 0) {
+            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
+                    mAllDetails, false);
+            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
+            mAllDetails.addView(mProcessesHeader);
+        }
+        mNumProcesses++;
+        
+        ActiveDetail detail = new ActiveDetail();
+        View root = mInflater.inflate(R.layout.running_service_details_process,
+                mAllDetails, false);
+        mAllDetails.addView(root);
+        detail.mRootView = root;
+        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
+        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
+        
+        TextView description = (TextView)root.findViewById(R.id.comp_description);
+        if (isMain) {
+            description.setText(R.string.main_running_process_description);
+        } else {
+            int textid = 0;
+            CharSequence label = null;
+            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
+            final ComponentName comp = rpi.importanceReasonComponent;
+            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
+            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
+            switch (rpi.importanceReasonCode) {
+                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
+                    textid = R.string.process_provider_in_use_description;
+                    if (rpi.importanceReasonComponent != null) {
+                        try {
+                            ProviderInfo prov = getPackageManager().getProviderInfo(
+                                    rpi.importanceReasonComponent, 0);
+                            label = RunningState.makeLabel(getPackageManager(),
+                                    prov.name, prov);
+                        } catch (NameNotFoundException e) {
+                        }
+                    }
+                    break;
+                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
+                    textid = R.string.process_service_in_use_description;
+                    if (rpi.importanceReasonComponent != null) {
+                        try {
+                            ServiceInfo serv = getPackageManager().getServiceInfo(
+                                    rpi.importanceReasonComponent, 0);
+                            label = RunningState.makeLabel(getPackageManager(),
+                                    serv.name, serv);
+                        } catch (NameNotFoundException e) {
+                        }
+                    }
+                    break;
+            }
+            if (textid != 0 && label != null) {
+                description.setText(getString(textid, label));
+            }
+        }
+        
+        mActiveDetails.add(detail);
+    }
+    
+    void addDetailViews() {
+        for (int i=mActiveDetails.size()-1; i>=0; i--) {
+            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
+        }
+        mActiveDetails.clear();
+        
+        if (mServicesHeader != null) {
+            mAllDetails.removeView(mServicesHeader);
+            mServicesHeader = null;
+        }
+        
+        if (mProcessesHeader != null) {
+            mAllDetails.removeView(mProcessesHeader);
+            mProcessesHeader = null;
+        }
+        
+        mNumServices = mNumProcesses = 0;
+        
+        if (mMergedItem != null) {
+            for (int i=0; i<mMergedItem.mServices.size(); i++) {
+                addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem);
+            }
+            
+            if (mMergedItem.mServices.size() <= 0) {
+                // This item does not have any services, so it must be
+                // a heavy-weight process...  we will put a fake service
+                // entry for it, to allow the user to "stop" it.
+                addServiceDetailsView(null, mMergedItem);
+            }
+            
+            for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) {
+                RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess
+                        : mMergedItem.mOtherProcesses.get(i);
+                if (pi.mPid <= 0) {
+                    continue;
+                }
+                
+                addProcessDetailsView(pi, i < 0);
+            }
+        }
+    }
+    
+    void refreshUi(boolean dataChanged) {
+        if (findMergedItem()) {
+            dataChanged = true;
+        }
+        if (dataChanged) {
+            if (mMergedItem != null) {
+                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
+                        mMergedItem, mBuilder);
+            } else if (mSnippetActiveItem != null) {
+                // Clear whatever is currently being shown.
+                mSnippetActiveItem.mHolder.size.setText("");
+                mSnippetActiveItem.mHolder.uptime.setText("");
+                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
+            } else {
+                // No merged item, never had one.  Nothing to do.
+                finish();
+                return;
+            }
+            addDetailViews();
+        }
+    }
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        
+        mUid = getIntent().getIntExtra(KEY_UID, 0);
+        mProcessName = getIntent().getStringExtra(KEY_PROCESS);
+        
+        mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
+        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        
+        mState = RunningState.getInstance(this);
+        
+        setContentView(R.layout.running_service_details);
+        
+        mAllDetails = (ViewGroup)findViewById(R.id.all_details);
+        mSnippet = (ViewGroup)findViewById(R.id.snippet);
+        mSnippet.setBackgroundResource(com.android.internal.R.drawable.title_bar_medium);
+        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
+        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mState.pause();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mState.resume(this);
+
+        // We want to go away if the service being shown no longer exists,
+        // so we need to ensure we have done the initial data retrieval before
+        // showing our ui.
+        mState.waitForData();
+
+        // And since we know we have the data, let's show the UI right away
+        // to avoid flicker.
+        refreshUi(true);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+    }
+
+    void updateTimes() {
+        if (mSnippetActiveItem != null) {
+            mSnippetActiveItem.updateTime(RunningServiceDetails.this, mBuilder);
+        }
+        for (int i=0; i<mActiveDetails.size(); i++) {
+            mActiveDetails.get(i).mActiveItem.updateTime(
+                    RunningServiceDetails.this, mBuilder);
+        }
+    }
+
+    @Override
+    public void onRefreshUi(int what) {
+        switch (what) {
+            case REFRESH_TIME:
+                updateTimes();
+                break;
+            case REFRESH_DATA:
+                refreshUi(false);
+                updateTimes();
+                break;
+            case REFRESH_STRUCTURE:
+                refreshUi(true);
+                updateTimes();
+                break;
+        }
+    }
+}
diff --git a/src/com/android/settings/applications/RunningState.java b/src/com/android/settings/applications/RunningState.java
new file mode 100644
index 0000000..6d08c57
--- /dev/null
+++ b/src/com/android/settings/applications/RunningState.java
@@ -0,0 +1,958 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import com.android.settings.R;
+
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.os.Debug;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.text.format.Formatter;
+import android.util.Log;
+import android.util.SparseArray;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Singleton for retrieving and monitoring the state about all running
+ * applications/processes/services.
+ */
+public class RunningState {
+    static Object sGlobalLock = new Object();
+    static RunningState sInstance;
+
+    static final int MSG_UPDATE_CONTENTS = 1;
+    static final int MSG_REFRESH_UI = 2;
+    static final int MSG_UPDATE_TIME = 3;
+
+    static final long TIME_UPDATE_DELAY = 1000;
+    static final long CONTENTS_UPDATE_DELAY = 2000;
+
+    static final int MAX_SERVICES = 100;
+
+    final Context mApplicationContext;
+    final ActivityManager mAm;
+    final PackageManager mPm;
+
+    OnRefreshUiListener mRefreshUiListener;
+
+    // Processes that are hosting a service we are interested in, organized
+    // by uid and name.  Note that this mapping does not change even across
+    // service restarts, and during a restart there will still be a process
+    // entry.
+    final SparseArray<HashMap<String, ProcessItem>> mServiceProcessesByName
+            = new SparseArray<HashMap<String, ProcessItem>>();
+    
+    // Processes that are hosting a service we are interested in, organized
+    // by their pid.  These disappear and re-appear as services are restarted.
+    final SparseArray<ProcessItem> mServiceProcessesByPid
+            = new SparseArray<ProcessItem>();
+    
+    // Used to sort the interesting processes.
+    final ServiceProcessComparator mServiceProcessComparator
+            = new ServiceProcessComparator();
+    
+    // Additional heavy-weight processes to be shown to the user, even if
+    // there is no service running in them.
+    final ArrayList<ProcessItem> mHeavyProcesses = new ArrayList<ProcessItem>();
+    
+    // All currently running processes, for finding dependencies etc.
+    final SparseArray<ProcessItem> mRunningProcesses
+            = new SparseArray<ProcessItem>();
+    
+    // The processes associated with services, in sorted order.
+    final ArrayList<ProcessItem> mProcessItems = new ArrayList<ProcessItem>();
+    
+    // All processes, used for retrieving memory information.
+    final ArrayList<ProcessItem> mAllProcessItems = new ArrayList<ProcessItem>();
+    
+    int mSequence = 0;
+    
+    // ----- following protected by mLock -----
+    
+    // Lock for protecting the state that will be shared between the
+    // background update thread and the UI thread.
+    final Object mLock = new Object();
+    
+    boolean mResumed;
+    boolean mHaveData;
+
+    ArrayList<BaseItem> mItems = new ArrayList<BaseItem>();
+    ArrayList<MergedItem> mMergedItems = new ArrayList<MergedItem>();
+    
+    int mNumBackgroundProcesses;
+    long mBackgroundProcessMemory;
+    int mNumForegroundProcesses;
+    long mForegroundProcessMemory;
+    int mNumServiceProcesses;
+    long mServiceProcessMemory;
+
+    // ----- BACKGROUND MONITORING THREAD -----
+
+    final HandlerThread mBackgroundThread;
+    final class BackgroundHandler extends Handler {
+        public BackgroundHandler(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_UPDATE_CONTENTS:
+                    synchronized (mLock) {
+                        if (!mResumed) {
+                            return;
+                        }
+                    }
+                    Message cmd = mHandler.obtainMessage(MSG_REFRESH_UI);
+                    cmd.arg1 = update(mApplicationContext, mAm) ? 1 : 0;
+                    mHandler.sendMessage(cmd);
+                    removeMessages(MSG_UPDATE_CONTENTS);
+                    msg = obtainMessage(MSG_UPDATE_CONTENTS);
+                    sendMessageDelayed(msg, CONTENTS_UPDATE_DELAY);
+                    break;
+            }
+        }
+    };
+
+    final BackgroundHandler mBackgroundHandler;
+
+    final Handler mHandler = new Handler() {
+        int mNextUpdate = OnRefreshUiListener.REFRESH_TIME;
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_REFRESH_UI:
+                    mNextUpdate = msg.arg1 != 0
+                            ? OnRefreshUiListener.REFRESH_STRUCTURE
+                            : OnRefreshUiListener.REFRESH_DATA;
+                    break;
+                case MSG_UPDATE_TIME:
+                    synchronized (mLock) {
+                        if (!mResumed) {
+                            return;
+                        }
+                    }
+                    removeMessages(MSG_UPDATE_TIME);
+                    Message m = obtainMessage(MSG_UPDATE_TIME);
+                    sendMessageDelayed(m, TIME_UPDATE_DELAY);
+
+                    if (mRefreshUiListener != null) {
+                        //Log.i("foo", "Refresh UI: " + mNextUpdate
+                        //        + " @ " + SystemClock.uptimeMillis());
+                        mRefreshUiListener.onRefreshUi(mNextUpdate);
+                        mNextUpdate = OnRefreshUiListener.REFRESH_TIME;
+                    }
+                    break;
+            }
+        }
+    };
+
+    // ----- DATA STRUCTURES -----
+
+    static interface OnRefreshUiListener {
+        public static final int REFRESH_TIME = 0;
+        public static final int REFRESH_DATA = 1;
+        public static final int REFRESH_STRUCTURE = 2;
+
+        public void onRefreshUi(int what);
+    }
+
+    static class BaseItem {
+        final boolean mIsProcess;
+        
+        PackageItemInfo mPackageInfo;
+        CharSequence mDisplayLabel;
+        String mLabel;
+        String mDescription;
+        
+        int mCurSeq;
+        
+        long mActiveSince;
+        long mSize;
+        String mSizeStr;
+        String mCurSizeStr;
+        boolean mNeedDivider;
+        
+        public BaseItem(boolean isProcess) {
+            mIsProcess = isProcess;
+        }
+    }
+
+    static class ServiceItem extends BaseItem {
+        ActivityManager.RunningServiceInfo mRunningService;
+        ServiceInfo mServiceInfo;
+        boolean mShownAsStarted;
+        
+        MergedItem mMergedItem;
+        
+        public ServiceItem() {
+            super(false);
+        }
+    }
+
+    static class ProcessItem extends BaseItem {
+        final HashMap<ComponentName, ServiceItem> mServices
+                = new HashMap<ComponentName, ServiceItem>();
+        final SparseArray<ProcessItem> mDependentProcesses
+                = new SparseArray<ProcessItem>();
+        
+        final int mUid;
+        final String mProcessName;
+        int mPid;
+        
+        ProcessItem mClient;
+        int mLastNumDependentProcesses;
+        
+        int mRunningSeq;
+        ActivityManager.RunningAppProcessInfo mRunningProcessInfo;
+        
+        MergedItem mMergedItem;
+        
+        // Purely for sorting.
+        boolean mIsSystem;
+        boolean mIsStarted;
+        long mActiveSince;
+        
+        public ProcessItem(Context context, int uid, String processName) {
+            super(true);
+            mDescription = context.getResources().getString(
+                    R.string.service_process_name, processName);
+            mUid = uid;
+            mProcessName = processName;
+        }
+        
+        void ensureLabel(PackageManager pm) {
+            if (mLabel != null) {
+                return;
+            }
+            
+            try {
+                ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0);
+                if (ai.uid == mUid) {
+                    mDisplayLabel = ai.loadLabel(pm);
+                    mLabel = mDisplayLabel.toString();
+                    mPackageInfo = ai;
+                    return;
+                }
+            } catch (PackageManager.NameNotFoundException e) {
+            }
+            
+            // If we couldn't get information about the overall
+            // process, try to find something about the uid.
+            String[] pkgs = pm.getPackagesForUid(mUid);
+            
+            // If there is one package with this uid, that is what we want.
+            if (pkgs.length == 1) {
+                try {
+                    ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+                    mDisplayLabel = ai.loadLabel(pm);
+                    mLabel = mDisplayLabel.toString();
+                    mPackageInfo = ai;
+                    return;
+                } catch (PackageManager.NameNotFoundException e) {
+                }
+            }
+            
+            // If there are multiple, see if one gives us the official name
+            // for this uid.
+            for (String name : pkgs) {
+                try {
+                    PackageInfo pi = pm.getPackageInfo(name, 0);
+                    if (pi.sharedUserLabel != 0) {
+                        CharSequence nm = pm.getText(name,
+                                pi.sharedUserLabel, pi.applicationInfo);
+                        if (nm != null) {
+                            mDisplayLabel = nm;
+                            mLabel = nm.toString();
+                            mPackageInfo = pi.applicationInfo;
+                            return;
+                        }
+                    }
+                } catch (PackageManager.NameNotFoundException e) {
+                }
+            }
+            
+            // If still don't have anything to display, just use the
+            // service info.
+            if (mServices.size() > 0) {
+                mPackageInfo = mServices.values().iterator().next()
+                        .mServiceInfo.applicationInfo;
+                mDisplayLabel = mPackageInfo.loadLabel(pm);
+                mLabel = mDisplayLabel.toString();
+                return;
+            }
+            
+            // Finally... whatever, just pick the first package's name.
+            try {
+                ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+                mDisplayLabel = ai.loadLabel(pm);
+                mLabel = mDisplayLabel.toString();
+                mPackageInfo = ai;
+                return;
+            } catch (PackageManager.NameNotFoundException e) {
+            }
+        }
+        
+        boolean updateService(Context context,
+                ActivityManager.RunningServiceInfo service) {
+            final PackageManager pm = context.getPackageManager();
+            
+            boolean changed = false;
+            ServiceItem si = mServices.get(service.service);
+            if (si == null) {
+                changed = true;
+                si = new ServiceItem();
+                si.mRunningService = service;
+                try {
+                    si.mServiceInfo = pm.getServiceInfo(service.service, 0);
+                } catch (PackageManager.NameNotFoundException e) {
+                }
+                si.mDisplayLabel = makeLabel(pm,
+                        si.mRunningService.service.getClassName(), si.mServiceInfo);
+                mLabel = mDisplayLabel != null ? mDisplayLabel.toString() : null;
+                si.mPackageInfo = si.mServiceInfo.applicationInfo;
+                mServices.put(service.service, si);
+            }
+            si.mCurSeq = mCurSeq;
+            si.mRunningService = service;
+            long activeSince = service.restarting == 0 ? service.activeSince : -1;
+            if (si.mActiveSince != activeSince) {
+                si.mActiveSince = activeSince;
+                changed = true;
+            }
+            if (service.clientPackage != null && service.clientLabel != 0) {
+                if (si.mShownAsStarted) {
+                    si.mShownAsStarted = false;
+                    changed = true;
+                }
+                try {
+                    Resources clientr = pm.getResourcesForApplication(service.clientPackage);
+                    String label = clientr.getString(service.clientLabel);
+                    si.mDescription = context.getResources().getString(
+                            R.string.service_client_name, label);
+                } catch (PackageManager.NameNotFoundException e) {
+                    si.mDescription = null;
+                }
+            } else {
+                if (!si.mShownAsStarted) {
+                    si.mShownAsStarted = true;
+                    changed = true;
+                }
+                si.mDescription = context.getResources().getString(
+                        R.string.service_started_by_app);
+            }
+            
+            return changed;
+        }
+        
+        boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) {
+            mSize = ((long)mem.getTotalPss()) * 1024;
+            if (mCurSeq == curSeq) {
+                String sizeStr = Formatter.formatShortFileSize(
+                        context, mSize);
+                if (!sizeStr.equals(mSizeStr)){
+                    mSizeStr = sizeStr;
+                    // We update this on the second tick where we update just
+                    // the text in the current items, so no need to say we
+                    // changed here.
+                    return false;
+                }
+            }
+            return false;
+        }
+        
+        boolean buildDependencyChain(Context context, PackageManager pm, int curSeq) {
+            final int NP = mDependentProcesses.size();
+            boolean changed = false;
+            for (int i=0; i<NP; i++) {
+                ProcessItem proc = mDependentProcesses.valueAt(i);
+                if (proc.mClient != this) {
+                    changed = true;
+                    proc.mClient = this;
+                }
+                proc.mCurSeq = curSeq;
+                proc.ensureLabel(pm);
+                changed |= proc.buildDependencyChain(context, pm, curSeq);
+            }
+            
+            if (mLastNumDependentProcesses != mDependentProcesses.size()) {
+                changed = true;
+                mLastNumDependentProcesses = mDependentProcesses.size();
+            }
+            
+            return changed;
+        }
+        
+        void addDependentProcesses(ArrayList<BaseItem> dest,
+                ArrayList<ProcessItem> destProc) {
+            final int NP = mDependentProcesses.size();
+            for (int i=0; i<NP; i++) {
+                ProcessItem proc = mDependentProcesses.valueAt(i);
+                proc.addDependentProcesses(dest, destProc);
+                dest.add(proc);
+                if (proc.mPid > 0) {
+                    destProc.add(proc);
+                }
+            }
+        }
+    }
+
+    static class MergedItem extends BaseItem {
+        ProcessItem mProcess;
+        final ArrayList<ProcessItem> mOtherProcesses = new ArrayList<ProcessItem>();
+        final ArrayList<ServiceItem> mServices = new ArrayList<ServiceItem>();
+        
+        MergedItem() {
+            super(false);
+        }
+        
+        boolean update(Context context) {
+            mPackageInfo = mProcess.mPackageInfo;
+            mDisplayLabel = mProcess.mDisplayLabel;
+            mLabel = mProcess.mLabel;
+            
+            int numProcesses = (mProcess.mPid > 0 ? 1 : 0) + mOtherProcesses.size();
+            int numServices = mServices.size();
+            int resid = R.string.running_processes_item_description_s_s;
+            if (numProcesses != 1) {
+                resid = numServices != 1
+                        ? R.string.running_processes_item_description_p_p
+                        : R.string.running_processes_item_description_p_s;
+            } else if (numServices != 1) {
+                resid = R.string.running_processes_item_description_s_p;
+            }
+            mDescription = context.getResources().getString(resid, numProcesses, numServices);
+            
+            mActiveSince = -1;
+            for (int i=0; i<mServices.size(); i++) {
+                ServiceItem si = mServices.get(i);
+                if (si.mActiveSince >= 0 && mActiveSince < si.mActiveSince) {
+                    mActiveSince = si.mActiveSince;
+                }
+            }
+            
+            return false;
+        }
+        
+        boolean updateSize(Context context) {
+            mSize = mProcess.mSize;
+            for (int i=0; i<mOtherProcesses.size(); i++) {
+                mSize += mOtherProcesses.get(i).mSize;
+            }
+            
+            String sizeStr = Formatter.formatShortFileSize(
+                    context, mSize);
+            if (!sizeStr.equals(mSizeStr)){
+                mSizeStr = sizeStr;
+                // We update this on the second tick where we update just
+                // the text in the current items, so no need to say we
+                // changed here.
+                return false;
+            }
+            return false;
+        }
+    }
+    
+    static class ServiceProcessComparator implements Comparator<ProcessItem> {
+        public int compare(ProcessItem object1, ProcessItem object2) {
+            if (object1.mIsStarted != object2.mIsStarted) {
+                // Non-started processes go last.
+                return object1.mIsStarted ? -1 : 1;
+            }
+            if (object1.mIsSystem != object2.mIsSystem) {
+                // System processes go below non-system.
+                return object1.mIsSystem ? 1 : -1;
+            }
+            if (object1.mActiveSince != object2.mActiveSince) {
+                // Remaining ones are sorted with the longest running
+                // services last.
+                return (object1.mActiveSince > object2.mActiveSince) ? -1 : 1;
+            }
+            return 0;
+        }
+    }
+    
+    static CharSequence makeLabel(PackageManager pm,
+            String className, PackageItemInfo item) {
+        if (item != null && (item.labelRes != 0
+                || item.nonLocalizedLabel != null)) {
+            CharSequence label = item.loadLabel(pm);
+            if (label != null) {
+                return label;
+            }
+        }
+        
+        String label = className;
+        int tail = label.lastIndexOf('.');
+        if (tail >= 0) {
+            label = label.substring(tail+1, label.length());
+        }
+        return label;
+    }
+    
+    static RunningState getInstance(Context context) {
+        synchronized (sGlobalLock) {
+            if (sInstance == null) {
+                sInstance = new RunningState(context);
+            }
+            return sInstance;
+        }
+    }
+
+    private RunningState(Context context) {
+        mApplicationContext = context.getApplicationContext();
+        mAm = (ActivityManager)mApplicationContext.getSystemService(Context.ACTIVITY_SERVICE);
+        mPm = mApplicationContext.getPackageManager();
+        mResumed = false;
+        mBackgroundThread = new HandlerThread("RunningState:Background");
+        mBackgroundThread.start();
+        mBackgroundHandler = new BackgroundHandler(mBackgroundThread.getLooper());
+    }
+
+    void resume(OnRefreshUiListener listener) {
+        synchronized (mLock) {
+            mResumed = true;
+            mRefreshUiListener = listener;
+            if (!mBackgroundHandler.hasMessages(MSG_UPDATE_CONTENTS)) {
+                mBackgroundHandler.sendEmptyMessage(MSG_UPDATE_CONTENTS);
+            }
+            mHandler.sendEmptyMessage(MSG_UPDATE_TIME);
+        }
+    }
+
+    void updateNow() {
+        synchronized (mLock) {
+            mBackgroundHandler.removeMessages(MSG_UPDATE_CONTENTS);
+            mBackgroundHandler.sendEmptyMessage(MSG_UPDATE_CONTENTS);
+        }
+    }
+
+    boolean hasData() {
+        synchronized (mLock) {
+            return mHaveData;
+        }
+    }
+
+    void waitForData() {
+        synchronized (mLock) {
+            while (!mHaveData) {
+                try {
+                    mLock.wait(0);
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+    }
+
+    void pause() {
+        synchronized (mLock) {
+            mResumed = false;
+            mRefreshUiListener = null;
+            mHandler.removeMessages(MSG_UPDATE_TIME);
+        }
+    }
+
+    private boolean update(Context context, ActivityManager am) {
+        final PackageManager pm = context.getPackageManager();
+        
+        mSequence++;
+        
+        boolean changed = false;
+        
+        List<ActivityManager.RunningServiceInfo> services 
+                = am.getRunningServices(MAX_SERVICES);
+        final int NS = services != null ? services.size() : 0;
+        for (int i=0; i<NS; i++) {
+            ActivityManager.RunningServiceInfo si = services.get(i);
+            // We are not interested in services that have not been started
+            // and don't have a known client, because
+            // there is nothing the user can do about them.
+            if (!si.started && si.clientLabel == 0) {
+                continue;
+            }
+            // We likewise don't care about services running in a
+            // persistent process like the system or phone.
+            if ((si.flags&ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS)
+                    != 0) {
+                continue;
+            }
+            
+            HashMap<String, ProcessItem> procs = mServiceProcessesByName.get(si.uid);
+            if (procs == null) {
+                procs = new HashMap<String, ProcessItem>();
+                mServiceProcessesByName.put(si.uid, procs);
+            }
+            ProcessItem proc = procs.get(si.process);
+            if (proc == null) {
+                changed = true;
+                proc = new ProcessItem(context, si.uid, si.process);
+                procs.put(si.process, proc);
+            }
+            
+            if (proc.mCurSeq != mSequence) {
+                int pid = si.restarting == 0 ? si.pid : 0;
+                if (pid != proc.mPid) {
+                    changed = true;
+                    if (proc.mPid != pid) {
+                        if (proc.mPid != 0) {
+                            mServiceProcessesByPid.remove(proc.mPid);
+                        }
+                        if (pid != 0) {
+                            mServiceProcessesByPid.put(pid, proc);
+                        }
+                        proc.mPid = pid;
+                    }
+                }
+                proc.mDependentProcesses.clear();
+                proc.mCurSeq = mSequence;
+            }
+            changed |= proc.updateService(context, si);
+        }
+        
+        // Now update the map of other processes that are running (but
+        // don't have services actively running inside them).
+        List<ActivityManager.RunningAppProcessInfo> processes
+                = am.getRunningAppProcesses();
+        final int NP = processes != null ? processes.size() : 0;
+        for (int i=0; i<NP; i++) {
+            ActivityManager.RunningAppProcessInfo pi = processes.get(i);
+            ProcessItem proc = mServiceProcessesByPid.get(pi.pid);
+            if (proc == null) {
+                // This process is not one that is a direct container
+                // of a service, so look for it in the secondary
+                // running list.
+                proc = mRunningProcesses.get(pi.pid);
+                if (proc == null) {
+                    changed = true;
+                    proc = new ProcessItem(context, pi.uid, pi.processName);
+                    proc.mPid = pi.pid;
+                    mRunningProcesses.put(pi.pid, proc);
+                }
+                proc.mDependentProcesses.clear();
+            }
+            
+            if ((pi.flags&ActivityManager.RunningAppProcessInfo.FLAG_CANT_SAVE_STATE) != 0) {
+                if (!mHeavyProcesses.contains(proc)) {
+                    changed = true;
+                    mHeavyProcesses.add(proc);
+                }
+                proc.mCurSeq = mSequence;
+                proc.ensureLabel(pm);
+            }
+            
+            proc.mRunningSeq = mSequence;
+            proc.mRunningProcessInfo = pi;
+        }
+        
+        // Build the chains from client processes to the process they are
+        // dependent on; also remove any old running processes.
+        int NRP = mRunningProcesses.size();
+        for (int i=0; i<NRP; i++) {
+            ProcessItem proc = mRunningProcesses.valueAt(i);
+            if (proc.mRunningSeq == mSequence) {
+                int clientPid = proc.mRunningProcessInfo.importanceReasonPid;
+                if (clientPid != 0) {
+                    ProcessItem client = mServiceProcessesByPid.get(clientPid);
+                    if (client == null) {
+                        client = mRunningProcesses.get(clientPid);
+                    }
+                    if (client != null) {
+                        client.mDependentProcesses.put(proc.mPid, proc);
+                    }
+                } else {
+                    // In this pass the process doesn't have a client.
+                    // Clear to make sure that, if it later gets the same one,
+                    // we will detect the change.
+                    proc.mClient = null;
+                }
+            } else {
+                changed = true;
+                mRunningProcesses.remove(mRunningProcesses.keyAt(i));
+            }
+        }
+        
+        // Remove any old heavy processes.
+        int NHP = mHeavyProcesses.size();
+        for (int i=0; i<NHP; i++) {
+            ProcessItem proc = mHeavyProcesses.get(i);
+            if (mRunningProcesses.get(proc.mPid) == null) {
+                changed = true;
+                mHeavyProcesses.remove(i);
+                i--;
+                NHP--;
+            }
+        }
+        
+        // Follow the tree from all primary service processes to all
+        // processes they are dependent on, marking these processes as
+        // still being active and determining if anything has changed.
+        final int NAP = mServiceProcessesByPid.size();
+        for (int i=0; i<NAP; i++) {
+            ProcessItem proc = mServiceProcessesByPid.valueAt(i);
+            if (proc.mCurSeq == mSequence) {
+                changed |= proc.buildDependencyChain(context, pm, mSequence);
+            }
+        }
+        
+        // Look for services and their primary processes that no longer exist...
+        for (int i=0; i<mServiceProcessesByName.size(); i++) {
+            HashMap<String, ProcessItem> procs = mServiceProcessesByName.valueAt(i);
+            Iterator<ProcessItem> pit = procs.values().iterator();
+            while (pit.hasNext()) {
+                ProcessItem pi = pit.next();
+                if (pi.mCurSeq == mSequence) {
+                    pi.ensureLabel(pm);
+                    if (pi.mPid == 0) {
+                        // Sanity: a non-process can't be dependent on
+                        // anything.
+                        pi.mDependentProcesses.clear();
+                    }
+                } else {
+                    changed = true;
+                    pit.remove();
+                    if (procs.size() == 0) {
+                        mServiceProcessesByName.remove(mServiceProcessesByName.keyAt(i));
+                    }
+                    if (pi.mPid != 0) {
+                        mServiceProcessesByPid.remove(pi.mPid);
+                    }
+                    continue;
+                }
+                Iterator<ServiceItem> sit = pi.mServices.values().iterator();
+                while (sit.hasNext()) {
+                    ServiceItem si = sit.next();
+                    if (si.mCurSeq != mSequence) {
+                        changed = true;
+                        sit.remove();
+                    }
+                }
+            }
+        }
+        
+        if (changed) {
+            // First determine an order for the services.
+            ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>();
+            for (int i=0; i<mServiceProcessesByName.size(); i++) {
+                for (ProcessItem pi : mServiceProcessesByName.valueAt(i).values()) {
+                    pi.mIsSystem = false;
+                    pi.mIsStarted = true;
+                    pi.mActiveSince = Long.MAX_VALUE;
+                    for (ServiceItem si : pi.mServices.values()) {
+                        if (si.mServiceInfo != null
+                                && (si.mServiceInfo.applicationInfo.flags
+                                        & ApplicationInfo.FLAG_SYSTEM) != 0) {
+                            pi.mIsSystem = true;
+                        }
+                        if (si.mRunningService != null
+                                && si.mRunningService.clientLabel != 0) {
+                            pi.mIsStarted = false;
+                            if (pi.mActiveSince > si.mRunningService.activeSince) {
+                                pi.mActiveSince = si.mRunningService.activeSince;
+                            }
+                        }
+                    }
+                    sortedProcesses.add(pi);
+                }
+            }
+            
+            Collections.sort(sortedProcesses, mServiceProcessComparator);
+            
+            ArrayList<BaseItem> newItems = new ArrayList<BaseItem>();
+            ArrayList<MergedItem> newMergedItems = new ArrayList<MergedItem>();
+            mProcessItems.clear();
+            for (int i=0; i<sortedProcesses.size(); i++) {
+                ProcessItem pi = sortedProcesses.get(i);
+                pi.mNeedDivider = false;
+                
+                int firstProc = mProcessItems.size();
+                // First add processes we are dependent on.
+                pi.addDependentProcesses(newItems, mProcessItems);
+                // And add the process itself.
+                newItems.add(pi);
+                if (pi.mPid > 0) {
+                    mProcessItems.add(pi);
+                }
+                
+                // Now add the services running in it.
+                MergedItem mergedItem = null;
+                boolean haveAllMerged = false;
+                boolean needDivider = false;
+                for (ServiceItem si : pi.mServices.values()) {
+                    si.mNeedDivider = needDivider;
+                    needDivider = true;
+                    newItems.add(si);
+                    if (si.mMergedItem != null) {
+                        if (mergedItem != null && mergedItem != si.mMergedItem) {
+                            haveAllMerged = false;
+                        }
+                        mergedItem = si.mMergedItem;
+                    } else {
+                        haveAllMerged = false;
+                    }
+                }
+                
+                if (!haveAllMerged || mergedItem == null
+                        || mergedItem.mServices.size() != pi.mServices.size()) {
+                    // Whoops, we need to build a new MergedItem!
+                    mergedItem = new MergedItem();
+                    for (ServiceItem si : pi.mServices.values()) {
+                        mergedItem.mServices.add(si);
+                        si.mMergedItem = mergedItem;
+                    }
+                    mergedItem.mProcess = pi;
+                    mergedItem.mOtherProcesses.clear();
+                    for (int mpi=firstProc; mpi<(mProcessItems.size()-1); mpi++) {
+                        mergedItem.mOtherProcesses.add(mProcessItems.get(mpi));
+                    }
+                }
+                
+                mergedItem.update(context);
+                newMergedItems.add(mergedItem);
+            }
+            
+            // Finally, heavy-weight processes need to be shown and will
+            // go at the top.
+            NHP = mHeavyProcesses.size();
+            for (int i=0; i<NHP; i++) {
+                ProcessItem proc = mHeavyProcesses.get(i);
+                if (proc.mClient == null && proc.mServices.size() <= 0) {
+                    if (proc.mMergedItem == null) {
+                        proc.mMergedItem = new MergedItem();
+                        proc.mMergedItem.mProcess = proc;
+                    }
+                    proc.mMergedItem.update(context);
+                    newMergedItems.add(0, proc.mMergedItem);
+                    mProcessItems.add(proc);
+                }
+            }
+            
+            synchronized (mLock) {
+                mItems = newItems;
+                mMergedItems = newMergedItems;
+            }
+        }
+        
+        // Count number of interesting other (non-active) processes, and
+        // build a list of all processes we will retrieve memory for.
+        mAllProcessItems.clear();
+        mAllProcessItems.addAll(mProcessItems);
+        int numBackgroundProcesses = 0;
+        int numForegroundProcesses = 0;
+        int numServiceProcesses = 0;
+        NRP = mRunningProcesses.size();
+        for (int i=0; i<NRP; i++) {
+            ProcessItem proc = mRunningProcesses.valueAt(i);
+            if (proc.mCurSeq != mSequence) {
+                // We didn't hit this process as a dependency on one
+                // of our active ones, so add it up if needed.
+                if (proc.mRunningProcessInfo.importance >=
+                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
+                    numBackgroundProcesses++;
+                    mAllProcessItems.add(proc);
+                } else if (proc.mRunningProcessInfo.importance <=
+                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+                    numForegroundProcesses++;
+                    mAllProcessItems.add(proc);
+                } else {
+                    Log.i("RunningState", "Unknown non-service process: "
+                            + proc.mProcessName + " #" + proc.mPid);
+                }
+            } else {
+                numServiceProcesses++;
+            }
+        }
+        
+        long backgroundProcessMemory = 0;
+        long foregroundProcessMemory = 0;
+        long serviceProcessMemory = 0;
+        try {
+            final int numProc = mAllProcessItems.size();
+            int[] pids = new int[numProc];
+            for (int i=0; i<numProc; i++) {
+                pids[i] = mAllProcessItems.get(i).mPid;
+            }
+            Debug.MemoryInfo[] mem = ActivityManagerNative.getDefault()
+                    .getProcessMemoryInfo(pids);
+            for (int i=pids.length-1; i>=0; i--) {
+                ProcessItem proc = mAllProcessItems.get(i);
+                changed |= proc.updateSize(context, mem[i], mSequence);
+                if (proc.mCurSeq == mSequence) {
+                    serviceProcessMemory += proc.mSize;
+                } else if (proc.mRunningProcessInfo.importance >=
+                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
+                    backgroundProcessMemory += proc.mSize;
+                } else if (proc.mRunningProcessInfo.importance <=
+                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+                    foregroundProcessMemory += proc.mSize;
+                }
+            }
+        } catch (RemoteException e) {
+        }
+        
+        for (int i=0; i<mMergedItems.size(); i++) {
+            mMergedItems.get(i).updateSize(context);
+        }
+        
+        synchronized (mLock) {
+            mNumBackgroundProcesses = numBackgroundProcesses;
+            mNumForegroundProcesses = numForegroundProcesses;
+            mNumServiceProcesses = numServiceProcesses;
+            mBackgroundProcessMemory = backgroundProcessMemory;
+            mForegroundProcessMemory = foregroundProcessMemory;
+            mServiceProcessMemory = serviceProcessMemory;
+            if (!mHaveData) {
+                mHaveData = true;
+                mLock.notifyAll();
+            }
+        }
+        
+        return changed;
+    }
+    
+    ArrayList<BaseItem> getCurrentItems() {
+        synchronized (mLock) {
+            return mItems;
+        }
+    }
+    
+    ArrayList<MergedItem> getCurrentMergedItems() {
+        synchronized (mLock) {
+            return mMergedItems;
+        }
+    }
+}
diff --git a/src/com/android/settings/battery_history/BatteryHistory.java b/src/com/android/settings/battery_history/BatteryHistory.java
deleted file mode 100644
index 06f38ae..0000000
--- a/src/com/android/settings/battery_history/BatteryHistory.java
+++ /dev/null
@@ -1,916 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.battery_history;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Formatter;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import com.android.internal.app.IBatteryStats;
-import com.android.settings.R;
-
-import android.app.Activity;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.BatteryStats.Timer;
-import android.os.BatteryStats.Uid;
-import android.util.Log;
-import android.util.LogPrinter;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.Spinner;
-import android.widget.TextView;
-import android.widget.AdapterView.OnItemSelectedListener;
-
-public class BatteryHistory extends Activity implements OnClickListener, OnItemSelectedListener {
-    private static final String TAG = "BatteryHistory";
-
-    private static final int SECONDS_PER_MINUTE = 60;
-    private static final int SECONDS_PER_HOUR = 60 * 60;
-    private static final int SECONDS_PER_DAY = 24 * 60 * 60;
-    
-    // Must be in sync with the values in res/values/array.xml (id battery_history_type_spinner)
-    private static final int CPU_USAGE = 0;
-    private static final int NETWORK_USAGE = 1;
-    private static final int GPS_USAGE = 2;
-    private static final int SENSOR_USAGE = 3;
-    private static final int WAKELOCK_USAGE = 4;
-    private static final int MISC_USAGE = 5;
-
-    // Must be in sync with the values in res/values/array.xml (id battery_history_which_spinner)
-    private static final int UNPLUGGED = 0;
-    private static final int CURRENT = 1;
-    private static final int TOTAL = 2;
-    
-    private BatteryStats mStats;
-    private int mWhich = BatteryStats.STATS_UNPLUGGED;
-    private int mType = MISC_USAGE;
-    
-    private GraphableButton[] mButtons;
-    IBatteryStats mBatteryInfo;
-    
-    private List<CpuUsage> mCpuUsage = new ArrayList<CpuUsage>();
-    private List<NetworkUsage> mNetworkUsage = new ArrayList<NetworkUsage>();
-    private List<SensorUsage> mSensorUsage = new ArrayList<SensorUsage>();
-    private List<SensorUsage> mGpsUsage = new ArrayList<SensorUsage>();
-    private List<WakelockUsage> mWakelockUsage = new ArrayList<WakelockUsage>();
-    private List<MiscUsage> mMiscUsage = new ArrayList<MiscUsage>();
-    
-    private boolean mHaveCpuUsage, mHaveNetworkUsage, mHaveSensorUsage,
-            mHaveWakelockUsage, mHaveMiscUsage;
-    
-    private LinearLayout mGraphLayout;
-    private LinearLayout mTextLayout;
-    private TextView mMessageText;
-    private TextView mDetailsText;
-    private Button mDetailsBackButton;
-    private Spinner mTypeSpinner;
-    private Spinner mWhichSpinner;
-    
-    private boolean mDetailsShown = false;
-    
-    private static String getLabel(String packageName, PackageManager pm) {
-        try {
-            ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
-            CharSequence label = ai.loadLabel(pm);
-            if (label != null) {
-                return label.toString();
-            }
-        } catch (NameNotFoundException e) {
-            return packageName;
-        }
-        
-        return "";
-    }
-    
-    void formatTime(double millis, StringBuilder sb) {
-        int seconds = (int) Math.floor(millis / 1000);
-        
-        int days = 0, hours = 0, minutes = 0;
-        if (seconds > SECONDS_PER_DAY) {
-            days = seconds / SECONDS_PER_DAY;
-            seconds -= days * SECONDS_PER_DAY;
-        }
-        if (seconds > SECONDS_PER_HOUR) {
-            hours = seconds / SECONDS_PER_HOUR;
-            seconds -= hours * SECONDS_PER_HOUR;
-        }
-        if (seconds > SECONDS_PER_MINUTE) {
-            minutes = seconds / SECONDS_PER_MINUTE;
-            seconds -= minutes * SECONDS_PER_MINUTE;
-        }
-        if (days > 0) {
-            sb.append(getString(R.string.battery_history_days, days, hours, minutes, seconds));
-        } else if (hours > 0) {
-            sb.append(getString(R.string.battery_history_hours, hours, minutes, seconds));
-        } else if (minutes > 0) { 
-            sb.append(getString(R.string.battery_history_minutes, minutes, seconds));
-        } else {
-            sb.append(getString(R.string.battery_history_seconds, seconds));
-        }
-    }
-    
-    abstract class Graphable implements Comparable<Graphable> {        
-        protected String mName;
-        protected String mNamePackage;
-        protected boolean mUniqueName;
-        protected String[] mPackages;
-        protected String[] mPackageNames;
-        
-        public abstract String getLabel();
-        public abstract double getSortValue();
-        public abstract double[] getValues();
-        public abstract void getInfo(StringBuilder info);
-        
-        public double getMaxValue() {
-            return -Double.MAX_VALUE;            
-        }
-        
-        public int compareTo(Graphable o) {
-            double t = getSortValue();
-            double ot = o.getSortValue();
-            if (t < ot) {
-                // Largest first
-                return 1;
-            } else if (t > ot) {
-                return -1;
-            } else {
-                return 0;
-            }
-        }
-                
-        // Side effects: sets mName and mUniqueName
-        void getNameForUid(int uid) {
-            PackageManager pm = getPackageManager();
-            mPackages = pm.getPackagesForUid(uid);
-            if (mPackages == null) {
-                mName = Integer.toString(uid);
-                mNamePackage = null;
-                return;
-            }
-            
-            mPackageNames = new String[mPackages.length];
-            System.arraycopy(mPackages, 0, mPackageNames, 0, mPackages.length);
-            
-            // Convert package names to user-facing labels where possible
-            for (int i = 0; i < mPackageNames.length; i++) {
-                mPackageNames[i] = BatteryHistory.getLabel(mPackageNames[i], pm);
-            }
-
-            if (mPackageNames.length == 1) {
-                mNamePackage = mPackages[0];
-                mName = mPackageNames[0];
-                mUniqueName = true;
-            } else {
-                mName = getString(R.string.battery_history_uid, uid); // Default name
-                // Look for an official name for this UID.
-                for (String name : mPackages) {
-                    try {
-                        PackageInfo pi = pm.getPackageInfo(name, 0);
-                        if (pi.sharedUserLabel != 0) {
-                            CharSequence nm = pm.getText(name,
-                                    pi.sharedUserLabel, pi.applicationInfo);
-                            if (nm != null) {
-                                mName = nm.toString();
-                                break;
-                            }
-                        }
-                    } catch (PackageManager.NameNotFoundException e) {
-                    }
-                }
-            }
-        }
-    }
-
-    class CpuUsage extends Graphable {
-        String mProcess;
-        double[] mUsage;
-        double mTotalRuntime;
-        long mStarts;
-        
-        public CpuUsage(int uid, String process, long userTime, long systemTime,
-                long starts, long totalRuntime) {
-            getNameForUid(uid);
-            mProcess = process;
-            PackageManager pm = BatteryHistory.this.getPackageManager();
-            mName = BatteryHistory.getLabel(process, pm);
-            mUsage = new double[2];
-            
-            mUsage[0] = userTime;
-            mUsage[1] = userTime + systemTime;
-            mTotalRuntime = totalRuntime;
-            mStarts = starts;
-        }
-        
-        public String getLabel() {
-            return mName;
-        }
-        
-        public double getSortValue() {
-            return mUsage[1];
-        }
-        
-        public double[] getValues() {
-            return mUsage;
-        }
-        
-        public double getMaxValue() {
-            return mTotalRuntime;            
-        }
-        
-        public void getInfo(StringBuilder info) {
-            info.append(getString(R.string.battery_history_cpu_usage, mProcess));
-            info.append("\n\n");
-            info.append(getString(R.string.battery_history_user_time));
-            formatTime(mUsage[0] * 10, info);
-            info.append('\n');
-            info.append(getString(R.string.battery_history_system_time));
-            formatTime((mUsage[1] - mUsage[0]) * 10, info);
-            info.append('\n');
-            info.append(getString(R.string.battery_history_total_time));
-            formatTime((mUsage[1]) * 10, info);
-            info.append('\n');
-            info.append(getString(R.string.battery_history_starts, mStarts));
-        }
-    }
-    
-    class NetworkUsage extends Graphable {
-        double[] mUsage;
-        
-        public NetworkUsage(int uid, long received, long sent) {
-            getNameForUid(uid);
-            
-            mUsage = new double[2];
-            mUsage[0] = received;
-            mUsage[1] = received + sent;
-        }
-        
-        public String getLabel() {
-            return mName;
-        }
-        
-        public double getSortValue() {
-            return mUsage[1];
-        }
-        
-        public double[] getValues() {
-            return mUsage;
-        }
-        
-        public void getInfo(StringBuilder info) {
-            info.append(getString(R.string.battery_history_network_usage, mName));
-            info.append("\n\n");
-            info.append(getString(R.string.battery_history_bytes_received, (long) mUsage[0]));
-            info.append('\n');
-            info.append(getString(R.string.battery_history_bytes_sent,
-                    (long) mUsage[1] - (long) mUsage[0]));
-            info.append('\n');
-            info.append(getString(R.string.battery_history_bytes_total, (long) mUsage[1]));
-
-            if (!mUniqueName) {
-                info.append("\n\n");
-                info.append(getString(R.string.battery_history_packages_sharing_this_uid));
-                info.append('\n');
-
-                PackageManager pm = BatteryHistory.this.getPackageManager();
-                List<String> names = new ArrayList<String>();
-                for (String name : mPackageNames) {
-                    names.add(BatteryHistory.getLabel(name, pm));
-                }
-                Collections.sort(names);
-                for (String name : names) {
-                    info.append("    ");
-                    info.append(name);
-                    info.append('\n');
-                }
-            }
-        }
-    }
-    
-    class SensorUsage extends Graphable {
-        double[] mUsage;
-        double mTotalRealtime;
-        int mCount;
-        
-        public SensorUsage(int uid, long time, int count, long totalRealtime) {
-            getNameForUid(uid);
-            
-            mUsage = new double[1];
-            mUsage[0] = time;
-            mTotalRealtime = totalRealtime;
-            
-            mCount = count;
-        }
-        
-        public String getLabel() {
-            return mName;
-        }
-        
-        public double getSortValue() {
-            return mUsage[0];
-        }
-        
-        public double[] getValues() {
-            return mUsage;
-        }
-        
-        public double getMaxValue() {
-            return mTotalRealtime;            
-        }
-        
-        public void getInfo(StringBuilder info) {
-            info.append(getString(R.string.battery_history_sensor));
-            info.append(mName);
-            info.append("\n\n");
-            info.append(getString(R.string.battery_history_total_time));
-            formatTime(mUsage[0], info);
-            info.append("\n\n");
-        }
-    }
-    
-    
-    class WakelockUsage extends Graphable {
-        double[] mUsage;
-        double mTotalRealtime;
-        int mCount;
-        
-        public WakelockUsage(int uid, long time, int count, long totalRealtime) {
-            getNameForUid(uid);
-            
-            mUsage = new double[1];
-            mUsage[0] = time;
-            mTotalRealtime = totalRealtime;
-            
-            mCount = count;
-        }
-        
-        public String getLabel() {
-            return mName;
-        }
-        
-        public double getSortValue() {
-            return mUsage[0];
-        }
-        
-        public double[] getValues() {
-            return mUsage;
-        }
-        
-        public double getMaxValue() {
-            return mTotalRealtime;            
-        }
-        
-        public void getInfo(StringBuilder info) {
-            info.append(getString(R.string.battery_history_wakelock));
-            info.append(mName);
-            info.append("\n\n");
-            info.append(getString(R.string.battery_history_total_time));
-            formatTime(mUsage[0], info);
-            info.append("\n\n");
-        }
-    }
-    
-    class MiscUsage extends Graphable {
-        int mInfoLabelRes;
-        String mInfoLabel;
-        double[] mUsage;
-        double mTotalRealtime;
-        
-        public MiscUsage(String name, int infoLabelRes, long value,
-                long totalRealtime) {
-            mName = name;
-            
-            mInfoLabelRes = infoLabelRes;
-            
-            mUsage = new double[2];
-            mUsage[0] = value;
-            mTotalRealtime = totalRealtime;
-        }
-        
-        public MiscUsage(String name, String infoLabel, long value,
-                long totalRealtime) {
-            mName = name;
-            
-            mInfoLabel = infoLabel;
-            
-            mUsage = new double[2];
-            mUsage[0] = value;
-            mTotalRealtime = totalRealtime;
-        }
-        
-        public String getLabel() {
-            return mName;
-        }
-        
-        public double getSortValue() {
-            return mUsage[1];
-        }
-        
-        public double[] getValues() {
-            return mUsage;
-        }
-        
-        public double getMaxValue() {
-            return mTotalRealtime;            
-        }
-        
-        public void getInfo(StringBuilder info) {
-            info.append(mInfoLabel != null ? mInfoLabel : getString(mInfoLabelRes));
-            info.append(' ');
-            formatTime(mUsage[0], info);
-            info.append(" (");
-            info.append((mUsage[0]*100)/mTotalRealtime);
-            info.append("%)");
-        }
-    }
-    
-    private List<? extends Graphable> getGraphRecords() {
-        switch (mType) {
-            case CPU_USAGE: return mCpuUsage;
-            case NETWORK_USAGE : return mNetworkUsage;
-            case SENSOR_USAGE: return mSensorUsage;
-            case GPS_USAGE: return mGpsUsage;
-            case WAKELOCK_USAGE: return mWakelockUsage;
-            case MISC_USAGE: return mMiscUsage;
-            default:
-                return (List<? extends Graphable>) null; // TODO
-        }
-    }
-    
-    private void displayGraph() {
-        Log.i(TAG, "displayGraph");
-
-        collectStatistics();
-        
-        // Hide the UI and selectively enable it below
-        mMessageText.setVisibility(View.GONE);
-        for (int i = 0; i < mButtons.length; i++) {
-            mButtons[i].setVisibility(View.INVISIBLE);
-        }
-        
-        double maxValue = -Double.MAX_VALUE;
-        
-        List<? extends Graphable> records = getGraphRecords();
-        for (Graphable g : records) {
-            double[] values = g.getValues();
-            maxValue = Math.max(maxValue, values[values.length - 1]);
-            maxValue = Math.max(maxValue, g.getMaxValue());
-        }
-        
-        int[] colors = new int[2];
-        colors[0] = 0xff0000ff;
-        colors[1] = 0xffff0000;
-        
-        for (int i = 0; i < mButtons.length; i++) {
-            mButtons[i].setVisibility(View.INVISIBLE);
-        }
-        
-        int numRecords = Math.min(records.size(), mButtons.length);
-        if (numRecords == 0) {
-             mMessageText.setVisibility(View.VISIBLE);
-             mMessageText.setText(R.string.battery_history_no_data);
-        } else {
-            for (int i = 0; i < numRecords; i++) {
-                Graphable r = records.get(i);           
-
-                mButtons[i].setText(r.getLabel());
-                mButtons[i].setValues(r.getValues(), maxValue);
-                mButtons[i].setVisibility(View.VISIBLE);
-            }
-        }
-    }
-    
-    private void hideDetails() {
-        mTextLayout.setVisibility(View.GONE);
-        mGraphLayout.setVisibility(View.VISIBLE);
-        mDetailsShown = false;
-    }
-    
-    private void showDetails(int id) {
-        mGraphLayout.setVisibility(View.GONE);
-        mTextLayout.setVisibility(View.VISIBLE);
-            
-        StringBuilder info = new StringBuilder();
-        List<? extends Graphable> records = getGraphRecords();
-        if (id < records.size()) {
-            Graphable record = records.get(id);
-            record.getInfo(info);
-        } else {
-            info.append(getString(R.string.battery_history_details_for, id));
-        }
-        mDetailsText.setText(info.toString());
-        mDetailsShown = true;
-    }
-
-    private void processCpuUsage() {
-        mCpuUsage.clear();
-        
-        long uSecTime = SystemClock.uptimeMillis() * 1000;
-        final long uSecNow = mStats.computeBatteryUptime(uSecTime, mWhich) / 1000;
-        
-        SparseArray<? extends Uid> uidStats = mStats.getUidStats();
-        final int NU = uidStats.size();
-        for (int iu = 0; iu < NU; iu++) {
-            Uid u = uidStats.valueAt(iu);
-
-            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
-            if (processStats.size() > 0) {
-                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
-                        : processStats.entrySet()) {
-
-                    Uid.Proc ps = ent.getValue();
-                    long userTime = ps.getUserTime(mWhich);
-                    long systemTime = ps.getSystemTime(mWhich);
-                    long starts = ps.getStarts(mWhich);
-
-                    if (userTime != 0 || systemTime != 0) {
-                        mCpuUsage.add(new CpuUsage(u.getUid(), ent.getKey(),
-                                userTime, systemTime, starts, uSecNow));
-                    }
-                }
-            }
-        }
-        Collections.sort(mCpuUsage);
-    }
-    
-    private void processNetworkUsage() {
-        mNetworkUsage.clear();
-        
-        SparseArray<? extends Uid> uidStats = mStats.getUidStats();
-        final int NU = uidStats.size();
-        for (int iu = 0; iu < NU; iu++) {
-            Uid u = uidStats.valueAt(iu);
-            
-            long received = u.getTcpBytesReceived(mWhich);
-            long sent = u.getTcpBytesSent(mWhich);
-            if (received + sent > 0) {
-                mNetworkUsage.add(new NetworkUsage(u.getUid(), received, sent));
-            }
-        }
-        Collections.sort(mNetworkUsage);
-    }
-    
-    private void processSensorUsage() {
-        mGpsUsage.clear();
-        mSensorUsage.clear();
-        
-        long uSecTime = SystemClock.elapsedRealtime() * 1000;
-        final long uSecNow = mStats.computeBatteryRealtime(uSecTime, mWhich) / 1000;
-        
-        SparseArray<? extends Uid> uidStats = mStats.getUidStats();
-        final int NU = uidStats.size();
-        for (int iu = 0; iu < NU; iu++) {
-            Uid u = uidStats.valueAt(iu);
-            int uid = u.getUid();
-            
-            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
-            long timeGps = 0;
-            int countGps = 0;
-            long timeOther = 0;
-            int countOther = 0;
-            if (sensorStats.size() > 0) {
-                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
-                        : sensorStats.entrySet()) {
-
-                    Uid.Sensor se = ent.getValue();
-                    int handle = se.getHandle();
-                    Timer timer = se.getSensorTime();
-                    if (timer != null) {
-                        // Convert from microseconds to milliseconds with rounding
-                        long totalTime = (timer.getTotalTimeLocked(uSecNow, mWhich) + 500) / 1000;
-                        int count = timer.getCountLocked(mWhich);
-                        if (handle == BatteryStats.Uid.Sensor.GPS) {
-                            timeGps += totalTime;
-                            countGps += count;
-                        } else {
-                            timeOther += totalTime;
-                            countOther += count;
-                        }
-                    }
-                }
-            }
-            
-            if (timeGps > 0) {
-                mGpsUsage.add(new SensorUsage(uid, timeGps, countGps, uSecNow));
-            }
-            if (timeOther > 0) {
-                mSensorUsage.add(new SensorUsage(uid, timeOther, countOther, uSecNow));
-            }
-        }
-        
-        Collections.sort(mGpsUsage);
-        Collections.sort(mSensorUsage);
-    }
-    
-    private void processWakelockUsage() {
-        mWakelockUsage.clear();
-        
-        long uSecTime = SystemClock.elapsedRealtime() * 1000;
-        final long uSecNow = mStats.computeBatteryRealtime(uSecTime, mWhich) / 1000;
-        
-        SparseArray<? extends Uid> uidStats = mStats.getUidStats();
-        final int NU = uidStats.size();
-        for (int iu = 0; iu < NU; iu++) {
-            Uid u = uidStats.valueAt(iu);
-            int uid = u.getUid();
-            
-            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelockStats = u.getWakelockStats();
-            long time = 0;
-            int count = 0;
-            if (wakelockStats.size() > 0) {
-                for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent
-                        : wakelockStats.entrySet()) {
-
-                    Uid.Wakelock wl = ent.getValue();
-                    Timer timer = wl.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
-                    if (timer != null) {
-                        // Convert from microseconds to milliseconds with rounding
-                        time += (timer.getTotalTimeLocked(uSecNow, mWhich) + 500) / 1000;
-                        count += timer.getCountLocked(mWhich);
-                    }
-                }
-            }
-            
-            if (time > 0) {
-                mWakelockUsage.add(new WakelockUsage(uid, time, count, uSecNow));
-            }
-        }
-        
-        Collections.sort(mWakelockUsage);
-    }
-    
-    private final StringBuilder mFormatBuilder = new StringBuilder(8);
-    private final Formatter mFormatter = new Formatter(mFormatBuilder);
-    
-    private final String formatRatio(long num, long den) {
-        if (den == 0L) {
-            return "---%";
-        }
-        float perc = ((float)num) / ((float)den) * 100;
-        mFormatBuilder.setLength(0);
-        mFormatter.format("%.1f%%", perc);
-        return mFormatBuilder.toString();
-    }
-    
-    private void processMiscUsage() {
-        mMiscUsage.clear();
-        
-        long rawRealtime = SystemClock.elapsedRealtime() * 1000;
-        final long batteryRealtime = mStats.getBatteryRealtime(rawRealtime);
-        final long whichRealtime = mStats.computeBatteryRealtime(rawRealtime, mWhich) / 1000;
-        
-        long time = mStats.computeBatteryUptime(SystemClock.uptimeMillis() * 1000, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage(getString(
-                    R.string.battery_history_awake_label)
-                    + " (" + formatRatio(time, whichRealtime) + ")",
-                    R.string.battery_history_awake,
-                    time, whichRealtime)); 
-        }
-        
-        time = mStats.getScreenOnTime(batteryRealtime, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage(getString(
-                    R.string.battery_history_screen_on_label)
-                    + " (" + formatRatio(time, whichRealtime) + ")",
-                    R.string.battery_history_screen_on,
-                    time, whichRealtime)); 
-        }
-        
-        time = mStats.getPhoneOnTime(batteryRealtime, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage(getString(
-                    R.string.battery_history_phone_on_label)
-                    + " (" + formatRatio(time, whichRealtime) + ")",
-                    R.string.battery_history_phone_on,
-                    time, whichRealtime)); 
-        }
-        
-        time = mStats.getWifiOnTime(batteryRealtime, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage("Wifi On ("
-                    + formatRatio(time, whichRealtime) + ")",
-                    "Time spent with Wifi on:",
-                    time, whichRealtime)); 
-        }
-        
-        time = mStats.getWifiRunningTime(batteryRealtime, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage("Wifi Running ("
-                    + formatRatio(time, whichRealtime) + ")",
-                    "Time spent with Wifi running:",
-                    time, whichRealtime)); 
-        }
-        
-        time = mStats.getBluetoothOnTime(batteryRealtime, mWhich) / 1000;
-        if (time > 0) {
-            mMiscUsage.add(new MiscUsage("Bluetooth On ("
-                    + formatRatio(time, whichRealtime) + ")",
-                    "Time spent with Bluetooth on:",
-                    time, whichRealtime)); 
-        }
-        
-        Collections.sort(mMiscUsage);
-    }
-    
-    private void collectStatistics() {
-        if (mType == CPU_USAGE) {
-            if (!mHaveCpuUsage) {
-                mHaveCpuUsage = true;
-                processCpuUsage();
-            }
-        }
-        if (mType == NETWORK_USAGE) {
-            if (!mHaveNetworkUsage) {
-                mHaveNetworkUsage = true;
-                processNetworkUsage();
-            }
-        }
-        if (mType == GPS_USAGE || mType == SENSOR_USAGE) {
-            if (!mHaveSensorUsage) {
-                mHaveSensorUsage = true;
-                processSensorUsage();
-            }
-        }
-        if (mType == WAKELOCK_USAGE) {
-            if (!mHaveWakelockUsage) {
-                mHaveWakelockUsage = true;
-                processWakelockUsage();
-            }
-        }
-        if (mType == MISC_USAGE) {
-            if (!mHaveMiscUsage) {
-                mHaveMiscUsage = true;
-                processMiscUsage();
-            }
-        }
-    }
-    
-    private void load() {
-        try {
-            byte[] data = mBatteryInfo.getStatistics();
-            Parcel parcel = Parcel.obtain();
-            //Log.i(TAG, "Got data: " + data.length + " bytes");
-            parcel.unmarshall(data, 0, data.length);
-            parcel.setDataPosition(0);
-            mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
-                    .createFromParcel(parcel);
-            //Log.i(TAG, "RECEIVED BATTERY INFO:");
-            //mStats.dumpLocked(new LogPrinter(Log.INFO, TAG));
-            
-            mHaveCpuUsage =  mHaveNetworkUsage =  mHaveSensorUsage
-                    = mHaveWakelockUsage = mHaveMiscUsage = false;
-        } catch (RemoteException e) {
-            Log.e(TAG, "RemoteException:", e);
-        }
-    }
-    
-    public void onClick(View v) {
-        if (v == mDetailsBackButton) {
-            hideDetails();
-            return;
-        }
-        
-        int id = ((Integer) v.getTag()).intValue();
-        showDetails(id);
-    }
-    
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK && mDetailsShown) {
-            hideDetails();
-            return true;
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        int oldWhich = mWhich;
-        
-        if (parent.equals(mTypeSpinner)) {
-            mType = position;
-        } else if (parent.equals(mWhichSpinner)) {
-            switch (position) {
-                case UNPLUGGED:
-                    mWhich = BatteryStats.STATS_UNPLUGGED;
-                    break;
-                case CURRENT:
-                    mWhich = BatteryStats.STATS_CURRENT;
-                    break;
-                case TOTAL:
-                    mWhich = BatteryStats.STATS_TOTAL;
-                    break;
-            }
-        }
-        
-        if (oldWhich != mWhich) {
-            mHaveCpuUsage =  mHaveNetworkUsage =  mHaveSensorUsage
-                    = mHaveWakelockUsage = mHaveMiscUsage = false;
-        }
-        
-        displayGraph();
-    }
-
-    public void onNothingSelected(AdapterView<?> parent) {
-        // Do nothing
-    }
-    
-    @Override
-    public Object onRetainNonConfigurationInstance() {
-        BatteryStats stats = mStats;
-        mStats = null;
-        return stats;
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (mStats != null) {
-            outState.putParcelable("stats", mStats);
-        }
-        outState.putInt("type", mType);
-        outState.putInt("which", mWhich);
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        Log.i(TAG, "onCreate");
-        
-        setContentView(R.layout.battery_history);
-        
-        mStats = (BatteryStats)getLastNonConfigurationInstance();
-        if (icicle != null) {
-            if (mStats == null) {
-                mStats = (BatteryStats)icicle.getParcelable("stats");
-            }
-            mType = icicle.getInt("type");
-            mWhich = icicle.getInt("which");
-        }
-        
-        mGraphLayout = (LinearLayout) findViewById(R.id.graphLayout);
-        mTextLayout = (LinearLayout) findViewById(R.id.textLayout);
-        mDetailsText = (TextView) findViewById(R.id.detailsText);
-        mMessageText = (TextView) findViewById(R.id.messageText);
-        
-        mTypeSpinner = (Spinner) findViewById(R.id.typeSpinner);
-        mTypeSpinner.setSelection(mType);
-        mTypeSpinner.setOnItemSelectedListener(this);
-        
-        mWhichSpinner = (Spinner) findViewById(R.id.whichSpinner);
-        mWhichSpinner.setOnItemSelectedListener(this);
-        mWhichSpinner.setEnabled(true);
-        
-        mButtons = new GraphableButton[8];
-        mButtons[0] = (GraphableButton) findViewById(R.id.button0);
-        mButtons[1] = (GraphableButton) findViewById(R.id.button1);
-        mButtons[2] = (GraphableButton) findViewById(R.id.button2);
-        mButtons[3] = (GraphableButton) findViewById(R.id.button3);
-        mButtons[4] = (GraphableButton) findViewById(R.id.button4);
-        mButtons[5] = (GraphableButton) findViewById(R.id.button5);
-        mButtons[6] = (GraphableButton) findViewById(R.id.button6);
-        mButtons[7] = (GraphableButton) findViewById(R.id.button7);
-        
-        for (int i = 0; i < mButtons.length; i++) {
-            mButtons[i].setTag(i);
-            mButtons[i].setOnClickListener(this);
-        }
-        
-        mBatteryInfo = IBatteryStats.Stub.asInterface(
-                ServiceManager.getService("batteryinfo"));
-        
-        if (mStats == null) {
-            load();
-        }
-        displayGraph();
-    }
-}
diff --git a/src/com/android/settings/battery_history/GraphableButton.java b/src/com/android/settings/battery_history/GraphableButton.java
deleted file mode 100644
index fb90a0d..0000000
--- a/src/com/android/settings/battery_history/GraphableButton.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.android.settings.battery_history;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.Button;
-
-public class GraphableButton extends Button {
-    private static final String TAG = "GraphableButton";
-
-    static Paint[] sPaint = new Paint[2];
-    static {
-        sPaint[0] = new Paint();
-        sPaint[0].setStyle(Paint.Style.FILL);
-        sPaint[0].setColor(0xFF0080FF);
-        
-        sPaint[1] = new Paint();
-        sPaint[1].setStyle(Paint.Style.FILL);
-        sPaint[1].setColor(0xFFFF6060);
-    }
-    
-    double[] mValues;
-    
-    public GraphableButton(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-    
-    public void setValues(double[] values, double maxValue) {
-        mValues = values.clone();
-        for (int i = 0; i < values.length; i++) {
-            mValues[i] /= maxValue;
-        }
-    }
-    
-    @Override
-    public void onDraw(Canvas canvas) {
-        Log.i(TAG, "onDraw: w = " + getWidth() + ", h = " + getHeight());
-        
-        int xmin = getPaddingLeft();
-        int xmax = getWidth() - getPaddingRight();
-        int ymin = getPaddingTop();
-        int ymax = getHeight() - getPaddingBottom();
-        
-        int startx = xmin;
-        for (int i = 0; i < mValues.length; i++) {
-            int endx = xmin + (int) (mValues[i] * (xmax - xmin));
-            canvas.drawRect(startx, ymin, endx, ymax, sPaint[i]);
-            startx = endx;
-        }
-        super.onDraw(canvas);
-    }
-}
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 4253c5d..55f492e 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -27,6 +27,7 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.text.TextUtils;
+import android.os.PowerManager;
 
 /**
  * BluetoothPairingRequest is a receiver for any Bluetooth pairing request. It
@@ -61,9 +62,13 @@
             pairingIntent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
             pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
+            PowerManager powerManager =
+                    (PowerManager)context.getSystemService(Context.POWER_SERVICE);
             String deviceAddress = device != null ? device.getAddress() : null;
-            if (localManager.shouldShowDialogInForeground(deviceAddress)) {
-                // Since the BT-related activity is in the foreground, just open the dialog
+            if (powerManager.isScreenOn() &&
+                localManager.shouldShowDialogInForeground(deviceAddress)) {
+                // Since the screen is on and the BT-related activity is in the foreground,
+                // just open the dialog
                 context.startActivity(pairingIntent);
 
             } else {
@@ -88,6 +93,7 @@
                         res.getString(R.string.bluetooth_notif_message) + name,
                         pending);
                 notification.flags |= Notification.FLAG_AUTO_CANCEL;
+                notification.defaults |= Notification.DEFAULT_SOUND;
 
                 NotificationManager manager = (NotificationManager)
                         context.getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
index 253bf02..b78427b 100644
--- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
@@ -35,11 +35,7 @@
 import com.android.settings.R;
 import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
 
-import java.text.DateFormat;
 import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -92,219 +88,39 @@
     // See mConnectAttempted
     private static final long MAX_UUID_DELAY_FOR_AUTO_CONNECT = 5000;
 
-    // Max time to hold the work queue if we don't get or missed a response
-    // from the bt framework.
-    private static final long MAX_WAIT_TIME_FOR_FRAMEWORK = 25 * 1000;
-
-    private enum BluetoothCommand {
-        CONNECT, DISCONNECT, REMOVE_BOND,
-    }
-
-    static class BluetoothJob {
-        final BluetoothCommand command; // CONNECT, DISCONNECT
-        final CachedBluetoothDevice cachedDevice;
-        final Profile profile; // HEADSET, A2DP, etc
-        // 0 means this command was not been sent to the bt framework.
-        long timeSent;
-
-        public BluetoothJob(BluetoothCommand command,
-                CachedBluetoothDevice cachedDevice, Profile profile) {
-            this.command = command;
-            this.cachedDevice = cachedDevice;
-            this.profile = profile;
-            this.timeSent = 0;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append(command.name());
-            sb.append(" Address:").append(cachedDevice.mDevice);
-            if (profile != null) {
-                sb.append(" Profile:").append(profile.name());
-            }
-            sb.append(" TimeSent:");
-            if (timeSent == 0) {
-                sb.append("not yet");
-            } else {
-                sb.append(DateFormat.getTimeInstance().format(new Date(timeSent)));
-            }
-            return sb.toString();
-        }
-    }
-
+    
     /**
-     * We want to serialize connect and disconnect calls. http://b/170538
-     * This are some headsets that may have L2CAP resource limitation. We want
-     * to limit the bt bandwidth usage.
-     *
-     * A queue to keep track of asynchronous calls to the bt framework.  The
-     * first item, if exist, should be in progress i.e. went to the bt framework
-     * already, waiting for a notification to come back. The second item and
-     * beyond have not been sent to the bt framework yet.
+     * Describes the current device and profile for logging.
+     * 
+     * @param profile Profile to describe
+     * @return Description of the device and profile
      */
-    private static LinkedList<BluetoothJob> workQueue = new LinkedList<BluetoothJob>();
-
-    private void queueCommand(BluetoothJob job) {
-        synchronized (workQueue) {
-            if (D) {
-                Log.d(TAG, workQueue.toString());
-            }
-            boolean processNow = pruneQueue(job);
-
-            // Add job to queue
-            if (D) {
-                Log.d(TAG, "Adding: " + job.toString());
-            }
-            workQueue.add(job);
-
-            // if there's nothing pending from before, send the command to bt
-            // framework immediately.
-            if (workQueue.size() == 1 || processNow) {
-                // If the failed to process, just drop it from the queue.
-                // There will be no callback to remove this from the queue.
-                processCommands();
-            }
+    private String describe(CachedBluetoothDevice cachedDevice, Profile profile) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Address:").append(cachedDevice.mDevice);
+        if (profile != null) {
+            sb.append(" Profile:").append(profile.name());
         }
+
+        return sb.toString();
     }
-
-    private boolean pruneQueue(BluetoothJob job) {
-        boolean removedStaleItems = false;
-        long now = System.currentTimeMillis();
-        Iterator<BluetoothJob> it = workQueue.iterator();
-        while (it.hasNext()) {
-            BluetoothJob existingJob = it.next();
-
-            // Remove any pending CONNECTS when we receive a DISCONNECT
-            if (job != null && job.command == BluetoothCommand.DISCONNECT) {
-                if (existingJob.timeSent == 0
-                        && existingJob.command == BluetoothCommand.CONNECT
-                        && existingJob.cachedDevice.mDevice.equals(job.cachedDevice.mDevice)
-                        && existingJob.profile == job.profile) {
-                    if (D) {
-                        Log.d(TAG, "Removed because of a pending disconnect. " + existingJob);
-                    }
-                    it.remove();
-                    continue;
-                }
-            }
-
-            // Defensive Code: Remove any job that older than a preset time.
-            // We never got a call back. It is better to have overlapping
-            // calls than to get stuck.
-            if (existingJob.timeSent != 0
-                    && (now - existingJob.timeSent) >= MAX_WAIT_TIME_FOR_FRAMEWORK) {
-                Log.w(TAG, "Timeout. Removing Job:" + existingJob.toString());
-                it.remove();
-                removedStaleItems = true;
-                continue;
-            }
-        }
-        return removedStaleItems;
-    }
-
-    private boolean processCommand(BluetoothJob job) {
-        boolean successful = false;
-        if (job.timeSent == 0) {
-            job.timeSent = System.currentTimeMillis();
-            switch (job.command) {
-            case CONNECT:
-                successful = connectInt(job.cachedDevice, job.profile);
-                break;
-            case DISCONNECT:
-                successful = disconnectInt(job.cachedDevice, job.profile);
-                break;
-            case REMOVE_BOND:
-                BluetoothDevice dev = job.cachedDevice.getDevice();
-                if (dev != null) {
-                    successful = dev.removeBond();
-                }
-                break;
-            }
-
-            if (successful) {
-                if (D) {
-                    Log.d(TAG, "Command sent successfully:" + job.toString());
-                }
-            } else if (V) {
-                Log.v(TAG, "Framework rejected command immediately:" + job.toString());
-            }
-        } else if (D) {
-            Log.d(TAG, "Job already has a sent time. Skip. " + job.toString());
-        }
-
-        return successful;
+    
+    private String describe(Profile profile) {
+        return describe(this, profile);
     }
 
     public void onProfileStateChanged(Profile profile, int newProfileState) {
-        synchronized (workQueue) {
-            if (D) {
-                Log.d(TAG, "onProfileStateChanged:" + workQueue.toString());
-            }
-
-            int newState = LocalBluetoothProfileManager.getProfileManager(mLocalManager,
-                    profile).convertState(newProfileState);
-
-            if (newState == SettingsBtStatus.CONNECTION_STATUS_CONNECTED) {
-                if (!mProfiles.contains(profile)) {
-                    mProfiles.add(profile);
-                }
-            }
-
-            /* Ignore the transient states e.g. connecting, disconnecting */
-            if (newState == SettingsBtStatus.CONNECTION_STATUS_CONNECTED ||
-                    newState == SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED) {
-                BluetoothJob job = workQueue.peek();
-                if (job == null) {
-                    return;
-                } else if (!job.cachedDevice.mDevice.equals(mDevice)) {
-                    // This can happen in 2 cases: 1) BT device initiated pairing and
-                    // 2) disconnects of one headset that's triggered by connects of
-                    // another.
-                    if (D) {
-                        Log.d(TAG, "mDevice:" + mDevice + " != head:" + job.toString());
-                    }
-
-                    // Check to see if we need to remove the stale items from the queue
-                    if (!pruneQueue(null)) {
-                        // nothing in the queue was modify. Just ignore the notification and return.
-                        return;
-                    }
-                } else {
-                    // Remove the first item and process the next one
-                    workQueue.poll();
-                }
-
-                processCommands();
-            }
-        }
-    }
-
-    /*
-     * This method is called in 2 places:
-     * 1) queryCommand() - when someone or something want to connect or
-     *    disconnect
-     * 2) onProfileStateChanged() - when the framework sends an intent
-     *    notification when it finishes processing a command
-     */
-    private void processCommands() {
         if (D) {
-            Log.d(TAG, "processCommands:" + workQueue.toString());
+            Log.d(TAG, "onProfileStateChanged: profile " + profile.toString() +
+                    " newProfileState " + newProfileState);
         }
-        Iterator<BluetoothJob> it = workQueue.iterator();
-        while (it.hasNext()) {
-            BluetoothJob job = it.next();
-            if (processCommand(job)) {
-                // Sent to bt framework. Done for now. Will remove this job
-                // from queue when we get an event
-                return;
-            } else {
-                /*
-                 * If the command failed immediately, there will be no event
-                 * callbacks. So delete the job immediately and move on to the
-                 * next one
-                 */
-                it.remove();
+
+        int newState = LocalBluetoothProfileManager.getProfileManager(mLocalManager,
+                profile).convertState(newProfileState);
+
+        if (newState == SettingsBtStatus.CONNECTION_STATUS_CONNECTED) {
+            if (!mProfiles.contains(profile)) {
+                mProfiles.add(profile);
             }
         }
     }
@@ -340,7 +156,7 @@
     }
 
     public void disconnect(Profile profile) {
-        queueCommand(new BluetoothJob(BluetoothCommand.DISCONNECT, this, profile));
+        disconnectInt(this, profile);
     }
 
     private boolean disconnectInt(CachedBluetoothDevice cachedDevice, Profile profile) {
@@ -349,9 +165,17 @@
         int status = profileManager.getConnectionStatus(cachedDevice.mDevice);
         if (SettingsBtStatus.isConnectionStatusConnected(status)) {
             if (profileManager.disconnect(cachedDevice.mDevice)) {
+                if (D) {
+                    Log.d(TAG, "Command sent successfully:DISCONNECT " + describe(profile));
+                }
                 return true;
             }
+            if (V) {
+                Log.v(TAG, "Framework rejected command immediately:DISCONNECT " +
+                        describe(profile));
+            }
         }
+
         return false;
     }
 
@@ -438,7 +262,7 @@
                 if (profileManager.isPreferred(mDevice)) {
                     ++preferredProfiles;
                     disconnectConnected(profile);
-                    queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+                    connectInt(this, profile);
                 }
             }
         }
@@ -461,7 +285,7 @@
                         .getProfileManager(mLocalManager, profile);
                 profileManager.setPreferred(mDevice, false);
                 disconnectConnected(profile);
-                queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+                connectInt(this, profile);
             }
         }
     }
@@ -471,7 +295,7 @@
         // Reset the only-show-one-error-dialog tracking variable
         mIsConnectingErrorPossible = true;
         disconnectConnected(profile);
-        queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+        connectInt(this, profile);
     }
 
     private void disconnectConnected(Profile profile) {
@@ -483,7 +307,7 @@
         for (BluetoothDevice device : devices) {
             CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(device);
             if (cachedDevice != null) {
-                queueCommand(new BluetoothJob(BluetoothCommand.DISCONNECT, cachedDevice, profile));
+                disconnectInt(cachedDevice, profile);
             }
         }
     }
@@ -496,12 +320,16 @@
         int status = profileManager.getConnectionStatus(cachedDevice.mDevice);
         if (!SettingsBtStatus.isConnectionStatusConnected(status)) {
             if (profileManager.connect(cachedDevice.mDevice)) {
+                if (D) {
+                    Log.d(TAG, "Command sent successfully:CONNECT " + describe(profile));
+                }
                 return true;
             }
             Log.i(TAG, "Failed to connect " + profile.toString() + " to " + cachedDevice.mName);
         } else {
             Log.i(TAG, "Already connected");
         }
+
         return false;
     }
 
@@ -546,7 +374,18 @@
         }
 
         if (state != BluetoothDevice.BOND_NONE) {
-            queueCommand(new BluetoothJob(BluetoothCommand.REMOVE_BOND, this, null));
+            final BluetoothDevice dev = getDevice();
+            if (dev != null) {
+                final boolean successful = dev.removeBond();
+                if (successful) {
+                    if (D) {
+                        Log.d(TAG, "Command sent successfully:REMOVE_BOND " + describe(null));
+                    }
+                } else if (V) {
+                    Log.v(TAG, "Framework rejected command immediately:REMOVE_BOND " +
+                            describe(null));
+                }
+            }
         }
     }
 
@@ -768,30 +607,6 @@
     public void onBondingStateChanged(int bondState) {
         if (bondState == BluetoothDevice.BOND_NONE) {
             mProfiles.clear();
-
-            BluetoothJob job = workQueue.peek();
-            if (job != null) {
-                // Remove the first item and process the next one
-                if (job.command == BluetoothCommand.REMOVE_BOND
-                        && job.cachedDevice.mDevice.equals(mDevice)) {
-                    workQueue.poll(); // dequeue
-                } else {
-                    // Unexpected job
-                    if (D) {
-                        Log.d(TAG, "job.command = " + job.command);
-                        Log.d(TAG, "mDevice:" + mDevice + " != head:" + job.toString());
-                    }
-
-                    // Check to see if we need to remove the stale items from the queue
-                    if (!pruneQueue(null)) {
-                        // nothing in the queue was modify. Just ignore the notification and return.
-                        refresh();
-                        return;
-                    }
-                }
-
-                processCommands();
-            }
         }
 
         refresh();
diff --git a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
index 08534f3..2a8af5f 100644
--- a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
+++ b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
@@ -179,6 +179,9 @@
     }
 
     private void onProfileCheckedStateChanged(Profile profile, boolean checked) {
+        LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+                .getProfileManager(mManager, profile);
+        profileManager.setPreferred(mCachedDevice.getDevice(), checked);
         if (mOnlineMode) {
             if (checked) {
                 mCachedDevice.connect(profile);
@@ -186,10 +189,6 @@
                 mCachedDevice.disconnect(profile);
             }
         }
-
-        LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
-                .getProfileManager(mManager, profile);
-        profileManager.setPreferred(mCachedDevice.getDevice(), checked);
     }
 
     public void onDeviceAttributesChanged(CachedBluetoothDevice cachedDevice) {
diff --git a/src/com/android/settings/bluetooth/DockService.java b/src/com/android/settings/bluetooth/DockService.java
index f318987..d0f8099 100644
--- a/src/com/android/settings/bluetooth/DockService.java
+++ b/src/com/android/settings/bluetooth/DockService.java
@@ -18,6 +18,7 @@
 
 import com.android.settings.R;
 import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.ServiceListener;
 
 import android.app.AlertDialog;
 import android.app.Notification;
@@ -48,7 +49,7 @@
 
 public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener,
         DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
-        CompoundButton.OnCheckedChangeListener {
+        CompoundButton.OnCheckedChangeListener, ServiceListener {
 
     private static final String TAG = "DockService";
 
@@ -101,6 +102,7 @@
     // Created in OnCreate()
     private volatile Looper mServiceLooper;
     private volatile ServiceHandler mServiceHandler;
+    private Runnable mRunnable;
     private DockService mContext;
     private LocalBluetoothManager mBtManager;
 
@@ -138,6 +140,8 @@
     @Override
     public void onDestroy() {
         if (DEBUG) Log.d(TAG, "onDestroy");
+        mRunnable = null;
+        LocalBluetoothProfileManager.removeServiceListener(this);
         if (mDialog != null) {
             mDialog.dismiss();
             mDialog = null;
@@ -228,8 +232,8 @@
     // This method gets messages from both onStartCommand and mServiceHandler/mServiceLooper
     private synchronized void processMessage(Message msg) {
         int msgType = msg.what;
-        int state = msg.arg1;
-        int startId = msg.arg2;
+        final int state = msg.arg1;
+        final int startId = msg.arg2;
         boolean deferFinishCall = false;
         BluetoothDevice device = null;
         if (msg.obj != null) {
@@ -271,12 +275,23 @@
                     }
 
                     mDevice = device;
-                    if (mBtManager.getDockAutoConnectSetting(device.getAddress())) {
-                        // Setting == auto connect
-                        initBtSettings(mContext, device, state, false);
-                        applyBtSettings(mDevice, startId);
+
+                    // Register first in case LocalBluetoothProfileManager
+                    // becomes ready after isManagerReady is called and it
+                    // would be too late to register a service listener.
+                    LocalBluetoothProfileManager.addServiceListener(this);
+                    if (LocalBluetoothProfileManager.isManagerReady()) {
+                        handleDocked(device, state, startId);
+                        // Not needed after all
+                        LocalBluetoothProfileManager.removeServiceListener(this);
                     } else {
-                        createDialog(mContext, mDevice, state, startId);
+                        final BluetoothDevice d = device;
+                        mRunnable = new Runnable() {
+                            public void run() {
+                                handleDocked(d, state, startId);
+                            }
+                        };
+                        deferFinishCall = true;
                     }
                 }
                 break;
@@ -721,8 +736,21 @@
         }
     }
 
+    private synchronized void handleDocked(final BluetoothDevice device, final int state,
+            final int startId) {
+        if (mBtManager.getDockAutoConnectSetting(device.getAddress())) {
+            // Setting == auto connect
+            initBtSettings(mContext, device, state, false);
+            applyBtSettings(mDevice, startId);
+        } else {
+            createDialog(mContext, device, state, startId);
+        }
+    }
+
     private synchronized void handleUndocked(Context context, LocalBluetoothManager localManager,
             BluetoothDevice device) {
+        mRunnable = null;
+        LocalBluetoothProfileManager.removeServiceListener(this);
         if (mDialog != null) {
             mDialog.dismiss();
             mDialog = null;
@@ -778,4 +806,15 @@
         editor.commit();
         return;
     }
+
+    public synchronized void onServiceConnected() {
+        if (mRunnable != null) {
+            mRunnable.run();
+            mRunnable = null;
+            LocalBluetoothProfileManager.removeServiceListener(this);
+        }
+    }
+
+    public void onServiceDisconnected() {
+    }
 }
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
index f3aaade..01714fe 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -28,6 +28,8 @@
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -53,6 +55,29 @@
         BluetoothUuid.ObexObjectPush
     };
 
+    /**
+     * An interface for notifying BluetoothHeadset IPC clients when they have
+     * been connected to the BluetoothHeadset service.
+     */
+    public interface ServiceListener {
+        /**
+         * Called to notify the client when this proxy object has been
+         * connected to the BluetoothHeadset service. Clients must wait for
+         * this callback before making IPC calls on the BluetoothHeadset
+         * service.
+         */
+        public void onServiceConnected();
+
+        /**
+         * Called to notify the client that this proxy object has been
+         * disconnected from the BluetoothHeadset service. Clients must not
+         * make IPC calls on the BluetoothHeadset service after this callback.
+         * This callback will currently only occur if the application hosting
+         * the BluetoothHeadset service, but may be called more often in future.
+         */
+        public void onServiceDisconnected();
+    }
+
     // TODO: close profiles when we're shutting down
     private static Map<Profile, LocalBluetoothProfileManager> sProfileMap =
             new HashMap<Profile, LocalBluetoothProfileManager>();
@@ -76,6 +101,26 @@
         }
     }
 
+    private static LinkedList<ServiceListener> mServiceListeners = new LinkedList<ServiceListener>();
+
+    public static void addServiceListener(ServiceListener l) {
+        mServiceListeners.add(l);
+    }
+
+    public static void removeServiceListener(ServiceListener l) {
+        mServiceListeners.remove(l);
+    }
+
+    public static boolean isManagerReady() {
+        // Getting just the headset profile is fine for now. Will need to deal with A2DP
+        // and others if they aren't always in a ready state.
+        LocalBluetoothProfileManager profileManager = sProfileMap.get(Profile.HEADSET);
+        if (profileManager == null) {
+            return sProfileMap.size() > 0;
+        }
+        return profileManager.isProfileReady();
+    }
+
     public static LocalBluetoothProfileManager getProfileManager(LocalBluetoothManager localManager,
             Profile profile) {
         // Note: This code assumes that "localManager" is same as the
@@ -144,6 +189,8 @@
         return SettingsBtStatus.isConnectionStatusConnected(getConnectionStatus(device));
     }
 
+    public abstract boolean isProfileReady();
+
     // TODO: int instead of enum
     public enum Profile {
         HEADSET(R.string.bluetooth_profile_headset),
@@ -247,6 +294,11 @@
                 return SettingsBtStatus.CONNECTION_STATUS_UNKNOWN;
             }
         }
+
+        @Override
+        public boolean isProfileReady() {
+            return true;
+        }
     }
 
     /**
@@ -256,6 +308,7 @@
             implements BluetoothHeadset.ServiceListener {
         private BluetoothHeadset mService;
         private Handler mUiHandler = new Handler();
+        private boolean profileReady = false;
 
         public HeadsetProfileManager(LocalBluetoothManager localManager) {
             super(localManager);
@@ -263,6 +316,7 @@
         }
 
         public void onServiceConnected() {
+            profileReady = true;
             // This could be called on a non-UI thread, funnel to UI thread.
             mUiHandler.post(new Runnable() {
                 public void run() {
@@ -277,9 +331,28 @@
                                                    BluetoothHeadset.STATE_CONNECTED);
                 }
             });
+
+            if (mServiceListeners.size() > 0) {
+                Iterator<ServiceListener> it = mServiceListeners.iterator();
+                while(it.hasNext()) {
+                    it.next().onServiceConnected();
+                }
+            }
         }
 
         public void onServiceDisconnected() {
+            profileReady = false;
+            if (mServiceListeners.size() > 0) {
+                Iterator<ServiceListener> it = mServiceListeners.iterator();
+                while(it.hasNext()) {
+                    it.next().onServiceDisconnected();
+                }
+            }
+        }
+
+        @Override
+        public boolean isProfileReady() {
+            return profileReady;
         }
 
         @Override
@@ -297,7 +370,10 @@
         public boolean connect(BluetoothDevice device) {
             // Since connectHeadset fails if already connected to a headset, we
             // disconnect from any headset first
-            mService.disconnectHeadset();
+            BluetoothDevice currDevice = mService.getCurrentHeadset();
+            if (currDevice != null) {
+                mService.disconnectHeadset(currDevice);
+            }
             return mService.connectHeadset(device);
         }
 
@@ -308,7 +384,7 @@
                 if (mService.getPriority(device) > BluetoothHeadset.PRIORITY_ON) {
                     mService.setPriority(device, BluetoothHeadset.PRIORITY_ON);
                 }
-                return mService.disconnectHeadset();
+                return mService.disconnectHeadset(device);
             } else {
                 return false;
             }
@@ -318,7 +394,7 @@
         public int getConnectionStatus(BluetoothDevice device) {
             BluetoothDevice currentDevice = mService.getCurrentHeadset();
             return currentDevice != null && currentDevice.equals(device)
-                    ? convertState(mService.getState())
+                    ? convertState(mService.getState(device))
                     : SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
         }
 
@@ -424,6 +500,11 @@
         }
 
         @Override
+        public boolean isProfileReady() {
+            return true;
+        }
+
+        @Override
         public int convertState(int oppState) {
             switch (oppState) {
             case 0:
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
new file mode 100644
index 0000000..acd9ee4
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
@@ -0,0 +1,672 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Typeface;
+import android.os.BatteryStats;
+import android.os.SystemClock;
+import android.os.BatteryStats.HistoryItem;
+import android.telephony.ServiceState;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.View;
+
+public class BatteryHistoryChart extends View {
+    static final int SANS = 1;
+    static final int SERIF = 2;
+    static final int MONOSPACE = 3;
+
+    static final int BATTERY_WARN = 29;
+    static final int BATTERY_CRITICAL = 14;
+    
+    // First value if for phone off; sirst value is "scanning"; following values
+    // are battery stats signal strength buckets.
+    static final int NUM_PHONE_SIGNALS = 7;
+
+    final Paint mBatteryBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    final Paint mBatteryGoodPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    final Paint mBatteryWarnPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    final Paint mBatteryCriticalPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    final Paint mChargingPaint = new Paint();
+    final Paint mScreenOnPaint = new Paint();
+    final Paint mGpsOnPaint = new Paint();
+    final Paint mWifiRunningPaint = new Paint();
+    final Paint mWakeLockPaint = new Paint();
+    final Paint[] mPhoneSignalPaints = new Paint[NUM_PHONE_SIGNALS];
+    final int[] mPhoneSignalColors = new int[] {
+            0x00000000, 0xffa00000, 0xffa0a000, 0xff808020,
+            0xff808040, 0xff808060, 0xff008000
+    };
+    final TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
+    
+    final Path mBatLevelPath = new Path();
+    final Path mBatGoodPath = new Path();
+    final Path mBatWarnPath = new Path();
+    final Path mBatCriticalPath = new Path();
+    final Path mChargingPath = new Path();
+    final Path mScreenOnPath = new Path();
+    final Path mGpsOnPath = new Path();
+    final Path mWifiRunningPath = new Path();
+    final Path mWakeLockPath = new Path();
+    
+    int mFontSize;
+    
+    BatteryStats mStats;
+    long mStatsPeriod;
+    String mDurationString;
+    String mTotalDurationString;
+    String mChargingLabel;
+    String mScreenOnLabel;
+    String mGpsOnLabel;
+    String mWifiRunningLabel;
+    String mWakeLockLabel;
+    String mPhoneSignalLabel;
+    
+    int mTextAscent;
+    int mTextDescent;
+    int mDurationStringWidth;
+    int mTotalDurationStringWidth;
+
+    boolean mLargeMode;
+
+    int mLineWidth;
+    int mThinLineWidth;
+    int mChargingOffset;
+    int mScreenOnOffset;
+    int mGpsOnOffset;
+    int mWifiRunningOffset;
+    int mWakeLockOffset;
+    int mPhoneSignalOffset;
+    int mLevelOffset;
+    int mLevelTop;
+    int mLevelBottom;
+    static final int PHONE_SIGNAL_X_MASK = 0x0000ffff;
+    static final int PHONE_SIGNAL_BIN_MASK = 0xffff0000;
+    static final int PHONE_SIGNAL_BIN_SHIFT = 16;
+    int mNumPhoneSignalTicks;
+    int[] mPhoneSignalTicks;
+    
+    int mNumHist;
+    BatteryStats.HistoryItem mHistFirst;
+    long mHistStart;
+    long mHistEnd;
+    int mBatLow;
+    int mBatHigh;
+    boolean mHaveWifi;
+    boolean mHaveGps;
+    
+    public BatteryHistoryChart(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        
+        mBatteryBackgroundPaint.setARGB(255, 128, 128, 128);
+        mBatteryBackgroundPaint.setStyle(Paint.Style.FILL);
+        mBatteryGoodPaint.setARGB(128, 0, 255, 0);
+        mBatteryGoodPaint.setStyle(Paint.Style.STROKE);
+        mBatteryWarnPaint.setARGB(128, 255, 255, 0);
+        mBatteryWarnPaint.setStyle(Paint.Style.STROKE);
+        mBatteryCriticalPaint.setARGB(192, 255, 0, 0);
+        mBatteryCriticalPaint.setStyle(Paint.Style.STROKE);
+        mChargingPaint.setARGB(255, 0, 128, 0);
+        mChargingPaint.setStyle(Paint.Style.STROKE);
+        mScreenOnPaint.setARGB(255, 0, 0, 255);
+        mScreenOnPaint.setStyle(Paint.Style.STROKE);
+        mGpsOnPaint.setARGB(255, 0, 0, 255);
+        mGpsOnPaint.setStyle(Paint.Style.STROKE);
+        mWifiRunningPaint.setARGB(255, 0, 0, 255);
+        mWifiRunningPaint.setStyle(Paint.Style.STROKE);
+        mWakeLockPaint.setARGB(255, 0, 0, 255);
+        mWakeLockPaint.setStyle(Paint.Style.STROKE);
+        for (int i=0; i<NUM_PHONE_SIGNALS; i++) {
+            mPhoneSignalPaints[i] = new Paint();
+            mPhoneSignalPaints[i].setColor(mPhoneSignalColors[i]);
+            mPhoneSignalPaints[i].setStyle(Paint.Style.FILL);
+        }
+        
+        mTextPaint.density = getResources().getDisplayMetrics().density;
+        mTextPaint.setCompatibilityScaling(
+                getResources().getCompatibilityInfo().applicationScale);
+        
+        TypedArray a =
+            context.obtainStyledAttributes(
+                attrs, R.styleable.BatteryHistoryChart, 0, 0);
+        
+        ColorStateList textColor = null;
+        int textSize = 15;
+        int typefaceIndex = -1;
+        int styleIndex = -1;
+        
+        TypedArray appearance = null;
+        int ap = a.getResourceId(R.styleable.BatteryHistoryChart_android_textAppearance, -1);
+        if (ap != -1) {
+            appearance = context.obtainStyledAttributes(ap,
+                                com.android.internal.R.styleable.
+                                TextAppearance);
+        }
+        if (appearance != null) {
+            int n = appearance.getIndexCount();
+            for (int i = 0; i < n; i++) {
+                int attr = appearance.getIndex(i);
+
+                switch (attr) {
+                case com.android.internal.R.styleable.TextAppearance_textColor:
+                    textColor = appearance.getColorStateList(attr);
+                    break;
+
+                case com.android.internal.R.styleable.TextAppearance_textSize:
+                    textSize = appearance.getDimensionPixelSize(attr, textSize);
+                    break;
+
+                case com.android.internal.R.styleable.TextAppearance_typeface:
+                    typefaceIndex = appearance.getInt(attr, -1);
+                    break;
+
+                case com.android.internal.R.styleable.TextAppearance_textStyle:
+                    styleIndex = appearance.getInt(attr, -1);
+                    break;
+                }
+            }
+
+            appearance.recycle();
+        }
+        
+        int shadowcolor = 0;
+        float dx=0, dy=0, r=0;
+        
+        int n = a.getIndexCount();
+        for (int i = 0; i < n; i++) {
+            int attr = a.getIndex(i);
+
+            switch (attr) {
+                case R.styleable.BatteryHistoryChart_android_shadowColor:
+                    shadowcolor = a.getInt(attr, 0);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_shadowDx:
+                    dx = a.getFloat(attr, 0);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_shadowDy:
+                    dy = a.getFloat(attr, 0);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_shadowRadius:
+                    r = a.getFloat(attr, 0);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_textColor:
+                    textColor = a.getColorStateList(attr);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_textSize:
+                    textSize = a.getDimensionPixelSize(attr, textSize);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_typeface:
+                    typefaceIndex = a.getInt(attr, typefaceIndex);
+                    break;
+
+                case R.styleable.BatteryHistoryChart_android_textStyle:
+                    styleIndex = a.getInt(attr, styleIndex);
+                    break;
+            }
+        }
+        
+        mTextPaint.setColor(textColor.getDefaultColor());
+        mTextPaint.setTextSize(textSize);
+        
+        Typeface tf = null;
+        switch (typefaceIndex) {
+            case SANS:
+                tf = Typeface.SANS_SERIF;
+                break;
+
+            case SERIF:
+                tf = Typeface.SERIF;
+                break;
+
+            case MONOSPACE:
+                tf = Typeface.MONOSPACE;
+                break;
+        }
+        
+        setTypeface(tf, styleIndex);
+        
+        if (shadowcolor != 0) {
+            mTextPaint.setShadowLayer(r, dx, dy, shadowcolor);
+        }
+    }
+    
+    public void setTypeface(Typeface tf, int style) {
+        if (style > 0) {
+            if (tf == null) {
+                tf = Typeface.defaultFromStyle(style);
+            } else {
+                tf = Typeface.create(tf, style);
+            }
+
+            mTextPaint.setTypeface(tf);
+            // now compute what (if any) algorithmic styling is needed
+            int typefaceStyle = tf != null ? tf.getStyle() : 0;
+            int need = style & ~typefaceStyle;
+            mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
+            mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
+        } else {
+            mTextPaint.setFakeBoldText(false);
+            mTextPaint.setTextSkewX(0);
+            mTextPaint.setTypeface(tf);
+        }
+    }
+    
+    void setStats(BatteryStats stats) {
+        mStats = stats;
+        
+        long uSecTime = mStats.computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000,
+                BatteryStats.STATS_SINCE_CHARGED);
+        mStatsPeriod = uSecTime;
+        String durationString = Utils.formatElapsedTime(getContext(), mStatsPeriod / 1000);
+        mDurationString = getContext().getString(R.string.battery_stats_on_battery,
+                durationString);
+        mChargingLabel = getContext().getString(R.string.battery_stats_charging_label);
+        mScreenOnLabel = getContext().getString(R.string.battery_stats_screen_on_label);
+        mGpsOnLabel = getContext().getString(R.string.battery_stats_gps_on_label);
+        mWifiRunningLabel = getContext().getString(R.string.battery_stats_wifi_running_label);
+        mWakeLockLabel = getContext().getString(R.string.battery_stats_wake_lock_label);
+        mPhoneSignalLabel = getContext().getString(R.string.battery_stats_phone_signal_label);
+        
+        BatteryStats.HistoryItem rec = stats.getHistory();
+        mHistFirst = null;
+        int pos = 0;
+        int lastInteresting = 0;
+        byte lastLevel = -1;
+        mBatLow = 0;
+        mBatHigh = 100;
+        int aggrStates = 0;
+        while (rec != null) {
+            pos++;
+            if (rec.cmd == HistoryItem.CMD_UPDATE) {
+                if (mHistFirst == null) {
+                    mHistFirst = rec;
+                    mHistStart = rec.time;
+                }
+                if (rec.batteryLevel != lastLevel || pos == 1) {
+                    lastLevel = rec.batteryLevel;
+                    lastInteresting = pos;
+                    mHistEnd = rec.time;
+                }
+                aggrStates |= rec.states;
+            }
+            rec = rec.next;
+        }
+        mNumHist = lastInteresting;
+        mHaveGps = (aggrStates&HistoryItem.STATE_GPS_ON_FLAG) != 0;
+        mHaveWifi = (aggrStates&HistoryItem.STATE_WIFI_RUNNING_FLAG) != 0;
+        
+        if (mHistEnd <= mHistStart) mHistEnd = mHistStart+1;
+        mTotalDurationString = Utils.formatElapsedTime(getContext(), mHistEnd - mHistStart);
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        mDurationStringWidth = (int)mTextPaint.measureText(mDurationString);
+        mTotalDurationStringWidth = (int)mTextPaint.measureText(mTotalDurationString);
+        mTextAscent = (int)mTextPaint.ascent();
+        mTextDescent = (int)mTextPaint.descent();
+    }
+
+    void addPhoneSignalTick(int x, int bin) {
+        mPhoneSignalTicks[mNumPhoneSignalTicks]
+                = x | bin << PHONE_SIGNAL_BIN_SHIFT;
+        mNumPhoneSignalTicks++;
+    }
+
+    void finishPaths(int w, int h, int levelh, int startX, int y, Path curLevelPath,
+            int lastX, boolean lastCharging, boolean lastScreenOn, boolean lastGpsOn,
+            boolean lastWifiRunning, boolean lastWakeLock, int lastPhoneSignal, Path lastPath) {
+        if (curLevelPath != null) {
+            if (lastX >= 0 && lastX < w) {
+                if (lastPath != null) {
+                    lastPath.lineTo(w, y);
+                }
+                curLevelPath.lineTo(w, y);
+            }
+            curLevelPath.lineTo(w, mLevelTop+levelh);
+            curLevelPath.lineTo(startX, mLevelTop+levelh);
+            curLevelPath.close();
+        }
+        
+        if (lastCharging) {
+            mChargingPath.lineTo(w, h-mChargingOffset);
+        }
+        if (lastScreenOn) {
+            mScreenOnPath.lineTo(w, h-mScreenOnOffset);
+        }
+        if (lastGpsOn) {
+            mGpsOnPath.lineTo(w, h-mGpsOnOffset);
+        }
+        if (lastWifiRunning) {
+            mWifiRunningPath.lineTo(w, h-mWifiRunningOffset);
+        }
+        if (lastWakeLock) {
+            mWakeLockPath.lineTo(w, h-mWakeLockOffset);
+        }
+        if (lastPhoneSignal != 0) {
+            addPhoneSignalTick(w, 0);
+        }
+    }
+    
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        
+        int textHeight = mTextDescent - mTextAscent;
+        mThinLineWidth = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+                2, getResources().getDisplayMetrics());
+        if (h > (textHeight*6)) {
+            mLargeMode = true;
+            mLineWidth = textHeight/2;
+            mLevelTop = textHeight + mLineWidth;
+        } else {
+            mLargeMode = false;
+            mLineWidth = mThinLineWidth;
+            mLevelTop = 0;
+        }
+        if (mLineWidth <= 0) mLineWidth = 1;
+        mTextPaint.setStrokeWidth(mThinLineWidth);
+        mBatteryGoodPaint.setStrokeWidth(mThinLineWidth);
+        mBatteryWarnPaint.setStrokeWidth(mThinLineWidth);
+        mBatteryCriticalPaint.setStrokeWidth(mThinLineWidth);
+        mChargingPaint.setStrokeWidth(mLineWidth);
+        mScreenOnPaint.setStrokeWidth(mLineWidth);
+        mGpsOnPaint.setStrokeWidth(mLineWidth);
+        mWifiRunningPaint.setStrokeWidth(mLineWidth);
+        mWakeLockPaint.setStrokeWidth(mLineWidth);
+
+        if (mLargeMode) {
+            int barOffset = textHeight + mLineWidth;
+            mChargingOffset = mLineWidth;
+            mScreenOnOffset = mChargingOffset + barOffset;
+            mWakeLockOffset = mScreenOnOffset + barOffset;
+            mWifiRunningOffset = mWakeLockOffset + barOffset;
+            mGpsOnOffset = mWifiRunningOffset + (mHaveWifi ? barOffset : 0);
+            mPhoneSignalOffset = mGpsOnOffset + (mHaveGps ? barOffset : 0);
+            mLevelOffset = mPhoneSignalOffset + barOffset + mLineWidth;
+            mPhoneSignalTicks = new int[w+2];
+        } else {
+            mScreenOnOffset = mGpsOnOffset = mWifiRunningOffset
+                    = mWakeLockOffset = mLineWidth;
+            mChargingOffset = mLineWidth*2;
+            mPhoneSignalOffset = 0;
+            mLevelOffset = mLineWidth*3;
+            mPhoneSignalTicks = null;
+        }
+
+        mBatLevelPath.reset();
+        mBatGoodPath.reset();
+        mBatWarnPath.reset();
+        mBatCriticalPath.reset();
+        mScreenOnPath.reset();
+        mGpsOnPath.reset();
+        mWifiRunningPath.reset();
+        mWakeLockPath.reset();
+        mChargingPath.reset();
+        
+        final long timeStart = mHistStart;
+        final long timeChange = mHistEnd-mHistStart;
+        
+        final int batLow = mBatLow;
+        final int batChange = mBatHigh-mBatLow;
+        
+        final int levelh = h - mLevelOffset - mLevelTop;
+        mLevelBottom = mLevelTop + levelh;
+        
+        BatteryStats.HistoryItem rec = mHistFirst;
+        int x = 0, y = 0, startX = 0, lastX = -1, lastY = -1;
+        int i = 0;
+        Path curLevelPath = null;
+        Path lastLinePath = null;
+        boolean lastCharging = false, lastScreenOn = false, lastGpsOn = false;
+        boolean lastWifiRunning = false, lastWakeLock = false;
+        int lastPhoneSignalBin = 0;
+        final int N = mNumHist;
+        while (rec != null && i < N) {
+            if (rec.cmd == BatteryStats.HistoryItem.CMD_UPDATE) {
+                x = (int)(((rec.time-timeStart)*w)/timeChange);
+                y = mLevelTop + levelh - ((rec.batteryLevel-batLow)*(levelh-1))/batChange;
+                
+                if (lastX != x) {
+                    // We have moved by at least a pixel.
+                    if (lastY != y) {
+                        // Don't plot changes within a pixel.
+                        Path path;
+                        byte value = rec.batteryLevel;
+                        if (value <= BATTERY_CRITICAL) path = mBatCriticalPath;
+                        else if (value <= BATTERY_WARN) path = mBatWarnPath;
+                        else path = mBatGoodPath;
+                        
+                        if (path != lastLinePath) {
+                            if (lastLinePath != null) {
+                                lastLinePath.lineTo(x, y);
+                            }
+                            path.moveTo(x, y);
+                            lastLinePath = path;
+                        } else {
+                            path.lineTo(x, y);
+                        }
+                        
+                        if (curLevelPath == null) {
+                            curLevelPath = mBatLevelPath;
+                            curLevelPath.moveTo(x, y);
+                            startX = x;
+                        } else {
+                            curLevelPath.lineTo(x, y);
+                        }
+                        lastX = x;
+                        lastY = y;
+                    }
+
+                    final boolean charging =
+                        (rec.states&HistoryItem.STATE_BATTERY_PLUGGED_FLAG) != 0;
+                    if (charging != lastCharging) {
+                        if (charging) {
+                            mChargingPath.moveTo(x, h-mChargingOffset);
+                        } else {
+                            mChargingPath.lineTo(x, h-mChargingOffset);
+                        }
+                        lastCharging = charging;
+                    }
+
+                    final boolean screenOn =
+                        (rec.states&HistoryItem.STATE_SCREEN_ON_FLAG) != 0;
+                    if (screenOn != lastScreenOn) {
+                        if (screenOn) {
+                            mScreenOnPath.moveTo(x, h-mScreenOnOffset);
+                        } else {
+                            mScreenOnPath.lineTo(x, h-mScreenOnOffset);
+                        }
+                        lastScreenOn = screenOn;
+                    }
+
+                    final boolean gpsOn =
+                        (rec.states&HistoryItem.STATE_GPS_ON_FLAG) != 0;
+                    if (gpsOn != lastGpsOn) {
+                        if (gpsOn) {
+                            mGpsOnPath.moveTo(x, h-mGpsOnOffset);
+                        } else {
+                            mGpsOnPath.lineTo(x, h-mGpsOnOffset);
+                        }
+                        lastGpsOn = gpsOn;
+                    }
+
+                    final boolean wifiRunning =
+                        (rec.states&HistoryItem.STATE_WIFI_RUNNING_FLAG) != 0;
+                    if (wifiRunning != lastWifiRunning) {
+                        if (wifiRunning) {
+                            mWifiRunningPath.moveTo(x, h-mWifiRunningOffset);
+                        } else {
+                            mWifiRunningPath.lineTo(x, h-mWifiRunningOffset);
+                        }
+                        lastWifiRunning = wifiRunning;
+                    }
+
+                    final boolean wakeLock =
+                        (rec.states&HistoryItem.STATE_WAKE_LOCK_FLAG) != 0;
+                    if (wakeLock != lastWakeLock) {
+                        if (wakeLock) {
+                            mWakeLockPath.moveTo(x, h-mWakeLockOffset);
+                        } else {
+                            mWakeLockPath.lineTo(x, h-mWakeLockOffset);
+                        }
+                        lastWakeLock = wakeLock;
+                    }
+
+                    if (mLargeMode) {
+                        int bin;
+                        if (((rec.states&HistoryItem.STATE_PHONE_STATE_MASK)
+                                >> HistoryItem.STATE_PHONE_STATE_SHIFT)
+                                == ServiceState.STATE_POWER_OFF) {
+                            bin = 0;
+                        } else if ((rec.states&HistoryItem.STATE_PHONE_SCANNING_FLAG) != 0) {
+                            bin = 1;
+                        } else {
+                            bin = (rec.states&HistoryItem.STATE_SIGNAL_STRENGTH_MASK)
+                                    >> HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT;
+                            bin += 2;
+                        }
+                        if (bin != lastPhoneSignalBin) {
+                            addPhoneSignalTick(x, bin);
+                            lastPhoneSignalBin = bin;
+                        }
+                    }
+                }
+                
+            } else if (curLevelPath != null) {
+                finishPaths(x+1, h, levelh, startX, lastY, curLevelPath, lastX,
+                        lastCharging, lastScreenOn, lastGpsOn, lastWifiRunning,
+                        lastWakeLock, lastPhoneSignalBin, lastLinePath);
+                lastX = lastY = -1;
+                curLevelPath = null;
+                lastLinePath = null;
+                lastCharging = lastScreenOn = lastGpsOn = lastWakeLock = false;
+                lastPhoneSignalBin = 0;
+            }
+            
+            rec = rec.next;
+            i++;
+        }
+        
+        finishPaths(w, h, levelh, startX, lastY, curLevelPath, lastX,
+                lastCharging, lastScreenOn, lastGpsOn, lastWifiRunning,
+                lastWakeLock, lastPhoneSignalBin, lastLinePath);
+    }
+    
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        
+        final int width = getWidth();
+        final int height = getHeight();
+        
+        canvas.drawPath(mBatLevelPath, mBatteryBackgroundPaint);
+        if (mLargeMode) {
+            canvas.drawText(mDurationString, 0, -mTextAscent + (mLineWidth/2),
+                    mTextPaint);
+            canvas.drawText(mTotalDurationString, (width/2) - (mTotalDurationStringWidth/2),
+                    mLevelBottom - mTextAscent + mThinLineWidth, mTextPaint);
+        } else {
+            canvas.drawText(mDurationString, (width/2) - (mDurationStringWidth/2),
+                    (height/2) - ((mTextDescent-mTextAscent)/2) - mTextAscent, mTextPaint);
+        }
+        if (!mBatGoodPath.isEmpty()) {
+            canvas.drawPath(mBatGoodPath, mBatteryGoodPaint);
+        }
+        if (!mBatWarnPath.isEmpty()) {
+            canvas.drawPath(mBatWarnPath, mBatteryWarnPaint);
+        }
+        if (!mBatCriticalPath.isEmpty()) {
+            canvas.drawPath(mBatCriticalPath, mBatteryCriticalPaint);
+        }
+        int lastBin=0, lastX=0;
+        int top = height-mPhoneSignalOffset - (mLineWidth/2);
+        int bottom = top + mLineWidth;
+        for (int i=0; i<mNumPhoneSignalTicks; i++) {
+            int tick = mPhoneSignalTicks[i];
+            int x = tick&PHONE_SIGNAL_X_MASK;
+            int bin = (tick&PHONE_SIGNAL_BIN_MASK) >> PHONE_SIGNAL_BIN_SHIFT;
+            if (lastBin != 0) {
+                canvas.drawRect(lastX, top, x, bottom, mPhoneSignalPaints[lastBin]);
+            }
+            lastBin = bin;
+            lastX = x;
+        }
+        if (!mScreenOnPath.isEmpty()) {
+            canvas.drawPath(mScreenOnPath, mScreenOnPaint);
+        }
+        if (!mChargingPath.isEmpty()) {
+            canvas.drawPath(mChargingPath, mChargingPaint);
+        }
+        if (mHaveGps) {
+            if (!mGpsOnPath.isEmpty()) {
+                canvas.drawPath(mGpsOnPath, mGpsOnPaint);
+            }
+        }
+        if (mHaveWifi) {
+            if (!mWifiRunningPath.isEmpty()) {
+                canvas.drawPath(mWifiRunningPath, mWifiRunningPaint);
+            }
+        }
+        if (!mWakeLockPath.isEmpty()) {
+            canvas.drawPath(mWakeLockPath, mWakeLockPaint);
+        }
+
+        if (mLargeMode) {
+            canvas.drawText(mPhoneSignalLabel, 0,
+                    height - mPhoneSignalOffset - mTextDescent, mTextPaint);
+            if (mHaveGps) {
+                canvas.drawText(mGpsOnLabel, 0,
+                        height - mGpsOnOffset - mTextDescent, mTextPaint);
+            }
+            if (mHaveWifi) {
+                canvas.drawText(mWifiRunningLabel, 0,
+                        height - mWifiRunningOffset - mTextDescent, mTextPaint);
+            }
+            canvas.drawText(mWakeLockLabel, 0,
+                    height - mWakeLockOffset - mTextDescent, mTextPaint);
+            canvas.drawText(mChargingLabel, 0,
+                    height - mChargingOffset - mTextDescent, mTextPaint);
+            canvas.drawText(mScreenOnLabel, 0,
+                    height - mScreenOnOffset - mTextDescent, mTextPaint);
+            canvas.drawLine(0, mLevelBottom+(mThinLineWidth/2), width,
+                    mLevelBottom+(mThinLineWidth/2), mTextPaint);
+            canvas.drawLine(0, mLevelTop, 0,
+                    mLevelBottom+(mThinLineWidth/2), mTextPaint);
+            for (int i=0; i<10; i++) {
+                int y = mLevelTop + ((mLevelBottom-mLevelTop)*i)/10;
+                canvas.drawLine(0, y, mThinLineWidth*2, y, mTextPaint);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
new file mode 100644
index 0000000..c673ce3
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryDetail.java
@@ -0,0 +1,45 @@
+/*
+ * 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.settings.fuelgauge;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Parcel;
+
+import com.android.internal.os.BatteryStatsImpl;
+import com.android.settings.R;
+
+public class BatteryHistoryDetail extends Activity {
+    public static final String EXTRA_STATS = "stats";
+
+    private BatteryStatsImpl mStats;
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        byte[] data = getIntent().getByteArrayExtra(EXTRA_STATS);
+        Parcel parcel = Parcel.obtain();
+        parcel.unmarshall(data, 0, data.length);
+        parcel.setDataPosition(0);
+        setContentView(R.layout.preference_batteryhistory);
+        mStats = com.android.internal.os.BatteryStatsImpl.CREATOR
+                .createFromParcel(parcel);
+        BatteryHistoryChart chart = (BatteryHistoryChart)findViewById(
+                R.id.battery_history_chart);
+        chart.setStats(mStats);
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
new file mode 100644
index 0000000..4579db7
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryPreference.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.fuelgauge;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.BatteryStats;
+import android.preference.Preference;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.settings.R;
+
+/**
+ * Custom preference for displaying power consumption as a bar and an icon on the left for the
+ * subsystem/app type.
+ *
+ */
+public class BatteryHistoryPreference extends Preference {
+
+    private BatteryStats mStats;
+
+    public BatteryHistoryPreference(Context context, BatteryStats stats) {
+        super(context);
+        setLayoutResource(R.layout.preference_batteryhistory);
+        mStats = stats;
+    }
+
+    BatteryStats getStats() {
+        return mStats;
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        BatteryHistoryChart chart = (BatteryHistoryChart)view.findViewById(
+                R.id.battery_history_chart);
+        chart.setStats(mStats);
+    }
+}
diff --git a/src/com/android/settings/fuelgauge/BatterySipper.java b/src/com/android/settings/fuelgauge/BatterySipper.java
new file mode 100644
index 0000000..fc967d3
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatterySipper.java
@@ -0,0 +1,197 @@
+/*
+ * 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.settings.fuelgauge;
+
+import com.android.settings.R;
+import com.android.settings.fuelgauge.PowerUsageDetail.DrainType;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.BatteryStats.Uid;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+class BatterySipper implements Comparable<BatterySipper> {
+    final Context mContext;
+    final HashMap<String,UidToDetail> mUidCache = new HashMap<String,UidToDetail>();
+    final ArrayList<BatterySipper> mRequestQueue;
+    final Handler mHandler;
+    String name;
+    Drawable icon;
+    int iconId; // For passing to the detail screen.
+    Uid uidObj;
+    double value;
+    double[] values;
+    DrainType drainType;
+    long usageTime;
+    long cpuTime;
+    long gpsTime;
+    long cpuFgTime;
+    long wakeLockTime;
+    double percent;
+    double noCoveragePercent;
+    String defaultPackageName;
+
+    static class UidToDetail {
+        String name;
+        String packageName;
+        Drawable icon;
+    }
+
+    BatterySipper(Context context, ArrayList<BatterySipper> requestQueue,
+            Handler handler, String label, DrainType drainType,
+            int iconId, Uid uid, double[] values) {
+        mContext = context;
+        mRequestQueue = requestQueue;
+        mHandler = handler;
+        this.values = values;
+        name = label;
+        this.drainType = drainType;
+        if (iconId > 0) {
+            icon = mContext.getResources().getDrawable(iconId);
+        }
+        if (values != null) value = values[0];
+        if ((label == null || iconId == 0) && uid != null) {
+            getQuickNameIconForUid(uid);
+        }
+        uidObj = uid;
+    }
+
+    double getSortValue() {
+        return value;
+    }
+
+    double[] getValues() {
+        return values;
+    }
+
+    Drawable getIcon() {
+        return icon;
+    }
+
+    public int compareTo(BatterySipper other) {
+        // Return the flipped value because we want the items in descending order
+        return (int) (other.getSortValue() - getSortValue());
+    }
+
+    void getQuickNameIconForUid(Uid uidObj) {
+        final int uid = uidObj.getUid();
+        final String uidString = Integer.toString(uid);
+        if (mUidCache.containsKey(uidString)) {
+            UidToDetail utd = mUidCache.get(uidString);
+            defaultPackageName = utd.packageName;
+            name = utd.name;
+            icon = utd.icon;
+            return;
+        }
+        PackageManager pm = mContext.getPackageManager();
+        final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
+        String[] packages = pm.getPackagesForUid(uid);
+        icon = pm.getDefaultActivityIcon();
+        if (packages == null) {
+            //name = Integer.toString(uid);
+            if (uid == 0) {
+                name = mContext.getResources().getString(R.string.process_kernel_label);
+            } else if ("mediaserver".equals(name)) {
+                name = mContext.getResources().getString(R.string.process_mediaserver_label);
+            }
+            iconId = R.drawable.ic_power_system;
+            icon = mContext.getResources().getDrawable(iconId);
+            return;
+        } else {
+            //name = packages[0];
+        }
+        synchronized (mRequestQueue) {
+            mRequestQueue.add(this);
+        }
+    }
+
+    /**
+     * Sets name and icon
+     * @param uid Uid of the application
+     */
+    void getNameIcon() {
+        PackageManager pm = mContext.getPackageManager();
+        final int uid = uidObj.getUid();
+        final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
+        String[] packages = pm.getPackagesForUid(uid);
+        if (packages == null) {
+            name = Integer.toString(uid);
+            return;
+        }
+
+        String[] packageLabels = new String[packages.length];
+        System.arraycopy(packages, 0, packageLabels, 0, packages.length);
+
+        int preferredIndex = -1;
+        // Convert package names to user-facing labels where possible
+        for (int i = 0; i < packageLabels.length; i++) {
+            // Check if package matches preferred package
+            if (packageLabels[i].equals(name)) preferredIndex = i;
+            try {
+                ApplicationInfo ai = pm.getApplicationInfo(packageLabels[i], 0);
+                CharSequence label = ai.loadLabel(pm);
+                if (label != null) {
+                    packageLabels[i] = label.toString();
+                }
+                if (ai.icon != 0) {
+                    defaultPackageName = packages[i];
+                    icon = ai.loadIcon(pm);
+                    break;
+                }
+            } catch (NameNotFoundException e) {
+            }
+        }
+        if (icon == null) icon = defaultActivityIcon;
+
+        if (packageLabels.length == 1) {
+            name = packageLabels[0];
+        } else {
+            // Look for an official name for this UID.
+            for (String pkgName : packages) {
+                try {
+                    final PackageInfo pi = pm.getPackageInfo(pkgName, 0);
+                    if (pi.sharedUserLabel != 0) {
+                        final CharSequence nm = pm.getText(pkgName,
+                                pi.sharedUserLabel, pi.applicationInfo);
+                        if (nm != null) {
+                            name = nm.toString();
+                            if (pi.applicationInfo.icon != 0) {
+                                defaultPackageName = pkgName;
+                                icon = pi.applicationInfo.loadIcon(pm);
+                            }
+                            break;
+                        }
+                    }
+                } catch (PackageManager.NameNotFoundException e) {
+                }
+            }
+        }
+        final String uidString = Integer.toString(uidObj.getUid());
+        UidToDetail utd = new UidToDetail();
+        utd.name = name;
+        utd.icon = icon;
+        utd.packageName = defaultPackageName;
+        mUidCache.put(uidString, utd);
+        mHandler.sendMessage(mHandler.obtainMessage(PowerUsageSummary.MSG_UPDATE_NAME_ICON, this));
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/fuelgauge/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
index 68f294c..ad8c25b 100644
--- a/src/com/android/settings/fuelgauge/PowerGaugePreference.java
+++ b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
@@ -17,9 +17,6 @@
 package com.android.settings.fuelgauge;
 
 import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
 import android.graphics.drawable.Drawable;
 import android.preference.Preference;
 import android.view.View;
@@ -27,7 +24,6 @@
 import android.widget.TextView;
 
 import com.android.settings.R;
-import com.android.settings.fuelgauge.PowerUsageSummary.BatterySipper;
 
 /**
  * Custom preference for displaying power consumption as a bar and an icon on the left for the
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index 4db968a..cc112f8 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -40,9 +40,9 @@
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
-import com.android.settings.InstalledAppDetails;
-import com.android.settings.ManageApplications;
 import com.android.settings.R;
+import com.android.settings.applications.InstalledAppDetails;
+import com.android.settings.applications.ManageApplications;
 
 public class PowerUsageDetail extends Activity implements Button.OnClickListener {
 
@@ -248,9 +248,9 @@
                 startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                 break;
             case ACTION_APP_DETAILS:
-                Intent intent = new Intent(Intent.ACTION_VIEW);
+                Intent intent = new Intent(Intent.ACTION_VIEW,
+                        Uri.fromParts("package", mPackages[0], null));
                 intent.setClass(this, InstalledAppDetails.class);
-                intent.putExtra(ManageApplications.APP_PKG_NAME, mPackages[0]);
                 startActivity(intent);
                 break;
             case ACTION_SECURITY_SETTINGS:
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 5678160..5d4c1b9 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -18,10 +18,6 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.graphics.drawable.Drawable;
 import android.hardware.SensorManager;
 import android.os.BatteryStats;
@@ -53,7 +49,6 @@
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -76,7 +71,7 @@
 
     private PreferenceGroup mAppListGroup;
 
-    private int mStatsType = BatteryStats.STATS_UNPLUGGED;
+    private int mStatsType = BatteryStats.STATS_SINCE_CHARGED;
 
     private static final int MIN_POWER_THRESHOLD = 5;
     private static final int MAX_ITEMS_TO_LIST = 10;
@@ -86,23 +81,17 @@
     private double mTotalPower;
     private PowerProfile mPowerProfile;
 
-    private HashMap<String,UidToDetail> mUidCache = new HashMap<String,UidToDetail>();
-
     /** Queue for fetching name and icon for an application */
     private ArrayList<BatterySipper> mRequestQueue = new ArrayList<BatterySipper>();
     private Thread mRequestThread;
     private boolean mAbort;
     
-    static class UidToDetail {
-        String name;
-        String packageName;
-        Drawable icon;
-    }
-
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        mStats = (BatteryStatsImpl)getLastNonConfigurationInstance();
+
         addPreferencesFromResource(R.xml.power_usage_summary);
         mBatteryInfo = IBatteryStats.Stub.asInterface(
                 ServiceManager.getService("batteryinfo"));
@@ -111,6 +100,11 @@
     }
 
     @Override
+    public Object onRetainNonConfigurationInstance() {
+        return mStats;
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
         mAbort = false;
@@ -128,6 +122,18 @@
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        if (preference instanceof BatteryHistoryPreference) {
+            Parcel hist = Parcel.obtain();
+            mStats.writeToParcelWithoutUids(hist, 0);
+            byte[] histData = hist.marshall();
+            Intent intent = new Intent(this, BatteryHistoryDetail.class);
+            intent.putExtra(BatteryHistoryDetail.EXTRA_STATS, histData);
+            startActivity(intent);
+            return super.onPreferenceTreeClick(preferenceScreen, preference);
+        }
+        if (!(preference instanceof PowerGaugePreference)) {
+            return false;
+        }
         PowerGaugePreference pgp = (PowerGaugePreference) preference;
         BatterySipper sipper = pgp.getInfo();
         Intent intent = new Intent(this, PowerUsageDetail.class);
@@ -154,6 +160,7 @@
                 types = new int[] {
                     R.string.usage_type_cpu,
                     R.string.usage_type_cpu_foreground,
+                    R.string.usage_type_wake_lock,
                     R.string.usage_type_gps,
                     R.string.usage_type_data_send,
                     R.string.usage_type_data_recv,
@@ -163,6 +170,7 @@
                 values = new double[] {
                     sipper.cpuTime,
                     sipper.cpuFgTime,
+                    sipper.wakeLockTime,
                     sipper.gpsTime,
                     uid != null? uid.getTcpBytesSent(mStatsType) : 0,
                     uid != null? uid.getTcpBytesReceived(mStatsType) : 0,
@@ -226,7 +234,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         if (DEBUG) {
-            menu.findItem(MENU_STATS_TYPE).setTitle(mStatsType == BatteryStats.STATS_TOTAL
+            menu.findItem(MENU_STATS_TYPE).setTitle(mStatsType == BatteryStats.STATS_SINCE_CHARGED
                     ? R.string.menu_stats_unplugged
                     : R.string.menu_stats_total);
         }
@@ -237,10 +245,10 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_STATS_TYPE:
-                if (mStatsType == BatteryStats.STATS_TOTAL) {
-                    mStatsType = BatteryStats.STATS_UNPLUGGED;
+                if (mStatsType == BatteryStats.STATS_SINCE_CHARGED) {
+                    mStatsType = BatteryStats.STATS_SINCE_UNPLUGGED;
                 } else {
-                    mStatsType = BatteryStats.STATS_TOTAL;
+                    mStatsType = BatteryStats.STATS_SINCE_CHARGED;
                 }
                 refreshStats();
                 return true;
@@ -267,6 +275,10 @@
 
         mAppListGroup.setOrderingAsAdded(false);
 
+        BatteryHistoryPreference hist = new BatteryHistoryPreference(this, mStats);
+        hist.setOrder(-1);
+        mAppListGroup.addPreference(hist);
+        
         Collections.sort(mUsageList);
         for (BatterySipper sipper : mUsageList) {
             if (sipper.getSortValue() < MIN_POWER_THRESHOLD) continue;
@@ -283,7 +295,7 @@
                 pref.setKey(Integer.toString(sipper.uidObj.getUid()));
             }
             mAppListGroup.addPreference(pref);
-            if (mAppListGroup.getPreferenceCount() > MAX_ITEMS_TO_LIST) break;
+            if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST+1)) break;
         }
         if (DEBUG) setTitle("Battery total uAh = " + ((mTotalPower * 1000) / 3600));
         synchronized (mRequestQueue) {
@@ -330,6 +342,7 @@
             Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
             long cpuTime = 0;
             long cpuFgTime = 0;
+            long wakelockTime = 0;
             long gpsTime = 0;
             if (processStats.size() > 0) {
                 // Process CPU time
@@ -374,6 +387,20 @@
             }
             power /= 1000;
 
+            // Process wake lock usage
+            Map<String, ? extends BatteryStats.Uid.Wakelock> wakelockStats = u.getWakelockStats();
+            for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> wakelockEntry
+                    : wakelockStats.entrySet()) {
+                Uid.Wakelock wakelock = wakelockEntry.getValue();
+                // Only care about partial wake locks since full wake locks
+                // are canceled when the user turns the screen off.
+                BatteryStats.Timer timer = wakelock.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
+                if (timer != null) {
+                    wakelockTime += timer.getTotalTimeLocked(uSecTime, which);
+                }
+            }
+            wakelockTime /= 1000; // convert to millis
+
             // Add cost of data traffic
             power += (u.getTcpBytesReceived(mStatsType) + u.getTcpBytesSent(mStatsType))
                     * averageCostPerByte;
@@ -408,11 +435,13 @@
 
             // Add the app to the list if it is consuming power
             if (power != 0) {
-                BatterySipper app = new BatterySipper(packageWithHighestDrain, DrainType.APP, 0, u,
+                BatterySipper app = new BatterySipper(this, mRequestQueue, mHandler,
+                        packageWithHighestDrain, DrainType.APP, 0, u,
                         new double[] {power});
                 app.cpuTime = cpuTime;
                 app.gpsTime = gpsTime;
                 app.cpuFgTime = cpuFgTime;
+                app.wakeLockTime = wakelockTime;
                 mUsageList.add(app);
             }
             if (power > mMaxPower) mMaxPower = power;
@@ -549,7 +578,8 @@
             double power) {
         if (power > mMaxPower) mMaxPower = power;
         mTotalPower += power;
-        BatterySipper bs = new BatterySipper(label, drainType, iconId, null, new double[] {power});
+        BatterySipper bs = new BatterySipper(this, mRequestQueue, mHandler,
+                label, drainType, iconId, null, new double[] {power});
         bs.usageTime = time;
         bs.iconId = iconId;
         mUsageList.add(bs);
@@ -569,156 +599,6 @@
         }
     }
 
-    class BatterySipper implements Comparable<BatterySipper> {
-        String name;
-        Drawable icon;
-        int iconId; // For passing to the detail screen.
-        Uid uidObj;
-        double value;
-        double[] values;
-        DrainType drainType;
-        long usageTime;
-        long cpuTime;
-        long gpsTime;
-        long cpuFgTime;
-        double percent;
-        double noCoveragePercent;
-        String defaultPackageName;
-
-        BatterySipper(String label, DrainType drainType, int iconId, Uid uid, double[] values) {
-            this.values = values;
-            name = label;
-            this.drainType = drainType;
-            if (iconId > 0) {
-                icon = getResources().getDrawable(iconId);
-            }
-            if (values != null) value = values[0];
-            if ((label == null || iconId == 0) && uid != null) {
-                getQuickNameIconForUid(uid);
-            }
-            uidObj = uid;
-        }
-
-        double getSortValue() {
-            return value;
-        }
-
-        double[] getValues() {
-            return values;
-        }
-
-        Drawable getIcon() {
-            return icon;
-        }
-
-        public int compareTo(BatterySipper other) {
-            // Return the flipped value because we want the items in descending order
-            return (int) (other.getSortValue() - getSortValue());
-        }
-
-        void getQuickNameIconForUid(Uid uidObj) {
-            final int uid = uidObj.getUid();
-            final String uidString = Integer.toString(uid);
-            if (mUidCache.containsKey(uidString)) {
-                UidToDetail utd = mUidCache.get(uidString);
-                defaultPackageName = utd.packageName;
-                name = utd.name;
-                icon = utd.icon;
-                return;
-            }
-            PackageManager pm = getPackageManager();
-            final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
-            String[] packages = pm.getPackagesForUid(uid);
-            icon = pm.getDefaultActivityIcon();
-            if (packages == null) {
-                //name = Integer.toString(uid);
-                if (uid == 0) {
-                    name = getResources().getString(R.string.process_kernel_label);
-                } else if ("mediaserver".equals(name)) {
-                    name = getResources().getString(R.string.process_mediaserver_label);
-                }
-                iconId = R.drawable.ic_power_system;
-                icon = getResources().getDrawable(iconId);
-                return;
-            } else {
-                //name = packages[0];
-            }
-            synchronized (mRequestQueue) {
-                mRequestQueue.add(this);
-            }
-        }
-
-        /**
-         * Sets name and icon
-         * @param uid Uid of the application
-         */
-        void getNameIcon() {
-            PackageManager pm = getPackageManager();
-            final int uid = uidObj.getUid();
-            final Drawable defaultActivityIcon = pm.getDefaultActivityIcon();
-            String[] packages = pm.getPackagesForUid(uid);
-            if (packages == null) {
-                name = Integer.toString(uid);
-                return;
-            }
-
-            String[] packageLabels = new String[packages.length];
-            System.arraycopy(packages, 0, packageLabels, 0, packages.length);
-
-            int preferredIndex = -1;
-            // Convert package names to user-facing labels where possible
-            for (int i = 0; i < packageLabels.length; i++) {
-                // Check if package matches preferred package
-                if (packageLabels[i].equals(name)) preferredIndex = i;
-                try {
-                    ApplicationInfo ai = pm.getApplicationInfo(packageLabels[i], 0);
-                    CharSequence label = ai.loadLabel(pm);
-                    if (label != null) {
-                        packageLabels[i] = label.toString();
-                    }
-                    if (ai.icon != 0) {
-                        defaultPackageName = packages[i];
-                        icon = ai.loadIcon(pm);
-                        break;
-                    }
-                } catch (NameNotFoundException e) {
-                }
-            }
-            if (icon == null) icon = defaultActivityIcon;
-
-            if (packageLabels.length == 1) {
-                name = packageLabels[0];
-            } else {
-                // Look for an official name for this UID.
-                for (String pkgName : packages) {
-                    try {
-                        final PackageInfo pi = pm.getPackageInfo(pkgName, 0);
-                        if (pi.sharedUserLabel != 0) {
-                            final CharSequence nm = pm.getText(pkgName,
-                                    pi.sharedUserLabel, pi.applicationInfo);
-                            if (nm != null) {
-                                name = nm.toString();
-                                if (pi.applicationInfo.icon != 0) {
-                                    defaultPackageName = pkgName;
-                                    icon = pi.applicationInfo.loadIcon(pm);
-                                }
-                                break;
-                            }
-                        }
-                    } catch (PackageManager.NameNotFoundException e) {
-                    }
-                }
-            }
-            final String uidString = Integer.toString(uidObj.getUid());
-            UidToDetail utd = new UidToDetail();
-            utd.name = name;
-            utd.icon = icon;
-            utd.packageName = defaultPackageName;
-            mUidCache.put(uidString, utd);
-            mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_NAME_ICON, this));
-        }
-    }
-
     public void run() {
         while (true) {
             BatterySipper bs;
@@ -733,7 +613,7 @@
         }
     }
 
-    private static final int MSG_UPDATE_NAME_ICON = 1;
+    static final int MSG_UPDATE_NAME_ICON = 1;
 
     Handler mHandler = new Handler() {
 
diff --git a/src/com/android/settings/widget/SettingsAppWidgetProvider.java b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
index 939e8e3..444b8d4 100644
--- a/src/com/android/settings/widget/SettingsAppWidgetProvider.java
+++ b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
@@ -78,10 +78,12 @@
 
     private static final StateTracker sWifiState = new WifiStateTracker();
     private static final StateTracker sBluetoothState = new BluetoothStateTracker();
+    private static final StateTracker sGpsState = new GpsStateTracker();
+    private static final StateTracker sSyncState = new SyncStateTracker();
 
     /**
-     * The state machine for Wifi and Bluetooth toggling, tracking
-     * reality versus the user's intent.
+     * The state machine for a setting's toggling, tracking reality
+     * versus the user's intent.
      *
      * This is necessary because reality moves relatively slowly
      * (turning on &amp; off radio drivers), compared to user's
@@ -134,6 +136,59 @@
         }
 
         /**
+         * Return the ID of the main large image button for the setting.
+         */
+        public abstract int getButtonId();
+
+        /**
+         * Returns the small indicator image ID underneath the setting.
+         */
+        public abstract int getIndicatorId();
+
+        /**
+         * Returns the resource ID of the image to show as a function of
+         * the on-vs-off state.
+         */
+        public abstract int getButtonImageId(boolean on);
+
+        /**
+         * Updates the remote views depending on the state (off, on,
+         * turning off, turning on) of the setting.
+         */
+        public final void setImageViewResources(Context context, RemoteViews views) {
+            int buttonId = getButtonId();
+            int indicatorId = getIndicatorId();
+            switch (getTriState(context)) {
+                case STATE_DISABLED:
+                    views.setImageViewResource(buttonId, getButtonImageId(false));
+                    views.setImageViewResource(
+                        indicatorId, R.drawable.appwidget_settings_ind_off_l);
+                    break;
+                case STATE_ENABLED:
+                    views.setImageViewResource(buttonId, getButtonImageId(true));
+                    views.setImageViewResource(
+                        indicatorId, R.drawable.appwidget_settings_ind_on_l);
+                    break;
+                case STATE_INTERMEDIATE:
+                    // In the transitional state, the bottom green bar
+                    // shows the tri-state (on, off, transitioning), but
+                    // the top dark-gray-or-bright-white logo shows the
+                    // user's intent.  This is much easier to see in
+                    // sunlight.
+                    if (isTurningOn()) {
+                        views.setImageViewResource(buttonId, getButtonImageId(true));
+                        views.setImageViewResource(
+                            indicatorId, R.drawable.appwidget_settings_ind_mid_l);
+                    } else {
+                        views.setImageViewResource(buttonId, getButtonImageId(false));
+                        views.setImageViewResource(
+                            indicatorId, R.drawable.appwidget_settings_ind_off_l);
+                    }
+                    break;
+            }
+        }
+
+        /**
          * Update internal state from a broadcast state change.
          */
         public abstract void onActualStateChange(Context context, Intent intent);
@@ -236,6 +291,13 @@
      * Subclass of StateTracker to get/set Wifi state.
      */
     private static final class WifiStateTracker extends StateTracker {
+        public int getButtonId() { return R.id.img_wifi; }
+        public int getIndicatorId() { return R.id.ind_wifi; }
+        public int getButtonImageId(boolean on) {
+            return on ? R.drawable.ic_appwidget_settings_wifi_on
+                    : R.drawable.ic_appwidget_settings_wifi_off;
+        }
+
         @Override
         public int getActualState(Context context) {
             WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@@ -247,7 +309,8 @@
 
         @Override
         protected void requestStateChange(Context context, final boolean desiredState) {
-            final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+            final WifiManager wifiManager =
+                    (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
             if (wifiManager == null) {
                 Log.d(TAG, "No wifiManager.");
                 return;
@@ -308,6 +371,12 @@
      * Subclass of StateTracker to get/set Bluetooth state.
      */
     private static final class BluetoothStateTracker extends StateTracker {
+        public int getButtonId() { return R.id.img_bluetooth; }
+        public int getIndicatorId() { return R.id.ind_bluetooth; }
+        public int getButtonImageId(boolean on) {
+            return on ? R.drawable.ic_appwidget_settings_bluetooth_on
+                    : R.drawable.ic_appwidget_settings_bluetooth_off;
+        }
 
         @Override
         public int getActualState(Context context) {
@@ -368,6 +437,120 @@
         }
     }
 
+    /**
+     * Subclass of StateTracker for GPS state.
+     */
+    private static final class GpsStateTracker extends StateTracker {
+        public int getButtonId() { return R.id.img_gps; }
+        public int getIndicatorId() { return R.id.ind_gps; }
+        public int getButtonImageId(boolean on) {
+            return on ? R.drawable.ic_appwidget_settings_gps_on
+                    : R.drawable.ic_appwidget_settings_gps_off;
+        }
+
+        @Override
+        public int getActualState(Context context) {
+            ContentResolver resolver = context.getContentResolver();
+            boolean on = Settings.Secure.isLocationProviderEnabled(
+                resolver, LocationManager.GPS_PROVIDER);
+            return on ? STATE_ENABLED : STATE_DISABLED;
+        }
+
+        @Override
+        public void onActualStateChange(Context context, Intent unused) {
+            // Note: the broadcast location providers changed intent
+            // doesn't include an extras bundles saying what the new value is.
+            setCurrentState(context, getActualState(context));
+        }
+
+        @Override
+        public void requestStateChange(final Context context, final boolean desiredState) {
+            final ContentResolver resolver = context.getContentResolver();
+            new AsyncTask<Void, Void, Boolean>() {
+                @Override
+                protected Boolean doInBackground(Void... args) {
+                    Settings.Secure.setLocationProviderEnabled(
+                        resolver,
+                        LocationManager.GPS_PROVIDER,
+                        desiredState);
+                    return desiredState;
+                }
+
+                @Override
+                protected void onPostExecute(Boolean result) {
+                    setCurrentState(
+                        context,
+                        result ? STATE_ENABLED : STATE_DISABLED);
+                    updateWidget(context);
+                }
+            }.execute();
+        }
+    }
+
+    /**
+     * Subclass of StateTracker for sync state.
+     */
+    private static final class SyncStateTracker extends StateTracker {
+        public int getButtonId() { return R.id.img_sync; }
+        public int getIndicatorId() { return R.id.ind_sync; }
+        public int getButtonImageId(boolean on) {
+            return on ? R.drawable.ic_appwidget_settings_sync_on
+                    : R.drawable.ic_appwidget_settings_sync_off;
+        }
+
+        @Override
+        public int getActualState(Context context) {
+            boolean on = getBackgroundDataState(context) &&
+                    ContentResolver.getMasterSyncAutomatically();
+            return on ? STATE_ENABLED : STATE_DISABLED;
+        }
+
+        @Override
+        public void onActualStateChange(Context context, Intent unused) {
+            // Well, ACTION_CLOSE_SYSTEM_DIALOGS fired.  So _maybe_
+            // the Sync settings changed.
+            // TODO: find something more reliable.
+            setCurrentState(context, getActualState(context));
+        }
+
+        @Override
+        public void requestStateChange(final Context context, final boolean desiredState) {
+            final ConnectivityManager connManager =
+                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+            final boolean backgroundData = getBackgroundDataState(context);
+            final boolean sync = ContentResolver.getMasterSyncAutomatically();
+
+            new AsyncTask<Void, Void, Boolean>() {
+                @Override
+                protected Boolean doInBackground(Void... args) {
+                    // Turning sync on.
+                    if (desiredState) {
+                        if (!backgroundData) {
+                            connManager.setBackgroundDataSetting(true);
+                        }
+                        if (!sync) {
+                            ContentResolver.setMasterSyncAutomatically(true);
+                        }
+                        return true;
+                    }
+
+                    // Turning sync off
+                    if (sync) {
+                        ContentResolver.setMasterSyncAutomatically(false);
+                    }
+                    return false;
+                }
+
+                @Override
+                protected void onPostExecute(Boolean result) {
+                    setCurrentState(
+                        context,
+                        result ? STATE_ENABLED : STATE_DISABLED);
+                    updateWidget(context);
+                }
+            }.execute();
+        }
+    }
 
     @Override
     public void onUpdate(Context context, AppWidgetManager appWidgetManager,
@@ -442,38 +625,11 @@
      * @param context
      */
     private static void updateButtons(RemoteViews views, Context context) {
-        switch (sWifiState.getTriState(context)) {
-            case STATE_DISABLED:
-                views.setImageViewResource(R.id.img_wifi,
-                                           R.drawable.ic_appwidget_settings_wifi_off);
-                views.setImageViewResource(R.id.ind_wifi,
-                                           R.drawable.appwidget_settings_ind_off_l);
-                break;
-            case STATE_ENABLED:
-                views.setImageViewResource(R.id.img_wifi,
-                                           R.drawable.ic_appwidget_settings_wifi_on);
-                views.setImageViewResource(R.id.ind_wifi,
-                                           R.drawable.appwidget_settings_ind_on_l);
-                break;
-            case STATE_INTERMEDIATE:
-                // In the transitional state, the bottom green bar
-                // shows the tri-state (on, off, transitioning), but
-                // the top dark-gray-or-bright-white logo shows the
-                // user's intent.  This is much easier to see in
-                // sunlight.
-                if (sWifiState.isTurningOn()) {
-                    views.setImageViewResource(R.id.img_wifi,
-                                               R.drawable.ic_appwidget_settings_wifi_on);
-                    views.setImageViewResource(R.id.ind_wifi,
-                                               R.drawable.appwidget_settings_ind_mid_l);
-                } else {
-                    views.setImageViewResource(R.id.img_wifi,
-                                               R.drawable.ic_appwidget_settings_wifi_off);
-                    views.setImageViewResource(R.id.ind_wifi,
-                                               R.drawable.appwidget_settings_ind_off_l);
-                }
-                break;
-        }
+        sWifiState.setImageViewResources(context, views);
+        sBluetoothState.setImageViewResources(context, views);
+        sGpsState.setImageViewResources(context, views);
+        sSyncState.setImageViewResources(context, views);
+
         if (getBrightnessMode(context)) {
             views.setImageViewResource(R.id.img_brightness,
                                        R.drawable.ic_appwidget_settings_brightness_auto);
@@ -490,52 +646,6 @@
             views.setImageViewResource(R.id.ind_brightness,
                                        R.drawable.appwidget_settings_ind_off_r);
         }
-        if (getSync(context)) {
-            views.setImageViewResource(R.id.img_sync, R.drawable.ic_appwidget_settings_sync_on);
-            views.setImageViewResource(R.id.ind_sync, R.drawable.appwidget_settings_ind_on_c);
-        } else {
-            views.setImageViewResource(R.id.img_sync, R.drawable.ic_appwidget_settings_sync_off);
-            views.setImageViewResource(R.id.ind_sync, R.drawable.appwidget_settings_ind_off_c);
-        }
-        if (getGpsState(context)) {
-            views.setImageViewResource(R.id.img_gps, R.drawable.ic_appwidget_settings_gps_on);
-            views.setImageViewResource(R.id.ind_gps, R.drawable.appwidget_settings_ind_on_c);
-        } else {
-            views.setImageViewResource(R.id.img_gps, R.drawable.ic_appwidget_settings_gps_off);
-            views.setImageViewResource(R.id.ind_gps, R.drawable.appwidget_settings_ind_off_c);
-        }
-        switch (sBluetoothState.getTriState(context)) {
-            case STATE_DISABLED:
-                views.setImageViewResource(R.id.img_bluetooth,
-                                           R.drawable.ic_appwidget_settings_bluetooth_off);
-                views.setImageViewResource(R.id.ind_bluetooth,
-                                           R.drawable.appwidget_settings_ind_off_c);
-                break;
-            case STATE_ENABLED:
-                views.setImageViewResource(R.id.img_bluetooth,
-                                           R.drawable.ic_appwidget_settings_bluetooth_on);
-                views.setImageViewResource(R.id.ind_bluetooth,
-                                           R.drawable.appwidget_settings_ind_on_c);
-                break;
-            case STATE_INTERMEDIATE:
-                // In the transitional state, the bottom green bar
-                // shows the tri-state (on, off, transitioning), but
-                // the top dark-gray-or-bright-white logo shows the
-                // user's intent.  This is much easier to see in
-                // sunlight.
-                if (sBluetoothState.isTurningOn()) {
-                    views.setImageViewResource(R.id.img_bluetooth,
-                                               R.drawable.ic_appwidget_settings_bluetooth_on);
-                    views.setImageViewResource(R.id.ind_bluetooth,
-                                               R.drawable.appwidget_settings_ind_mid_c);
-                } else {
-                    views.setImageViewResource(R.id.img_bluetooth,
-                                               R.drawable.ic_appwidget_settings_bluetooth_off);
-                    views.setImageViewResource(R.id.ind_bluetooth,
-                                               R.drawable.appwidget_settings_ind_off_c);
-                }
-                break;
-        }
     }
 
     /**
@@ -565,10 +675,19 @@
     @Override
     public void onReceive(Context context, Intent intent) {
         super.onReceive(context, intent);
-        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
+        String action = intent.getAction();
+        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
             sWifiState.onActualStateChange(context, intent);
-        } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
+        } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
             sBluetoothState.onActualStateChange(context, intent);
+        } else if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(action)) {
+            sGpsState.onActualStateChange(context, intent);
+        } else if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
+            // Sadly, for lack of a "sync settings changed" intent,
+            // this is where we check where sync is enabled or not.
+            // It's not 100% reliable though as there are paths where
+            // this doesn't fire.
+            sSyncState.onActualStateChange(context, intent);
         } else if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
             Uri data = intent.getData();
             int buttonId = Integer.parseInt(data.getSchemeSpecificPart());
@@ -577,9 +696,9 @@
             } else if (buttonId == BUTTON_BRIGHTNESS) {
                 toggleBrightness(context);
             } else if (buttonId == BUTTON_SYNC) {
-                toggleSync(context);
+                sSyncState.toggleState(context);
             } else if (buttonId == BUTTON_GPS) {
-                toggleGps(context);
+                sGpsState.toggleState(context);
             } else if (buttonId == BUTTON_BLUETOOTH) {
                 sBluetoothState.toggleState(context);
             }
@@ -607,77 +726,6 @@
     }
 
     /**
-     * Gets the state of auto-sync.
-     *
-     * @param context
-     * @return true if enabled
-     */
-    private static boolean getSync(Context context) {
-        boolean backgroundData = getBackgroundDataState(context);
-        boolean sync = ContentResolver.getMasterSyncAutomatically();
-        return backgroundData && sync;
-    }
-
-    /**
-     * Toggle auto-sync
-     *
-     * @param context
-     */
-    private void toggleSync(Context context) {
-        ConnectivityManager connManager =
-                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        boolean backgroundData = getBackgroundDataState(context);
-        boolean sync = ContentResolver.getMasterSyncAutomatically();
-
-        // four cases to handle:
-        // setting toggled from off to on:
-        // 1. background data was off, sync was off: turn on both
-        if (!backgroundData && !sync) {
-            connManager.setBackgroundDataSetting(true);
-            ContentResolver.setMasterSyncAutomatically(true);
-        }
-
-        // 2. background data was off, sync was on: turn on background data
-        if (!backgroundData && sync) {
-            connManager.setBackgroundDataSetting(true);
-        }
-
-        // 3. background data was on, sync was off: turn on sync
-        if (backgroundData && !sync) {
-            ContentResolver.setMasterSyncAutomatically(true);
-        }
-
-        // setting toggled from on to off:
-        // 4. background data was on, sync was on: turn off sync
-        if (backgroundData && sync) {
-            ContentResolver.setMasterSyncAutomatically(false);
-        }
-    }
-
-    /**
-     * Gets the state of GPS location.
-     *
-     * @param context
-     * @return true if enabled.
-     */
-    private static boolean getGpsState(Context context) {
-        ContentResolver resolver = context.getContentResolver();
-        return Settings.Secure.isLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER);
-    }
-
-    /**
-     * Toggles the state of GPS.
-     *
-     * @param context
-     */
-    private void toggleGps(Context context) {
-        ContentResolver resolver = context.getContentResolver();
-        boolean enabled = getGpsState(context);
-        Settings.Secure.setLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER,
-                !enabled);
-    }
-
-    /**
      * Gets state of brightness.
      *
      * @param context
diff --git a/src/com/android/settings/wifi/WifiApSettings.java b/src/com/android/settings/wifi/WifiApSettings.java
index 0815238..ca1b856 100644
--- a/src/com/android/settings/wifi/WifiApSettings.java
+++ b/src/com/android/settings/wifi/WifiApSettings.java
@@ -120,18 +120,25 @@
 
         if (button == DialogInterface.BUTTON_POSITIVE) {
             mWifiConfig = mDialog.getConfig();
-            if(mWifiConfig != null) {
-                mWifiManager.setWifiApEnabled(mWifiConfig, true);
+            if (mWifiConfig != null) {
+                /**
+                 * if soft AP is running, bring up with new config
+                 * else update the configuration alone
+                 */
+                if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) {
+                    mWifiManager.setWifiApEnabled(mWifiConfig, true);
+                    /**
+                     * There is no tether notification on changing AP
+                     * configuration. Update status with new config.
+                     */
+                    mWifiApEnabler.updateConfigSummary(mWifiConfig);
+                } else {
+                    mWifiManager.setWifiApConfiguration(mWifiConfig);
+                }
                 mCreateNetwork.setSummary(String.format(getString(CONFIG_SUBTEXT),
                             mWifiConfig.SSID,
                             mWifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
                             mSecurityType[WPA_INDEX] : mSecurityType[OPEN_INDEX]));
-                /**
-                 * There is no tether notification on changing AP
-                 * configuration. Update status with new config.
-                 */
-                mWifiApEnabler.updateConfigSummary(mWifiConfig);
-
             }
         }
     }